query-parser: support phrase queries

This commit is contained in:
djcb
2017-10-26 21:31:22 +03:00
parent e4b3174ed8
commit 7cd7d118e2
5 changed files with 73 additions and 22 deletions

View File

@ -48,6 +48,35 @@ xapian_query_op (const Mux::Tree& tree)
return Xapian::Query(op, childvec.begin(), childvec.end());
}
static Xapian::Query
xapian_query_value (const Mux::Tree& tree)
{
const auto v = dynamic_cast<Value*> (tree.node.data.get());
const auto parts = split (v->value, " ");
std::vector<Xapian::Query> phvec;
for (const auto p: parts)
phvec.push_back(Xapian::Query(v->prefix + p));
if (parts.empty())
return Xapian::Query::MatchNothing; // shouldn't happen
if (parts.size() == 1)
return phvec.front();
return Xapian::Query (Xapian::Query::OP_PHRASE,
phvec.begin(), phvec.end());
}
static Xapian::Query
xapian_query_range (const Mux::Tree& tree)
{
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);
}
Xapian::Query
Mux::xapian_query (const Mux::Tree& tree)
{
@ -60,15 +89,10 @@ Mux::xapian_query (const Mux::Tree& tree)
case Node::Type::OpXor:
case Node::Type::OpAndNot:
return xapian_query_op (tree);
case Node::Type::Value: {
const auto v = dynamic_cast<Value*> (tree.node.data.get());
return Xapian::Query(v->prefix + v->value);
}
case Node::Type::Range: {
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);
}
case Node::Type::Value:
return xapian_query_value (tree);
case Node::Type::Range:
return xapian_query_range (tree);
default:
throw std::runtime_error ("invalid query"); // bug
}