diff options
author | Benjamin Saller <bcsaller@objectrealms.net> | 2007-07-20 21:41:11 (GMT) |
---|---|---|
committer | Benjamin Saller <bcsaller@objectrealms.net> | 2007-07-20 21:41:11 (GMT) |
commit | 71b0cfeef0c0edc6ce54a876fc356b4d3403735d (patch) | |
tree | 73116e3d62064d04be8663e4d2ab403fe1fed1da /src | |
parent | e30379af951e1fe12d362c47d589cab58f4ffa57 (diff) |
limited support for dateranges, this will have to expand to include all the types
Diffstat (limited to 'src')
-rw-r--r-- | src/olpc/datastore/utils.py | 11 | ||||
-rw-r--r-- | src/olpc/datastore/xapianindex.py | 17 |
2 files changed, 25 insertions, 3 deletions
diff --git a/src/olpc/datastore/utils.py b/src/olpc/datastore/utils.py index 711007e..0505463 100644 --- a/src/olpc/datastore/utils.py +++ b/src/olpc/datastore/utils.py @@ -110,7 +110,8 @@ def sanitize_dbus(method): return method(self, *n, **kw) return decorator -def timeparse(t, format): +DATEFORMAT = "%Y-%m-%dT%H:%M:%S" +def timeparse(t, format=DATEFORMAT): """Parse a time string that might contain fractions of a second. Fractional seconds are supported using a fragile, miserable hack. @@ -151,3 +152,11 @@ def timeparse(t, format): raise +def parse_timestamp_or_float(value): + result = None + try: + result = timeparse(value) + result = str(time.mktime(result.timetuple())) + except: + result = str(float(value)) + return result diff --git a/src/olpc/datastore/xapianindex.py b/src/olpc/datastore/xapianindex.py index 0be462d..a6f8994 100644 --- a/src/olpc/datastore/xapianindex.py +++ b/src/olpc/datastore/xapianindex.py @@ -25,7 +25,7 @@ import secore from olpc.datastore import model from olpc.datastore.converter import converter -from olpc.datastore.utils import create_uid +from olpc.datastore.utils import create_uid, parse_timestamp_or_float # Setup Logger @@ -349,7 +349,20 @@ class IndexManager(object): else: # each term becomes part of the query join for k, v in query.iteritems(): - queries.append(ri.query_field(k, v)) + if isinstance(v, dict): + # it might be a range scan + # this needs to be factored out + # and/or we need client side lib that helps + # issue queries because there are type + # conversion issues here + start = v.pop('start', 0) + end = v.pop('end', sys.maxint) + start = parse_timestamp_or_float(start) + end = parse_timestamp_or_float(end) + queries.append(ri.query_range(k, start, end)) + else: + queries.append(ri.query_field(k, v)) + q = ri.query_composite(ri.OP_AND, queries) else: q = self.parse_query(query) |