60 #include <unordered_set> 81 #if (defined(__i386__) && !defined(__SSE_MATH__)) || \ 82 defined(__mc68000__) || defined(__mc68010__) || \ 83 defined(__mc68020__) || defined(__mc68030__) 106 return a_max_wt > b_max_wt;
144 void shrink(
size_t new_size);
150 pls.reserve(reserve);
157 if (new_size >=
pls.size())
160 for (
auto&& i =
pls.begin() + new_size; i !=
pls.end(); ++i) {
163 pls.resize(new_size);
177 void select_elite_set(
size_t set_size,
size_t out_of);
180 void select_most_frequent(
size_t set_size);
191 auto begin =
pls.begin() +
pls.size() - out_of;
192 for (
auto i = begin; i !=
pls.end(); ++i) {
193 (*i)->recalc_maxweight();
202 vector<PostList*>::iterator begin =
pls.begin();
203 nth_element(begin, begin + set_size - 1,
pls.end(),
213 if (
pls.size() == 1) {
243 if (
pls.size() == 1) {
259 if (
pls.size() == 1) {
308 : op_(op__), begin(begin_), end(end_), window(window_) { }
347 vector<PostList *>::const_iterator terms_begin =
pls.begin() + begin;
348 vector<PostList *>::const_iterator terms_end =
pls.begin() + end;
351 pl =
new NearPostList(pl, window, terms_begin, terms_end);
352 }
else if (window == end - begin) {
371 size_t end =
pls.size();
372 size_t begin = end - n_subqs;
373 pos_filters.push_back(
PosFilter(op_, begin, end, window));
382 Assert(pos_filters.empty());
393 PostList* rhs = not_ctx->postlist();
394 pl.reset(
new AndNotPostList(pl.release(), rhs, matcher, db_size));
403 for (
const PosFilter& filter : pos_filters) {
404 pl.reset(filter.postlist(pl.release(),
pls));
411 PostList* rhs = maybe_ctx->postlist();
452 unsigned char ch = *(*p)++;
454 case 4:
case 5:
case 6:
case 7: {
460 size_t n_subqs = ch & 0x07;
465 unsigned char code = (ch >> 3) & 0x0f;
527 size_t len = ch & 0x0f;
532 if (
size_t(end - *p) < len)
534 string term(*p, len);
537 int code = ((ch >> 4) & 0x03);
564 string begin(*p, len);
573 string end_(*p, len);
594 int max_type =
static_cast<unsigned char>(*(*p)++);
595 op combiner =
static_cast<op>(*(*p)++);
598 string pattern(*p, len);
608 string name(*p, len);
613 string m =
"PostingSource ";
615 m +=
" not registered";
629 return new QueryScaleWeight(scale_factor,
630 Query(unserialise(p, end, reg)));
647 string msg =
"Unknown Query serialisation: ";
689 desc =
"<alldocuments>";
727 string desc =
"PostingSource(";
728 desc +=
source->get_description();
734 : scale_factor(factor), subquery(subquery_)
788 const_cast<Xapian::Database::Internal*>(&(qopt->
db)));
806 vector<pair<Xapian::termpos, string>> &terms =
807 *
static_cast<vector<pair<Xapian::termpos, string>
>*>(void_terms);
808 terms.push_back(make_pair(pos, term));
858 result +=
static_cast<char>(0x20 | slot);
860 result +=
static_cast<char>(0x20 | 15);
878 string desc =
"VALUE_RANGE ";
925 result +=
static_cast<char>(0x20 | slot);
927 result +=
static_cast<char>(0x20 | 15);
944 string desc =
"VALUE_LE ";
987 result +=
static_cast<char>(0x20 | 0x10 | slot);
989 result +=
static_cast<char>(0x20 | 0x10 | 15);
1005 string desc =
"VALUE_GE ";
1017 double or_factor = 0.0;
1018 if (factor == 0.0) {
1027 if (!old_in_synonym) {
1036 if (expansions_left == 0)
1043 if (expansions_left-- == 0) {
1046 string msg(
"Wildcard ");
1048 msg +=
"* expands to more than ";
1049 msg +=
str(max_expansion);
1054 const string & term = t->get_termname();
1064 if (ctx.
size() > max_expansion)
1068 if (factor != 0.0) {
1110 result +=
static_cast<char>(0x0b);
1112 result +=
static_cast<unsigned char>(max_type);
1113 result +=
static_cast<unsigned char>(combiner);
1127 string desc =
"WILDCARD ";
1151 QueryVector::const_iterator i;
1152 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1156 result += (*i).internal->get_length();
1161 #define MULTIWAY(X) static_cast<unsigned char>(0x80 | (X) << 3) 1162 #define MISC(X) static_cast<unsigned char>(X) 1166 static const unsigned char first_byte[] = {
1184 AssertRel(
size_t(op_),<,
sizeof(first_byte));
1185 unsigned char ch = first_byte[op_];
1188 if (subqueries.size() < 8)
1189 ch |= subqueries.size();
1191 if (subqueries.size() >= 8)
1199 QueryVector::const_iterator i;
1200 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1202 Assert((*i).internal.get());
1203 (*i).internal->serialise(result);
1241 QueryVector::const_iterator i;
1242 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1244 Assert((*i).internal.get());
1245 (*i).internal->gather_terms(void_terms);
1253 LOGCALL_VOID(MATCH,
"QueryBranch::do_or_like", ctx | qopt | factor | elite_set_size);
1262 size_t size_before = ctx.
size();
1263 QueryVector::const_iterator q;
1264 for (q = subqueries.begin() + first; q != subqueries.end(); ++q) {
1266 Assert((*q).internal.get());
1267 (*q).internal->postlist_sub_or_like(ctx, qopt, factor);
1270 size_t out_of = ctx.
size() - size_before;
1271 if (elite_set_size && elite_set_size < out_of) {
1290 if (factor == 0.0) {
1293 do_or_like(ctx, qopt, 0.0);
1294 return ctx.postlist();
1299 do_or_like(ctx, qopt, 0.0);
1303 bool wdf_disjoint =
false;
1304 Assert(!subqueries.empty());
1305 auto type = (*subqueries.begin()).
get_type();
1309 wdf_disjoint =
true;
1310 vector<string> prefixes;
1311 for (
auto&& q : subqueries) {
1313 wdf_disjoint =
false;
1316 auto qw =
static_cast<const QueryWildcard*
>(q.internal.get());
1317 prefixes.push_back(qw->get_pattern());
1321 sort(prefixes.begin(), prefixes.end());
1322 const string* prev =
nullptr;
1323 for (
const auto& i : prefixes) {
1326 wdf_disjoint =
false;
1336 wdf_disjoint =
true;
1337 unordered_set<string> terms;
1338 for (
auto&& q : subqueries) {
1340 wdf_disjoint =
false;
1343 auto qt =
static_cast<const QueryTerm*
>(q.internal.get());
1344 if (!terms.insert(qt->get_term()).second) {
1345 wdf_disjoint =
false;
1366 do_or_like(ctx, qopt, factor);
1367 if (factor == 0.0) {
1377 RETURN(ctx.postlist_max());
1389 return subqueries.size();
1395 return subqueries[n];
1403 QueryVector::const_iterator i;
1404 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1405 if (desc.size() > 1) {
1408 desc +=
str(parameter);
1412 Assert((*i).internal.get());
1416 desc += (*i).internal->get_description();
1427 window = subqueries.size();
1439 size_t len = term.size();
1441 if (wqf == 1 && pos == 0) {
1450 }
else if (wqf == 1) {
1454 result +=
static_cast<char>(0x40 | 0x10);
1457 result +=
static_cast<char>(0x40 | 0x10 | len);
1463 result +=
static_cast<char>(0x40 | 0x20);
1466 result +=
static_cast<char>(0x40 | 0x20 | len);
1471 }
else if (wqf > 1 || pos > 0) {
1474 result +=
static_cast<char>(0x40 | 0x30);
1477 result +=
static_cast<char>(0x40 | 0x30 | len);
1487 result +=
static_cast<char>(0x40);
1490 result +=
static_cast<char>(0x40 | len);
1498 result +=
static_cast<char>(0x0c);
1500 const string & n = source->name();
1504 const string & s = source->serialise();
1521 if (subqueries.size() == 1 && subqueries[0].internal.get() == NULL)
1524 if (subquery.
internal.get() == NULL)
1526 subqueries.push_back(subquery);
1533 if (subqueries.empty())
1538 if (subqueries.size() == 1)
1539 return subqueries[0].
internal.
get();
1555 QueryVector::const_iterator i;
1556 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1558 Assert((*i).internal.get());
1559 (*i).internal->postlist_sub_and_like(ctx, qopt, factor);
1567 if (subquery.
internal.get() != NULL)
1568 subqueries.push_back(subquery);
1576 if (subqueries.empty())
1578 if (subqueries.size() == 1)
1579 return subqueries[0].
internal.
get();
1586 if (!subqueries.empty()) {
1589 if (subqueries[0].
internal.
get() == NULL) {
1595 if (subquery.
internal.get() == NULL) {
1611 subqueries.push_back(subquery);
1622 if (subqueries.size() == 1)
1623 return subqueries[0].
internal.
get();
1631 if (subqueries.size() == 1 && subqueries[0].internal.get() == NULL)
1634 if (subquery.
internal.get() != NULL || subqueries.empty())
1635 subqueries.push_back(subquery);
1646 if (subqueries.size() == 1)
1647 return subqueries[0].
internal.
get();
1656 do_or_like(ctx, qopt, factor);
1663 do_or_like(ctx, qopt, factor);
1670 AutoPtr<PostList> l(subqueries[0].internal->postlist(qopt, factor));
1671 OrContext ctx(qopt, subqueries.size() - 1);
1672 do_or_like(ctx, qopt, 0.0, 0, 1);
1673 AutoPtr<PostList> r(ctx.postlist());
1681 double factor)
const 1683 subqueries[0].internal->postlist_sub_and_like(ctx, qopt, factor);
1684 do_or_like(ctx.
get_not_ctx(subqueries.size() - 1), qopt, 0.0, 0, 1);
1699 QueryVector::const_iterator i;
1700 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1702 Assert((*i).internal.get());
1703 (*i).internal->postlist_sub_xor(ctx, qopt, factor);
1712 AutoPtr<PostList> l(subqueries[0].internal->postlist(qopt, factor));
1713 if (factor == 0.0) {
1717 OrContext ctx(qopt, subqueries.size() - 1);
1718 do_or_like(ctx, qopt, factor, 0, 1);
1719 AutoPtr<PostList> r(ctx.postlist());
1727 double factor)
const 1729 subqueries[0].internal->postlist_sub_and_like(ctx, qopt, factor);
1730 do_or_like(ctx.
get_maybe_ctx(subqueries.size() - 1), qopt, factor, 0, 1);
1745 QueryVector::const_iterator i;
1746 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1748 Assert((*i).internal.get());
1749 (*i).internal->postlist_sub_and_like(ctx, qopt, factor);
1779 QueryVector::const_iterator i;
1780 for (i = subqueries.begin(); i != subqueries.end(); ++i) {
1782 Assert((*i).internal.get());
1784 PostList* pl = (*i).internal->postlist(qopt, factor);
1812 do_or_like(ctx, qopt, factor, set_size);
1819 do_or_like(ctx, qopt, factor, set_size);
1831 PostList * pl = do_synonym(qopt, factor);
1841 if (subqueries.empty())
1843 if (subqueries.size() == 1) {
1851 return subqueries[0].internal.get();
1854 auto q =
static_cast<QueryWildcard*
>(subqueries[0].internal.get());
1871 PostList * pl = do_max(qopt, factor);
1951 return get_description_helper(
" AND ");
1957 return get_description_helper(
" OR ");
1963 return get_description_helper(
" AND_NOT ");
1969 return get_description_helper(
" XOR ");
1975 return get_description_helper(
" AND_MAYBE ");
1981 return get_description_helper(
" FILTER ");
1987 return get_description_helper(
" NEAR ", window);
1993 return get_description_helper(
" PHRASE ", window);
1999 return get_description_helper(
" ELITE_SET ", set_size);
2005 if (subqueries.size() == 1) {
2006 string d =
"(SYNONYM ";
2007 d += subqueries[0].internal->get_description();
2011 return get_description_helper(
" SYNONYM ");
2017 return get_description_helper(
" MAX ");
2035 result +=
static_cast<char>(0x00);
Wrapper postlist providing positions for an OR.
The Xapian namespace contains public interfaces for the Xapian library.
OrContext(QueryOptimiser *qopt_, size_t reserve)
size_t get_num_subqueries() const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
std::string get_description() const
N-way OR postlist with wt=max(wt_i).
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Xapian::Query::op get_type() const
Abstract base class for postlists.
const Query get_subquery(size_t n) const
Read a top level subquery.
XorContext(QueryOptimiser *qopt_, size_t reserve)
Xapian::Query::op get_op() const
Return docs containing terms forming a particular exact phrase.
virtual Xapian::doccount get_value_freq(Xapian::valueno slot) const =0
Return the frequency of a given value slot.
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
length encoded as a string
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
virtual void postlist_sub_and_like(Xapian::Internal::AndContext &ctx, QueryOptimiser *qopt, double factor) const
Merged postlist: items from one list, weights from both.
A postlist with weights modified by another postlist.
Postlist which matches an exact phrase using positional information.
This class is used to access a database, or a group of databases.
void set_total_subqs(Xapian::termcount n)
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Xapian::Query::op get_op() const
virtual termcount get_length() const
Match documents which an odd number of subqueries match.
#define AssertRel(A, REL, B)
InvalidOperationError indicates the API was used in an invalid way.
A PostList which contains no entries.
Xapian::Query::op get_op() const
std::string get_description() const
A PostList which contains no entries.
Base class for databases.
termcount get_length() const
virtual const Query get_subquery(size_t n) const
Postlist which matches a phrase using positional information.
Wrapper postlist providing positions for an OR.
void serialise(std::string &result) const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
OrContext & get_not_ctx(size_t reserve)
WildcardError indicates an error expanding a wildcarded query.
virtual void postlist_sub_xor(Xapian::Internal::XorContext &ctx, QueryOptimiser *qopt, double factor) const
PostList * do_synonym(QueryOptimiser *qopt, double factor) const
External sources of posting information.
QueryPostingSource(PostingSource *source_)
const std::string get_description_helper(const char *op, Xapian::termcount window=0) const
virtual void postlist_sub_or_like(Xapian::Internal::OrContext &ctx, QueryOptimiser *qopt, double factor) const
#define LOGCALL_VOID(CATEGORY, FUNC, PARAMS)
Pick the maximum weight of any subquery.
std::string get_description() const
A postlist comprising two postlists ORed together.
Convert types to std::string.
const Xapian::PostingSource * get_posting_source(const std::string &name) const
Get a posting source given a name.
virtual bool has_positions() const =0
Check whether this database contains any positional information.
void serialise(std::string &result) const
PostList * do_max(QueryOptimiser *qopt, double factor) const
AutoPtr< OrContext > not_ctx
virtual PostingSource * unserialise_with_registry(const std::string &serialised, const Registry ®istry) const
Create object given string serialisation returned by serialise().
virtual LeafPostList * open_post_list(const string &tname) const =0
Open a posting list.
std::string encode_length(T len)
Encode a length as a variable-length string.
void gather_terms(void *void_terms) const
Xapian::Internal::intrusive_ptr< Internal > internal
bool operator()(const PostList *a, const PostList *b) const
Order by descending get_termfreq_est().
Xapian::Query::op get_op() const
void select_most_frequent(size_t set_size)
Select the set_size postlists with the highest term frequency.
void serialise(std::string &result) const
void destroy_postlist(PostList *pl)
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
Abstract base class for leaf postlists.
std::string get_description() const
Return docs containing terms forming a particular phrase.
Xapian::Query::op get_type() const
void do_or_like(OrContext &ctx, QueryOptimiser *qopt, double factor, Xapian::termcount elite_set_size=0, size_t first=0) const
void add_postlist(PostList *pl)
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
Class providing an operator which sorts postlists to select max or terms.
PostList * postlist(PostList *pl, const vector< PostList *> &pls) const
void serialise(std::string &result) const
virtual void gather_terms(void *void_terms) const
std::string get_description() const
Hierarchy of classes which Xapian can throw as exceptions.
std::string get_description() const
Xapian::Query::op get_op() const
unsigned XAPIAN_TERMCOUNT_BASE_TYPE termcount
A counts of terms.
const Query get_subquery(size_t n) const
void serialise_(std::string &result, Xapian::termcount parameter=0) const
functions to serialise and unserialise a double
Return items which are in A, unless they're in B.
virtual std::string get_value_upper_bound(Xapian::valueno slot) const =0
Get an upper bound on the values stored in the given value slot.
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
InvalidArgumentError indicates an invalid parameter value was passed to the API.
Postlist which matches terms occurring within a specified window.
double unserialise_double(const char **p, const char *end)
Unserialise a double serialised by serialise_double.
Xapian::Internal::opt_intrusive_ptr< PostingSource > source
Limit OP_WILDCARD expansion to the most frequent terms.
std::string get_description() const
void description_append(std::string &desc, const std::string &s)
Xapian::termcount get_total_subqs() const
virtual size_t get_num_subqueries() const
std::string get_description() const
void add_subquery(const Xapian::Query &subquery)
PostList * make_synonym_postlist(PostList *pl, double factor, bool wdf_disjoint)
Xapian::Query::op get_type() const
Pick the best N subqueries and combine with OP_OR.
Indicates an error in the std::string serialisation of an object.
Value returned by get_type() for MatchAll or equivalent.
Scale the weight contributed by a subquery.
Match only documents where all subqueries match near and in order.
Match the first subquery taking extra weight from other subqueries.
std::string get_description() const
Value returned by get_type() for a PostingSource.
virtual Xapian::doccount get_termfreq_est() const =0
Get an estimate of the number of documents indexed by this term.
void add_subquery(const Xapian::Query &subquery)
std::string get_description() const
Registry for user subclasses.
void postlist_sub_xor(XorContext &ctx, QueryOptimiser *qopt, double factor) const
void select_elite_set(size_t set_size, size_t out_of)
Select the best set_size postlists from the last out_of added.
Match like OP_AND but only taking weight from the first subquery.
size_t get_num_subqueries() const
termcount get_length() const
Match only documents where a value slot is >= a given value.
void gather_terms(void *void_terms) const
Xapian::Query::op get_type() const
void postlist_sub_or_like(OrContext &ctx, QueryOptimiser *qopt, double factor) const
void serialise(std::string &result) const
virtual TermList * open_allterms(const string &prefix) const =0
Open an allterms list.
std::string get_description() const
bool operator()(const PostList *a, const PostList *b)
Return true if and only if a has a strictly greater termweight than b.
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
void add_pos_filter(Query::op op_, size_t n_subqs, Xapian::termcount window)
Xapian::Query::op get_type() const
Return document ids matching a >= test on a specified doc value.
Match only documents where a value slot is within a given range.
string str(int value)
Convert int to std::string.
Xapian::Query::op get_op() const
Match only documents where a value slot is <= a given value.
std::string get_description() const
void serialise(std::string &result) const
Details passed around while building PostList tree from Query tree.
std::string get_description() const
void add_subquery(const Xapian::Query &subquery)
void postlist_sub_or_like(OrContext &ctx, QueryOptimiser *qopt, double factor) const
bool startswith(const std::string &s, char pfx)
Return docs containing terms within a specified window.
Construct an invalid query.
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
Xapian::Query::op get_type() const
void serialise(std::string &result) const
LeafPostList * open_lazy_post_list(const std::string &term, Xapian::termcount wqf, double factor)
Base class which provides an "external" source of postings.
void serialise(std::string &result) const
void add_subquery(const Xapian::Query &subquery)
virtual std::string get_value_lower_bound(Xapian::valueno slot) const =0
Get a lower bound on the values stored in the given value slot.
virtual double get_maxweight() const =0
Return an upper bound on what get_weight() can return.
void shrink(size_t new_size)
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
LeafPostList * open_post_list(const std::string &term, Xapian::termcount wqf, double factor)
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Match like OP_OR but weighting as if a single term.
void serialise(std::string &result) const
Append a string to an object description, escaping invalid UTF-8.
Comparison functor which orders PostList* by descending get_termfreq_est().
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Match only documents which all subqueries match.
virtual Query::Internal * done()=0
Xapian::Query::op get_op() const
void serialise(std::string &result) const
std::string serialise_double(double v)
Serialise a double to a string.
void decode_length_and_check(const char **p, const char *end, unsigned &out)
Decode a length encoded by encode_length.
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
unsigned XAPIAN_DOCID_BASE_TYPE doccount
A count of documents.
const Xapian::Database::Internal & db
OrContext & get_maybe_ctx(size_t reserve)
std::string get_description() const
Match only documents where all subqueries match near each other.
static Query::Internal * unserialise(const char **p, const char *end, const Registry ®)
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
std::string get_description() const
Xapian::Query::op get_op() const
Xapian::Query::op get_op() const
std::string get_description() const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Value returned by get_type() for a term.
void gather_terms(void *void_terms) const
Return document ids from an external source.
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
QueryScaleWeight(double factor, const Query &subquery_)
Match documents which the first subquery matches but no others do.
Match documents which at least one subquery matches.
unsigned valueno
The number for a value slot in a document.
void postlist_windowed(Xapian::Query::op op, AndContext &ctx, QueryOptimiser *qopt, double factor) const
bool full_db_has_positions() const
unsigned XAPIAN_TERMPOS_BASE_TYPE termpos
A term position within a document or query.
Various handy helpers which std::string really should provide.
Abstract base class for termlists.
PostingSource * release()
Start reference counting this object.
Stop expanding when OP_WILDCARD reaches its expansion limit.
op get_type() const
Get the type of the top level of the query.
void serialise(std::string &result) const
Xapian::Query::op get_op() const
A postlist generated by taking one postlist (the left-hand postlist), and removing any documents whic...
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
const Query get_subquery(size_t n) const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const
Return document ids matching a range test on a specified doc value.
std::string get_description() const
Xapian::Query::op get_op() const
PosFilter(Xapian::Query::op op__, size_t begin_, size_t end_, Xapian::termcount window_)
Various assertion macros.
Class representing a query.
N-way OR postlist with wt=max(wt_i)
PostList * postlist_max()
Xapian::Query::op get_type() const
Xapian::Query::op get_op() const
list< PosFilter > pos_filters
Xapian::doccount shard_index
virtual void add_subquery(const Xapian::Query &subquery)=0
std::string get_description() const
AndContext(QueryOptimiser *qopt_, size_t reserve)
void decode_length(const char **p, const char *end, unsigned &out)
Decode a length encoded by encode_length.
Xapian::Query::op get_type() const
Wrapper around standard unique_ptr template.
Xapian::Query::op get_type() const
#define LOGCALL(CATEGORY, TYPE, FUNC, PARAMS)
AutoPtr< OrContext > maybe_ctx
void serialise(std::string &result) const
QueryWildcard * change_combiner(Xapian::Query::op new_op)
Change the combining operator.
void postlist_sub_and_like(AndContext &ctx, QueryOptimiser *qopt, double factor) const
virtual Query::op get_type() const =0
std::string get_description() const
PostingIterator::Internal * postlist(QueryOptimiser *qopt, double factor) const