def build_database_filter(self, query=None, boost=1.0): if query is None: query = self.query if isinstance(query, PlainText): self.check_boost(query, boost=boost) operator = self.OPERATORS[query.operator] return operator([ self.build_single_term_filter(term) for term in query.query_string.split() ]) if isinstance(query, Boost): boost *= query.boost return self.build_database_filter(query.subquery, boost=boost) if isinstance(self.query, MatchAll): return models.Q() if isinstance(query, Not): return ~self.build_database_filter(query.subquery, boost=boost) if isinstance(query, And): return AND( self.build_database_filter(subquery, boost=boost) for subquery in query.subqueries) if isinstance(query, Or): return OR( self.build_database_filter(subquery, boost=boost) for subquery in query.subqueries) raise NotImplementedError( "`%s` is not supported by the database search backend." % query.__class__.__name__)
def build_database_query(self, query=None, config=None): if query is None: query = self.query if isinstance(query, SearchQueryShortcut): return self.build_database_query(query.get_equivalent(), config) if isinstance(query, Prefix): self.check_boost(query) self.is_autocomplete = True return PostgresSearchAutocomplete(unidecode(query.prefix), config=config) if isinstance(query, Term): self.check_boost(query) return PostgresSearchQuery(unidecode(query.term), config=config) if isinstance(query, Not): return ~self.build_database_query(query.subquery, config) if isinstance(query, And): return AND( self.build_database_query(subquery, config) for subquery in query.subqueries) if isinstance(query, Or): return OR( self.build_database_query(subquery, config) for subquery in query.subqueries) raise NotImplementedError( '`%s` is not supported by the PostgreSQL search backend.' % self.query.__class__.__name__)
def build_database_query(self, query=None, config=None): if query is None: query = self.query if isinstance(query, SearchQueryShortcut): return self.build_database_query(query.get_equivalent(), config) if isinstance(query, Term): # TODO: Find a way to use the term boosting. if query.boost != 1: warn('PostgreSQL search backend ' 'does not support term boosting for now.') return PostgresSearchQuery(unidecode(query.term), config=config) if isinstance(query, Not): return ~self.build_database_query(query.subquery, config) if isinstance(query, And): return AND( self.build_database_query(subquery, config) for subquery in query.subqueries) if isinstance(query, Or): return OR( self.build_database_query(subquery, config) for subquery in query.subqueries) raise NotImplementedError( '`%s` is not supported by the PostgreSQL search backend.' % self.query.__class__.__name__)
def build_database_filter(self, query=None): if query is None: query = self.query if isinstance(self.query, MatchAll): return models.Q() if isinstance(query, SearchQueryShortcut): return self.build_database_filter(query.get_equivalent()) if isinstance(query, Term): self.check_boost(query) return self.build_single_term_filter(query.term) if isinstance(query, Prefix): self.check_boost(query) return self.build_single_term_filter(query.prefix) if isinstance(query, Not): return ~self.build_database_filter(query.subquery) if isinstance(query, And): return AND( self.build_database_filter(subquery) for subquery in query.subqueries) if isinstance(query, Or): return OR( self.build_database_filter(subquery) for subquery in query.subqueries) raise NotImplementedError( '`%s` is not supported by the database search backend.' % self.query.__class__.__name__)
def build_database_query(self, query=None, config=None, boost=1.0): if query is None: query = self.query if isinstance(query, PlainText): self.check_boost(query, boost=boost) operator = self.OPERATORS[query.operator] return operator([ PostgresSearchQuery(unidecode(term), config=config) for term in query.query_string.split() ]) if isinstance(query, Boost): boost *= query.boost return self.build_database_query(query.subquery, config, boost=boost) if isinstance(query, Not): return ~self.build_database_query(query.subquery, config, boost=boost) if isinstance(query, And): return AND(self.build_database_query(subquery, config, boost=boost) for subquery in query.subqueries) if isinstance(query, Or): return OR(self.build_database_query(subquery, config, boost=boost) for subquery in query.subqueries) raise NotImplementedError( '`%s` is not supported by the PostgreSQL search backend.' % query.__class__.__name__)
def _connect_filters(self, filters, connector, negated): if connector == "AND": q = models.Q(*filters) elif connector == "OR": q = OR([models.Q(fil) for fil in filters]) else: return if negated: q = ~q return q
def _connect_filters(self, filters, connector, negated): if connector == 'AND': q = Q(*filters) elif connector == 'OR': q = OR([Q(fil) for fil in filters]) else: return if negated: q = ~q return q
def _connect_filters(self, filters, connector, negated): # TODO whooshify if connector == "AND": q = Q(*filters) elif connector == "OR": q = OR([Q(fil) for fil in filters]) else: return if negated: q = ~q return q
def _connect_filters(self, filters, connector, negated): # Also borrowed from wagtail-whoosh if connector == 'AND': q = Q(*filters) elif connector == 'OR': q = OR([Q(fil) for fil in filters]) else: return if negated: q = ~q return q
def build_database_filter(self, query, boost=1.0): if isinstance(query, PlainText): self.check_boost(query, boost=boost) operator = self.OPERATORS[query.operator] return operator( [ self.build_single_term_filter(term) for term in query.query_string.split() ] ) if isinstance(query, Phrase): q = models.Q() for field_name in self.fields_names: q |= models.Q(**{field_name + "__icontains": query.query_string}) return q if isinstance(query, Boost): boost *= query.boost return self.build_database_filter(query.subquery, boost=boost) if isinstance(query, MatchAll): return MATCH_ALL if isinstance(query, Not): q = self.build_database_filter(query.subquery, boost=boost) if q == MATCH_ALL: return MATCH_NONE elif q == MATCH_NONE: return MATCH_ALL else: return ~q if isinstance(query, And): subqueries = [ self.build_database_filter(subquery, boost=boost) for subquery in query.subqueries ] # If there's a MATCH_NONE, return MATCH_NONE if MATCH_NONE in subqueries: return MATCH_NONE # Ignore MATCH_ALL subqueries = [q for q in subqueries if q != MATCH_ALL] return AND(subqueries) if isinstance(query, Or): subqueries = [ self.build_database_filter(subquery, boost=boost) for subquery in query.subqueries ] # If there's a MATCH_ALL, return MATCH_ALL if MATCH_ALL in subqueries: return MATCH_ALL # Ignore MATCH_NONE subqueries = [q for q in subqueries if q != MATCH_NONE] return OR(subqueries) raise NotImplementedError( "`%s` is not supported by the database search backend." % query.__class__.__name__ )