From 60f4661ada627b64085baee14adfd6167a9e8f77 Mon Sep 17 00:00:00 2001 From: David Sauve Date: Wed, 21 Oct 2009 16:20:17 -0400 Subject: [PATCH] More changes to build_query --- xapian_backend.py | 50 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/xapian_backend.py b/xapian_backend.py index dc19d3e..b8b5ffe 100755 --- a/xapian_backend.py +++ b/xapian_backend.py @@ -934,11 +934,9 @@ class SearchQuery(BaseSearchQuery): self.backend = backend or SearchBackend() def build_query(self): - if not self.query_filter: - return xapian.Query('') - values = [] - + + return final_query for child in self.query_filter.children: if isinstance(child, self.query_filter.__class__): print 'SQ: ', child # TODO: Recursive call down tree... @@ -946,9 +944,49 @@ class SearchQuery(BaseSearchQuery): expression, value = child field, filter_type = self.query_filter.split_expression(expression) values.append(value) - + return xapian.Query(xapian.Query.OP_AND, values) - + + def build_query_fragment(self, field, filter_type, value): + """ + Builds a search query fragment from a field, filter type and value. + Returns: + A query string fragment suitable for parsing by Xapian. + """ + result = '' + + if not isinstance(value, (list, tuple)): + # Convert whatever we find to what xapian wants. + value = self.backend._marshal_value(value) + + # Check to see if it's a phrase for an exact match. + if ' ' in value: + value = '"%s"' % value + + # 'content' is a special reserved word, much like 'pk' in + # Django's ORM layer. It indicates 'no special field'. + if field == 'content': + result = value + else: + filter_types = { + 'exact': '%s:%s', + 'gte': '%s:%s..*', + 'gt': 'NOT %s:..%s', + 'lte': '%s:..%s', + 'lt': 'NOT %s:%s..*', + 'startswith': '%s:%s*', + } + + if filter_type != 'in': + result = filter_types[filter_type] % (field, value) + else: + in_options = [] + for possible_value in value: + in_options.append('%s:%s' % (field, possible_value)) + result = '(%s)' % ' OR '.join(in_options) + + return result + def run(self, spelling_query=None): """ Builds and executes the query. Returns a list of search results.