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
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
def document_count(self): database = self.open() return reopen_if_modified(database)(lambda: database.get_doccount())()