diff --git a/tests/xapian_tests/tests/xapian_query.py b/tests/xapian_tests/tests/xapian_query.py index 05fdd6f..3b0c115 100644 --- a/tests/xapian_tests/tests/xapian_query.py +++ b/tests/xapian_tests/tests/xapian_query.py @@ -125,16 +125,21 @@ class XapianSearchQueryTestCase(TestCase): self.sq.add_filter(SQ(title__in=["Dune", "Jaws"])) self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query((why AND (XTITLEdune OR XTITLEjaws)))') + def test_build_query_not_in_filter_single_words(self): + self.sq.add_filter(SQ(content='why')) + self.sq.add_filter(~SQ(title__in=["Dune", "Jaws"])) + self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query((why AND ( AND_NOT (XTITLEdune OR XTITLEjaws))))') + def test_build_query_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 ((XTITLEa PHRASE 3 XTITLEfamous PHRASE 3 XTITLEpaper) OR (XTITLEan PHRASE 3 XTITLEinfamous PHRASE 3 XTITLEarticle))))') - # 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_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 ( AND_NOT ((XTITLEa PHRASE 3 XTITLEfamous PHRASE 3 XTITLEpaper) OR (XTITLEan PHRASE 3 XTITLEinfamous PHRASE 3 XTITLEarticle)))))') + # 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)])) diff --git a/xapian_backend.py b/xapian_backend.py index b4f2716..62ebb91 100755 --- a/xapian_backend.py +++ b/xapian_backend.py @@ -1003,7 +1003,10 @@ class SearchQuery(BaseSearchQuery): xapian.Query.OP_OR, self._term_query(value, field) ) ) - return xapian.Query(xapian.Query.OP_OR, query_list) + if is_not: + return xapian.Query(xapian.Query.OP_AND_NOT, self._all_query(), xapian.Query(xapian.Query.OP_OR, query_list)) + else: + return xapian.Query(xapian.Query.OP_OR, query_list) def _all_query(self): return xapian.Query('')