diff options
author | Sascha Silbe <sascha@silbe.org> | 2009-12-20 11:59:57 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-12-20 11:59:57 (GMT) |
commit | f3d3e1ecf17aceb7cbdf29b0ef14a7c970db14f3 (patch) | |
tree | 06904513f444382342b08c5dc73c5e87dda12e29 | |
parent | 0c0e0aa5bc070d19997ac99dbfb16a1966cf6fa9 (diff) |
add and use type information for "known" properties (#1437)
Bug #1342 has shown that it's necessary to know (and convert/check) the type
of known properties (as we need to use xapian.sortable_serialise() on numeric
types). This patch does that (but doesn't fix #1342 yet, that will be done on
top of it).
Signed-off-by: Sascha Silbe <sascha@silbe.org>
-rw-r--r-- | src/carquinyol/indexstore.py | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/carquinyol/indexstore.py b/src/carquinyol/indexstore.py index d390872..7c81cf6 100644 --- a/src/carquinyol/indexstore.py +++ b/src/carquinyol/indexstore.py @@ -56,7 +56,7 @@ _QUERY_TERM_MAP = { } _QUERY_VALUE_MAP = { - 'timestamp': _VALUE_TIMESTAMP, + 'timestamp': {'number': _VALUE_TIMESTAMP, 'type': float}, } @@ -132,33 +132,36 @@ class QueryParser (xapian.QueryParser): else: return Query(_PREFIX_NONE + str(value)) - def _parse_query_value_range(self, name, value, value_no): + def _parse_query_value_range(self, name, info, value): if len(value) != 2: raise TypeError( 'Only tuples of size 2 have a defined meaning. ' 'Did you mean to pass a list instead?') start, end = value - return Query(Query.OP_VALUE_RANGE, value_no, str(start), str(end)) + return Query(Query.OP_VALUE_RANGE, info['number'], + self._convert_value(info, start), self._convert_value(info, end)) - def _parse_query_value(self, name, value_no, value): + def _convert_value(self, info, value): + return str(info['type'](value)) + + def _parse_query_value(self, name, info, value): if isinstance(value, list): - subqueries = [self._parse_query_value(name, value_no, word) + subqueries = [self._parse_query_value(name, info, word) for word in value] return Query(Query.OP_OR, subqueries) elif isinstance(value, tuple): - return self._parse_query_value_range(name, value, value_no) + return self._parse_query_value_range(name, info, value) elif isinstance(value, dict): # compatibility option for timestamp: {'start': 0, 'end': 1} start = value.get('start', 0) end = value.get('end', sys.maxint) - return self._parse_query_value_range(name, (start, end), value_no) + return self._parse_query_value_range(name, info, (start, end)) else: - return Query(Query.OP_VALUE_RANGE, - _QUERY_VALUE_MAP[name], str(value), str(value)) + return self._parse_query_value_range(name, info, (value, value)) def _parse_query_xapian(self, query_str): try: |