class TestQueryEngine(unittest.TestCase): def setUp(self): self.lexicon = Lexicon(Splitter()) self.parser = QueryParser(self.lexicon) self.index = FauxIndex() def compareSet(self, set, dict): d = {} for k, v in set.items(): d[k] = v self.assertEqual(d, dict) def compareQuery(self, query, dict): tree = self.parser.parseQuery(query) set = tree.executeQuery(self.index) self.compareSet(set, dict) def testExecuteQuery(self): self.compareQuery("foo AND bar", {1: 2}) self.compareQuery("foo OR bar", {1: 2, 2: 1, 3:1}) self.compareQuery("foo AND NOT bar", {3: 1}) self.compareQuery("foo AND foo AND foo", {1: 3, 3: 3}) self.compareQuery("foo OR foo OR foo", {1: 3, 3: 3}) self.compareQuery("ham AND NOT foo AND NOT bar", {4: 1}) self.compareQuery("ham OR foo OR bar", {1: 3, 2: 2, 3: 2, 4: 1}) self.compareQuery("ham AND foo AND bar", {1: 3}) def testInvalidQuery(self): from zope.index.text.parsetree import NotNode, AtomNode tree = NotNode(AtomNode("foo")) self.assertRaises(QueryError, tree.executeQuery, self.index)
def _makeIndexAndParser(self): from zope.index.text.lexicon import Lexicon from zope.index.text.lexicon import Splitter from zope.index.text.queryparser import QueryParser lexicon = Lexicon(Splitter()) parser = QueryParser(lexicon) index = FauxIndex() return index, parser
class TestQueryParserBase(TestCase): def setUp(self): self.lexicon = Lexicon(Splitter()) self.parser = QueryParser(self.lexicon) def expect(self, input, output, expected_ignored=[]): tree = self.parser.parseQuery(input) ignored = self.parser.getIgnored() self.compareParseTrees(tree, output) self.assertEqual(ignored, expected_ignored) # Check that parseQueryEx() == (parseQuery(), getIgnored()) ex_tree, ex_ignored = self.parser.parseQueryEx(input) self.compareParseTrees(ex_tree, tree) self.assertEqual(ex_ignored, expected_ignored) def failure(self, input): self.assertRaises(ParseError, self.parser.parseQuery, input) self.assertRaises(ParseError, self.parser.parseQueryEx, input) def compareParseTrees(self, got, expected, msg=None): if msg is None: msg = repr(got) self.assertEqual(isinstance(got, ParseTreeNode), 1) self.assertEqual(got.__class__, expected.__class__, msg) if isinstance(got, PhraseNode): self.assertEqual(got.nodeType(), "PHRASE", msg) self.assertEqual(got.getValue(), expected.getValue(), msg) elif isinstance(got, GlobNode): self.assertEqual(got.nodeType(), "GLOB", msg) self.assertEqual(got.getValue(), expected.getValue(), msg) elif isinstance(got, AtomNode): self.assertEqual(got.nodeType(), "ATOM", msg) self.assertEqual(got.getValue(), expected.getValue(), msg) elif isinstance(got, NotNode): self.assertEqual(got.nodeType(), "NOT") self.compareParseTrees(got.getValue(), expected.getValue(), msg) elif isinstance(got, AndNode) or isinstance(got, OrNode): self.assertEqual(got.nodeType(), isinstance(got, AndNode) and "AND" or "OR", msg) list1 = got.getValue() list2 = expected.getValue() self.assertEqual(len(list1), len(list2), msg) for i in range(len(list1)): self.compareParseTrees(list1[i], list2[i], msg)
def apply(self, querytext, start=0, count=None): parser = QueryParser(self.lexicon) tree = parser.parseQuery(querytext) results = tree.executeQuery(self.index) if results: qw = self.index.query_weight(tree.terms()) # Hack to avoid ZeroDivisionError if qw == 0: qw = 1.0 qw *= 1.0 for docid, score in six.iteritems(results): try: results[docid] = score/qw except TypeError: # We overflowed the score, perhaps wildly unlikely. # Who knows. results[docid] = 2**64 // 10 return results
def apply(self, querytext, start=0, count=None): parser = QueryParser(self.lexicon) tree = parser.parseQuery(querytext) results = tree.executeQuery(self.index) if results: qw = self.index.query_weight(tree.terms()) # Hack to avoid ZeroDivisionError if qw == 0: qw = 1.0 qw *= 1.0 for docid, score in six.iteritems(results): try: results[docid] = score / qw except TypeError: # We overflowed the score, perhaps wildly unlikely. # Who knows. results[docid] = 2**64 // 10 return results
def setUp(self): self.lexicon = Lexicon(Splitter()) self.parser = QueryParser(self.lexicon)
def setUp(self): self.lexicon = Lexicon(Splitter()) self.parser = QueryParser(self.lexicon) self.index = FauxIndex()