Exemplo n.º 1
0
 def testQueryParser(self):
     """ search: test the query parser """
     parser = QueryParser()
     for query, wanted in [
             # Even a single term is a and expression (this is needed for xapian because it
             # only has AND_NOT, but not a simple NOT).  This is why we have many many brackets here.
         ("a", '["a"]'),
         ("-a", '[-"a"]'),
         ("a b", '["a" "b"]'),
         ("a -b c", '["a" -"b" "c"]'),
         ("aaa bbb -ccc", '["aaa" "bbb" -"ccc"]'),
         ("title:aaa title:bbb -title:ccc",
          '[title:"aaa" title:"bbb" -title:"ccc"]'),
         ("title:case:aaa title:re:bbb -title:re:case:ccc",
          '[title:case:"aaa" title:re:"bbb" -title:re:case:"ccc"]'),
         ("linkto:aaa", '[linkto:"aaa"]'),
         ("category:aaa", '[category:"aaa"]'),
         ("domain:aaa", '[domain:"aaa"]'),
         ("re:case:title:aaa", '[title:re:case:"aaa"]'),
         ("(aaa or bbb) and (ccc or ddd)",
          '[[[["aaa"] or ["bbb"]]] [[["ccc"] or ["ddd"]]]]'),
         ("(aaa or bbb) (ccc or ddd)",
          '[[[["aaa"] or ["bbb"]]] [[["ccc"] or ["ddd"]]]]'),
         ("aaa or bbb", '[[["aaa"] or ["bbb"]]]'),
         ("aaa or bbb or ccc", '[[["aaa"] or [[["bbb"] or ["ccc"]]]]]'),
         ("aaa or bbb and ccc", '[[["aaa"] or ["bbb" "ccc"]]]'),
         ("aaa and bbb or ccc", '[[["aaa" "bbb"] or ["ccc"]]]'),
         ("aaa and bbb and ccc", '["aaa" "bbb" "ccc"]'),
         ("aaa or bbb and ccc or ddd",
          '[[["aaa"] or [[["bbb" "ccc"] or ["ddd"]]]]]'),
         ("aaa or bbb ccc or ddd",
          '[[["aaa"] or [[["bbb" "ccc"] or ["ddd"]]]]]'),
         ("(HelpOn) (Administration)", '[["HelpOn"] ["Administration"]]'),
         ("(HelpOn) (-Administration)", '[["HelpOn"] [-"Administration"]]'),
         ("(HelpOn) and (-Administration)",
          '[["HelpOn"] [-"Administration"]]'),
         ("(HelpOn) and (Administration) or (Configuration)",
          '[[[["HelpOn"] ["Administration"]] or [["Configuration"]]]]'),
         ("(a) and (b) or (c) or -d",
          '[[[["a"] ["b"]] or [[[["c"]] or [-"d"]]]]]'),
         ("a b c d e or f g h",
          '[[["a" "b" "c" "d" "e"] or ["f" "g" "h"]]]'),
         ('"no', '[""no"]'),
         ('no"', '["no""]'),
         ("'no", "[\"'no\"]"),
         ("no'", "[\"no'\"]"),
         ('"no\'', '[""no\'"]')
     ]:
         result = parser.parse_query(query)
         assert str(result) == wanted
Exemplo n.º 2
0
    def test_xapian_term(self):
        parser = QueryParser()
        connection = self.get_moin_search_connection()

        prefixes = {
            u'': ([u'', u're:', u'case:', u'case:re:'], u'SearchTestPage'),
            u'title:': ([u'', u're:', u'case:',
                         u'case:re:'], u'SearchTestPage'),
            u'linkto:': ([u'', u're:', u'case:', u'case:re:'], u'FrontPage'),
            u'category:': ([u'', u're:', u'case:',
                            u'case:re:'], u'CategoryHomepage'),
            u'mimetype:': ([u'', u're:'], u'text/wiki'),
            u'language:': ([u''], u'en'),
            u'domain:': ([u''], u'system'),
        }

        def test_query(query):
            query_ = parser.parse_query(query).xapian_term(
                self.request, connection)
            print str(query_)
            assert not query_.empty()

        for prefix, data in prefixes.iteritems():
            modifiers, term = data
            for modifier in modifiers:
                query = ''.join([prefix, modifier, term])
                yield query, test_query, query
Exemplo n.º 3
0
 def testQueryParser(self):
     """ search: test the query parser """
     parser = QueryParser()
     for query, wanted in [
         # Even a single term is a and expression (this is needed for xapian because it
         # only has AND_NOT, but not a simple NOT).  This is why we have many many brackets here.
         ("a", '["a"]'),
         ("-a", '[-"a"]'),
         ("a b", '["a" "b"]'),
         ("a -b c", '["a" -"b" "c"]'),
         ("aaa bbb -ccc", '["aaa" "bbb" -"ccc"]'),
         ("title:aaa title:bbb -title:ccc", '[title:"aaa" title:"bbb" -title:"ccc"]'),
         (
             "title:case:aaa title:re:bbb -title:re:case:ccc",
             '[title:case:"aaa" title:re:"bbb" -title:re:case:"ccc"]',
         ),
         ("linkto:aaa", '[linkto:"aaa"]'),
         ("category:aaa", '[category:"aaa"]'),
         ("domain:aaa", '[domain:"aaa"]'),
         ("re:case:title:aaa", '[title:re:case:"aaa"]'),
         ("(aaa or bbb) and (ccc or ddd)", '[[[["aaa"] or ["bbb"]]] [[["ccc"] or ["ddd"]]]]'),
         ("(aaa or bbb) (ccc or ddd)", '[[[["aaa"] or ["bbb"]]] [[["ccc"] or ["ddd"]]]]'),
         ("aaa or bbb", '[[["aaa"] or ["bbb"]]]'),
         ("aaa or bbb or ccc", '[[["aaa"] or [[["bbb"] or ["ccc"]]]]]'),
         ("aaa or bbb and ccc", '[[["aaa"] or ["bbb" "ccc"]]]'),
         ("aaa and bbb or ccc", '[[["aaa" "bbb"] or ["ccc"]]]'),
         ("aaa and bbb and ccc", '["aaa" "bbb" "ccc"]'),
         ("aaa or bbb and ccc or ddd", '[[["aaa"] or [[["bbb" "ccc"] or ["ddd"]]]]]'),
         ("aaa or bbb ccc or ddd", '[[["aaa"] or [[["bbb" "ccc"] or ["ddd"]]]]]'),
         ("(HelpOn) (Administration)", '[["HelpOn"] ["Administration"]]'),
         ("(HelpOn) (-Administration)", '[["HelpOn"] [-"Administration"]]'),
         ("(HelpOn) and (-Administration)", '[["HelpOn"] [-"Administration"]]'),
         (
             "(HelpOn) and (Administration) or (Configuration)",
             '[[[["HelpOn"] ["Administration"]] or [["Configuration"]]]]',
         ),
         ("(a) and (b) or (c) or -d", '[[[["a"] ["b"]] or [[[["c"]] or [-"d"]]]]]'),
         ("a b c d e or f g h", '[[["a" "b" "c" "d" "e"] or ["f" "g" "h"]]]'),
         ('"no', '[""no"]'),
         ('no"', '["no""]'),
         ("'no", '["\'no"]'),
         ("no'", '["no\'"]'),
         ("\"no'", '[""no\'"]'),
     ]:
         result = parser.parse_query(query)
         assert str(result) == wanted
Exemplo n.º 4
0
 def test_title_search(self):
     expected_pages = set([
         'FrontPage',
     ])
     query = QueryParser(titlesearch=True).parse_query('FrontPage')
     result = self.search(query)
     found_pages = set([hit.page_name for hit in result.hits])
     assert found_pages == expected_pages
Exemplo n.º 5
0
    def testQueryParserExceptions(self):
        """ search: test the query parser """
        parser = QueryParser()

        def _test(q):
            py.test.raises(QueryError, parser.parse_query, q)

        for query in ['""', '(', ')', '(a or b']:
            yield _test, query
Exemplo n.º 6
0
    def search(self, query):
        if isinstance(query, str) or isinstance(query, unicode):
            query = QueryParser().parse_query(query)

        return self.get_searcher(query).run()
Exemplo n.º 7
0
def _parse_query(query, **kw):
    if isinstance(query, str) or isinstance(query, unicode):
        query = QueryParser(**kw).parse_query(query)

    return query