def _parse_reserved_filters(self, search_term): """ Support github-like filters for narrowing the results. Order of chunks does not matter, only recognized filter names are allowed. :param search_term: the original search str from user input :returns allow_query: whoosh Query object used for filtering results of searching in index :returns search_term_without_filters: str that represents user's search phrase without the filters >>> rs = RepoSearch() >>> rs._parse_reserved_filters("category:assembly") (And([Term('categories', 'assembly')]), '') >>> rs._parse_reserved_filters("category:assembly abyss") (And([Term('categories', 'assembly')]), 'abyss') >>> rs._parse_reserved_filters("category:'Climate Analysis' psy_maps") (And([Term('categories', 'Climate Analysis')]), 'psy_maps') >>> rs._parse_reserved_filters("climate category:'Climate Analysis' owner:'bjoern gruening' psy_maps") (And([Term('categories', 'Climate Analysis'), Term('repo_owner_username', 'bjoern gruening')]), 'climate psy_maps') >>> rs._parse_reserved_filters("climate category:'John Says This Fails' owner:'bjoern gruening' psy_maps") (And([Term('categories', 'John Says This Fails'), Term('repo_owner_username', 'bjoern gruening')]), 'climate psy_maps') >>> rs._parse_reserved_filters("climate o:'bjoern gruening' middle strings c:'John Says This Fails' psy_maps") (And([Term('repo_owner_username', 'bjoern gruening'), Term('categories', 'John Says This Fails')]), 'climate middle strings psy_maps') >>> rs._parse_reserved_filters("abyss category:assembly") (And([Term('categories', 'assembly')]), 'abyss') >>> rs._parse_reserved_filters("abyss category:assembly greg") (And([Term('categories', 'assembly')]), 'abyss greg') >>> rs._parse_reserved_filters("owner:greg") (And([Term('repo_owner_username', 'greg')]), '') >>> rs._parse_reserved_filters("owner:greg category:assembly abyss") (And([Term('repo_owner_username', 'greg'), Term('categories', 'assembly')]), 'abyss') >>> rs._parse_reserved_filters("meaningoflife:42") (None, 'meaningoflife:42') """ filters = { "category": "categories", "c": "categories", "owner": "repo_owner_username", "o": "repo_owner_username", } allow_query, search_term_without_filters = parse_filters( search_term, filters) allow_query = And([Term(t, v) for (t, v) in allow_query] if len(allow_query) > 0 else None) if allow_query else None return allow_query, search_term_without_filters
def parse_search_kwds(search_query): filters = { "organization": "organization", "o": "organization", "name": "name", "n": "name", } keyed_terms, description_term = parse_filters(search_query, filters) query_kwd = { "toolClass": "Workflow", "descriptorType": "GALAXY", } if description_term and description_term.strip(): query_kwd["description"] = description_term, if keyed_terms is not None: for (key, value) in keyed_terms: query_kwd[key] = value return query_kwd