def test_fieldnames(): p = default.QueryParser("t", None, [plugins.WhitespacePlugin(), plugins.FieldsPlugin(), plugins.GroupPlugin()]) ns = p.process("a:b c d:(e f:(g h)) i j:") assert_equal(repr(ns), "<AndGroup <'a':'b'>, <None:'c'>, <AndGroup <'d':'e'>, <AndGroup <'f':'g'>, <'f':'h'>>>, <None:'i'>, <None:'j:'>>") assert_equal(repr(p.process("a:b:")), "<AndGroup <'a':'b:'>>")
def build_keywords_query(keywords): """ Build parsers for a query. :param MultiDict keywords: The search texts keyed by scope key. If empty, the query will match every documents. """ queries = [] if keywords: composer = current_app.config['KERKO_COMPOSER'] text_plugins = [ plugins.PhrasePlugin(), plugins.GroupPlugin(), plugins.OperatorsPlugin( And=r"(?<=\s)" + re.escape(gettext("AND")) + r"(?=\s)", Or=r"(?<=\s)" + re.escape(gettext("OR")) + r"(?=\s)", Not=r"(^|(?<=(\s|[()])))" + re.escape(gettext("NOT")) + r"(?=\s)", AndNot=None, AndMaybe=None, Require=None ), plugins.BoostPlugin(), ] for key, value in keywords.items(multi=True): fields = [spec.key for spec in composer.fields.values() if key in spec.scopes] if not fields: raise KeyError # No known field for that scope key. parser = MultifieldParser( fields, schema=composer.schema, plugins=text_plugins ) queries.append(parser.parse(value)) else: queries.append(Every()) return And(queries)
def test_groups(): p = default.QueryParser("t", None, [plugins.WhitespacePlugin(), plugins.GroupPlugin()]) ns = p.process("a ((b c) d) e") assert_equal(repr(ns), "<AndGroup <None:'a'>, <AndGroup <AndGroup <None:'b'>, " + "<None:'c'>>, <None:'d'>>, <None:'e'>>")
def _query_parser_plugins(self): return [ plugins.WhitespacePlugin(), plugins.SingleQuotePlugin(), plugins.FieldsPlugin(), plugins.PrefixPlugin(), plugins.GroupPlugin(), plugins.OperatorsPlugin(), plugins.BoostPlugin()]
def test_boost(): p = default.QueryParser("t", None, [plugins.WhitespacePlugin(), plugins.GroupPlugin(), plugins.BoostPlugin()]) ns = p.tag("a^3") assert_equal(repr(ns), "<AndGroup <None:'a'>, <^ 3.0>>") ns = p.filterize(ns) assert_equal(repr(ns), "<AndGroup <None:'a' ^3.0>>") assert_equal(repr(p.process("a (b c)^2.5")), "<AndGroup <None:'a'>, <AndGroup <None:'b'>, <None:'c'> ^2.5>>") assert_equal(repr(p.process("a (b c)^.5 d")), "<AndGroup <None:'a'>, <AndGroup <None:'b'>, <None:'c'> ^0.5>, <None:'d'>>") assert_equal(repr(p.process("^2 a")), "<AndGroup <None:'^2'>, <None:'a'>>") assert_equal(repr(p.process("a^2^3")), "<AndGroup <None:'a^2' ^3.0>>")
def default_set(self): """Returns the default list of plugins to use. """ from whoosh.qparser import plugins return [plugins.WhitespacePlugin(), plugins.SingleQuotePlugin(), plugins.FieldsPlugin(), plugins.WildcardPlugin(), plugins.PhrasePlugin(), plugins.RangePlugin(), plugins.GroupPlugin(), plugins.OperatorsPlugin(), plugins.BoostPlugin(), plugins.EveryPlugin(), ]
def test_groups_with_range(): p = default.QueryParser("t", None, [ plugins.FieldsPlugin(), plugins.GtLtPlugin(), plugins.GroupPlugin(), plugins.OperatorsPlugin(), plugins.PhrasePlugin(), plugins.RangePlugin(), plugins.RegexPlugin() ]) ns = p.process('a:b OR e:>=5 g:<6') assert repr( ns ) == "<AndGroup <OrGroup <'a':'b'>, <'e':['5' None]>>, <'g':[None '6'}>>" ns = p.process('a:b OR (e:>=5 g:<6)') assert repr( ns ) == "<AndGroup <OrGroup <'a':'b'>, <AndGroup <'e':['5' None]>, <'g':[None '6'}>>>>"