Small refactor to make 'exact'more DRY

This commit is contained in:
David Sauve 2009-11-30 16:34:40 -05:00
parent 99de351c79
commit 2065ecee7f
2 changed files with 26 additions and 21 deletions

View file

@ -125,6 +125,11 @@ class XapianSearchQueryTestCase(TestCase):
self.sq.add_filter(SQ(title__in=["A Famous Paper", "An Infamous Article"]))
self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query((why AND (XTITLEa famous paper OR XTITLEan infamous article)))')
# def test_build_query_not_in_filter_multiple_words(self):
# self.sq.add_filter(SQ(content='why'))
# self.sq.add_filter(~SQ(title__in=["A Famous Paper", "An Infamous Article"]))
# self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query((why AND_NOT (XTITLEa famous paper OR XTITLEan infamous article)))')
# def test_build_query_in_filter_datetime(self):
# self.sq.add_filter(SQ(content='why'))
# self.sq.add_filter(SQ(pub_date__in=[datetime.datetime(2009, 7, 6, 1, 56, 21)]))

View file

@ -962,33 +962,25 @@ class SearchQuery(BaseSearchQuery):
else:
if filter_type == 'exact':
if ' ' in value:
phrase_query = xapian.Query(
xapian.Query.OP_PHRASE, [
'%s%s%s' % (
DOCUMENT_CUSTOM_TERM_PREFIX,
field.upper(), _marshal_value(term)
) for term in value.split()
]
)
if is_not:
query_list.append(
xapian.Query(
xapian.Query.OP_AND_NOT,
xapian.Query(''),
xapian.Query(
xapian.Query.OP_PHRASE, [
'%s%s%s' % (
DOCUMENT_CUSTOM_TERM_PREFIX,
field.upper(),
_marshal_value(term)
) for term in value.split()
]
)
phrase_query
)
)
else:
query_list.append(
xapian.Query(
xapian.Query.OP_PHRASE, [
'%s%s%s' % (
DOCUMENT_CUSTOM_TERM_PREFIX,
field.upper(), value
) for term in value.split()
]
)
)
query_list.append(phrase_query)
else:
if is_not:
query_list.append(
@ -1021,10 +1013,18 @@ class SearchQuery(BaseSearchQuery):
elif filter_type == 'in':
query_list.append(
xapian.Query(
xapian.Query.OP_OR, [xapian.Query('%s%s%s' % (DOCUMENT_CUSTOM_TERM_PREFIX, field.upper(), _marshal_value(possible_value))) for possible_value in value]
xapian.Query.OP_OR, [
xapian.Query(
'%s%s%s' % (
DOCUMENT_CUSTOM_TERM_PREFIX,
field.upper(),
_marshal_value(possible_value)
)
) for possible_value in value
]
)
)
if search_node.connector == 'OR':
return xapian.Query(xapian.Query.OP_OR, query_list)