Beispiel #1
0
    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__)
Beispiel #2
0
    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__)
Beispiel #3
0
    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__)
Beispiel #4
0
    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__)
Beispiel #5
0
    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__)
Beispiel #6
0
    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
Beispiel #7
0
    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
Beispiel #8
0
    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
Beispiel #9
0
    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
Beispiel #10
0
    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__
        )