@ -52,15 +52,14 @@ xapian_query_op (const Mux::Tree& tree)
|
|||||||
return Xapian::Query(op, childvec.begin(), childvec.end());
|
return Xapian::Query(op, childvec.begin(), childvec.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Xapian::Query
|
static Xapian::Query
|
||||||
maybe_wildcard (const Value* val, const std::string& str)
|
make_query (const Value* val, const std::string& str, bool maybe_wildcard)
|
||||||
{
|
{
|
||||||
#ifndef XAPIAN_HAVE_OP_WILDCARD
|
#ifndef XAPIAN_HAVE_OP_WILDCARD
|
||||||
return Xapian::Query(val->prefix + str);
|
return Xapian::Query(val->prefix + str);
|
||||||
#else
|
#else
|
||||||
const auto vlen = str.length();
|
const auto vlen{str.length()};
|
||||||
if (vlen <= 1 || str[vlen-1] != '*')
|
if (!maybe_wildcard || vlen <= 1 || str[vlen - 1] != '*')
|
||||||
return Xapian::Query(val->prefix + str);
|
return Xapian::Query(val->prefix + str);
|
||||||
else
|
else
|
||||||
return Xapian::Query(Xapian::Query::OP_WILDCARD,
|
return Xapian::Query(Xapian::Query::OP_WILDCARD,
|
||||||
@ -73,32 +72,30 @@ xapian_query_value (const Mux::Tree& tree)
|
|||||||
{
|
{
|
||||||
const auto v = dynamic_cast<Value*> (tree.node.data.get());
|
const auto v = dynamic_cast<Value*> (tree.node.data.get());
|
||||||
if (!v->phrase)
|
if (!v->phrase)
|
||||||
return maybe_wildcard(v, v->value);
|
return make_query(v, v->value, true/*maybe-wildcard*/);
|
||||||
|
|
||||||
const auto parts = split (v->value, " ");
|
const auto parts = split (v->value, " ");
|
||||||
|
|
||||||
std::vector<Xapian::Query> phvec;
|
|
||||||
for (const auto p: parts)
|
|
||||||
phvec.emplace_back(maybe_wildcard(v, p));
|
|
||||||
|
|
||||||
if (parts.empty())
|
if (parts.empty())
|
||||||
return Xapian::Query::MatchNothing; // shouldn't happen
|
return Xapian::Query::MatchNothing; // shouldn't happen
|
||||||
|
|
||||||
if (parts.size() == 1)
|
if (parts.size() == 1)
|
||||||
return phvec.front();
|
return make_query(v, parts.front(), true/*maybe-wildcard*/);
|
||||||
|
|
||||||
return Xapian::Query (Xapian::Query::OP_PHRASE,
|
std::vector<Xapian::Query> phvec;
|
||||||
phvec.begin(), phvec.end());
|
for (const auto p: parts)
|
||||||
|
phvec.emplace_back(make_query(v, p, false/*no wildcards*/));
|
||||||
|
|
||||||
|
return Xapian::Query (Xapian::Query::OP_PHRASE, phvec.begin(), phvec.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
static Xapian::Query
|
static Xapian::Query
|
||||||
xapian_query_range (const Mux::Tree& tree)
|
xapian_query_range (const Mux::Tree& tree)
|
||||||
{
|
{
|
||||||
const auto r = dynamic_cast<Range*> (tree.node.data.get());
|
const auto r { dynamic_cast<Range *>(tree.node.data.get()) };
|
||||||
return Xapian::Query(Xapian::Query::OP_VALUE_RANGE,
|
|
||||||
(Xapian::valueno)r->id, r->lower, r->upper);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return Xapian::Query(Xapian::Query::OP_VALUE_RANGE, (Xapian::valueno)r->id,
|
||||||
|
r->lower, r->upper);
|
||||||
|
}
|
||||||
|
|
||||||
Xapian::Query
|
Xapian::Query
|
||||||
Mux::xapian_query (const Mux::Tree& tree)
|
Mux::xapian_query (const Mux::Tree& tree)
|
||||||
|
|||||||
Reference in New Issue
Block a user