Beispiel #1
0
    def _do_search(self, query, offset, limit, order_by, flags, stemming_lang,
                   filter, exclude, collapse_by, stopper):
        """
        flags are as defined in the Xapian API :
        http://www.xapian.org/docs/apidoc/html/classXapian_1_1QueryParser.html
        Combine multiple values with bitwise-or (|).
        """
        database = self._db.open()
        enquire = xapian.Enquire(database)

        #if order_by in (None, 'RELEVANCE'):
        if order_by is None or order_by[0] in (None, 'RELEVANCE'):
            enquire.set_sort_by_relevance()
        else:
            sort_reversed = False
            order_by, relevance_first = order_by
            if order_by.startswith('-'):
                sort_reversed = True

            if order_by[0] in '+-':
                order_by = order_by[1:]

            try:
                valueno = self.tag_index(order_by)
            except (ValueError, TypeError):
                raise ValueError("Field %s cannot be used in order_by clause"
                                 " because it doen't exist in index" %
                                 order_by)

            if relevance_first:
                enquire.set_sort_by_relevance_then_value(
                    valueno, sort_reversed)
            else:
                enquire.set_sort_by_value_then_relevance(
                    valueno, sort_reversed)

        if collapse_by:
            try:
                valueno = self.tag_index(collapse_by)
            except (ValueError, TypeError):
                raise ValueError("Field %s cannot be used in set_collapse_key"
                                 " because it doen't exist in index" %
                                 collapse_by)
            enquire.set_collapse_key(valueno)

        query, query_parser = self._parse_query(query, database, flags,
                                                stemming_lang, stopper)
        enquire.set_query(query)

        decider = self.decider(self._model, self.tags, filter, exclude)

        if limit is None:
            limit = self.document_count()

        return reopen_if_modified(database)(lambda: enquire.get_mset(
            offset, limit, None, decider))(), query, query_parser
Beispiel #2
0
    def _do_search(self, query, offset, limit, order_by, flags, stemming_lang,
                   filter, exclude, collapse_by, stopper, parse_query = True):
        """
        flags are as defined in the Xapian API :
        http://www.xapian.org/docs/apidoc/html/classXapian_1_1QueryParser.html
        Combine multiple values with bitwise-or (|).
        """
        database = self._db.open()
        enquire = xapian.Enquire(database)

        if order_by is None or order_by[0] in (None, 'RELEVANCE'):
            enquire.set_sort_by_relevance()
        else:
            sort_reversed = False
            order_by, relevance_first = order_by
            if order_by.startswith('-'):
                sort_reversed = True

            if order_by[0] in '+-':
                order_by = order_by[1:]

            try:
                valueno = self.tag_index(order_by)
            except (ValueError, TypeError):
                raise ValueError("Field %s cannot be used in order_by clause"
                                 " because it doen't exist in index" % order_by)

            if relevance_first:
                enquire.set_sort_by_relevance_then_value(valueno, sort_reversed)
            else:
                enquire.set_sort_by_value_then_relevance(valueno, sort_reversed)

        if collapse_by:
            try:
                valueno = self.tag_index(collapse_by)
            except (ValueError, TypeError):
                raise ValueError("Field %s cannot be used in set_collapse_key"
                                 " because it doen't exist in index" % collapse_by)
            enquire.set_collapse_key(valueno)

        if parse_query:
            query, query_parser = self._parse_query(query, database, flags, stemming_lang, stopper)
        else:
            query_parser = None

        enquire.set_query(query)

        decider = self.decider(self._model, self.tags, filter, exclude)

        if limit is None:
            limit = self.document_count()

        return reopen_if_modified(database)(
            lambda: enquire.get_mset(offset, limit, None, decider)
        )(), query, query_parser
Beispiel #3
0
 def document_count(self):
     database = self.open()
     return reopen_if_modified(database)(lambda: database.get_doccount())()
Beispiel #4
0
 def document_count(self):
     database = self.open()
     return reopen_if_modified(database)(lambda: database.get_doccount())()