summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-03-21 15:34:26 +0100
committerGitHub <noreply@github.com>2017-03-21 15:34:26 +0100
commit24ff4f5ae0cdbc4d53221c8e6b916ef65437b1ce (patch)
treef83e0288fab677f3cfe778218cc5acf8b1a9ac49 /searchlib
parentb6186a43119d3d360c5fac547337b10b5488fde6 (diff)
parent307a3d3801e445ed6c13d90e179e62bab30cd5c8 (diff)
Merge pull request #2046 from yahoo/balder/remove-lp-1
Balder/remove lp 1
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/query/query-old.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/query/query.cpp22
-rw-r--r--searchlib/src/vespa/searchlib/query/query.h21
-rw-r--r--searchlib/src/vespa/searchlib/query/query_term_decoder.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/query/querynode.cpp38
-rw-r--r--searchlib/src/vespa/searchlib/query/querynode.h9
-rw-r--r--searchlib/src/vespa/searchlib/query/queryterm.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/query/queryterm.h3
8 files changed, 35 insertions, 96 deletions
diff --git a/searchlib/src/tests/query/query-old.cpp b/searchlib/src/tests/query/query-old.cpp
index 0d0ceee63d9..db4b7f87895 100644
--- a/searchlib/src/tests/query/query-old.cpp
+++ b/searchlib/src/tests/query/query-old.cpp
@@ -232,11 +232,11 @@ TEST("e is not rewritten even if allowed") {
vespalib::stringref stackDump(term, sizeof(term));
EXPECT_EQUAL(6u, stackDump.size());
AllowRewrite allowRewrite;
- Query q(allowRewrite, stackDump);
+ const Query q(allowRewrite, stackDump);
EXPECT_TRUE(q.valid());
- const QueryNode::LP & root = q.getRoot();
- EXPECT_EQUAL(QueryTerm::classId, root->getClass().id());
- const QueryTerm & qt = static_cast<const QueryTerm &>(*root);
+ const QueryNode & root = q.getRoot();
+ EXPECT_TRUE(dynamic_cast<const QueryTerm *>(&root) != nullptr);
+ const QueryTerm & qt = static_cast<const QueryTerm &>(root);
EXPECT_EQUAL("c", qt.index());
EXPECT_EQUAL(vespalib::stringref("e"), qt.getTerm());
EXPECT_EQUAL(3u, qt.uniqueId());
@@ -247,11 +247,11 @@ TEST("1.0e is not rewritten by default") {
vespalib::stringref stackDump(term, sizeof(term));
EXPECT_EQUAL(9u, stackDump.size());
QueryNodeResultFactory empty;
- Query q(empty, stackDump);
+ const Query q(empty, stackDump);
EXPECT_TRUE(q.valid());
- const QueryNode::LP & root = q.getRoot();
- EXPECT_EQUAL(QueryTerm::classId, root->getClass().id());
- const QueryTerm & qt = static_cast<const QueryTerm &>(*root);
+ const QueryNode & root = q.getRoot();
+ EXPECT_TRUE(dynamic_cast<const QueryTerm *>(&root) != nullptr);
+ const QueryTerm & qt = static_cast<const QueryTerm &>(root);
EXPECT_EQUAL("c", qt.index());
EXPECT_EQUAL(vespalib::stringref("1.0e"), qt.getTerm());
EXPECT_EQUAL(3u, qt.uniqueId());
@@ -262,31 +262,31 @@ TEST("1.0e is rewritten if allowed too.") {
vespalib::stringref stackDump(term, sizeof(term));
EXPECT_EQUAL(9u, stackDump.size());
AllowRewrite empty;
- Query q(empty, stackDump);
+ const Query q(empty, stackDump);
EXPECT_TRUE(q.valid());
- const QueryNode::LP & root = q.getRoot();
- EXPECT_EQUAL(EquivQueryNode::classId, root->getClass().id());
- const EquivQueryNode & equiv = static_cast<const EquivQueryNode &>(*root);
+ const QueryNode & root = q.getRoot();
+ EXPECT_TRUE(dynamic_cast<const EquivQueryNode *>(&root) != nullptr);
+ const EquivQueryNode & equiv = static_cast<const EquivQueryNode &>(root);
EXPECT_EQUAL(2u, equiv.size());
- EXPECT_EQUAL(QueryTerm::classId, equiv[0]->getClass().id());
+ EXPECT_TRUE(dynamic_cast<const QueryTerm *>(equiv[0].get()) != nullptr);
{
const QueryTerm & qt = static_cast<const QueryTerm &>(*equiv[0]);
EXPECT_EQUAL("c", qt.index());
EXPECT_EQUAL(vespalib::stringref("1.0e"), qt.getTerm());
EXPECT_EQUAL(3u, qt.uniqueId());
}
- EXPECT_EQUAL(PhraseQueryNode::classId, equiv[1]->getClass().id());
+ EXPECT_TRUE(dynamic_cast<const PhraseQueryNode *>(equiv[1].get()) != nullptr);
{
const PhraseQueryNode & phrase = static_cast<const PhraseQueryNode &>(*equiv[1]);
EXPECT_EQUAL(2u, phrase.size());
- EXPECT_EQUAL(QueryTerm::classId, phrase[0]->getClass().id());
+ EXPECT_TRUE(dynamic_cast<const QueryTerm *>(phrase[0].get()) != nullptr);
{
const QueryTerm & qt = static_cast<const QueryTerm &>(*phrase[0]);
EXPECT_EQUAL("c", qt.index());
EXPECT_EQUAL(vespalib::stringref("1"), qt.getTerm());
EXPECT_EQUAL(0u, qt.uniqueId());
}
- EXPECT_EQUAL(QueryTerm::classId, phrase[1]->getClass().id());
+ EXPECT_TRUE(dynamic_cast<const QueryTerm *>(phrase[1].get()) != nullptr);
{
const QueryTerm & qt = static_cast<const QueryTerm &>(*phrase[1]);
EXPECT_EQUAL("c", qt.index());
diff --git a/searchlib/src/vespa/searchlib/query/query.cpp b/searchlib/src/vespa/searchlib/query/query.cpp
index 2c42a47ce38..0b971aa0196 100644
--- a/searchlib/src/vespa/searchlib/query/query.cpp
+++ b/searchlib/src/vespa/searchlib/query/query.cpp
@@ -2,26 +2,11 @@
#include "query.h"
#include <vespa/vespalib/objects/visit.hpp>
-using vespalib::Identifiable;
-
namespace search {
-IMPLEMENT_IDENTIFIABLE_ABSTRACT_NS(search, QueryConnector, QueryNode);
-IMPLEMENT_IDENTIFIABLE_NS(search, Query, Identifiable);
-IMPLEMENT_IDENTIFIABLE_NS(search, TrueNode, QueryNode);
-IMPLEMENT_IDENTIFIABLE_NS(search, AndQueryNode, QueryConnector);
-IMPLEMENT_IDENTIFIABLE_NS(search, AndNotQueryNode, QueryConnector);
-IMPLEMENT_IDENTIFIABLE_NS(search, OrQueryNode, QueryConnector);
-IMPLEMENT_IDENTIFIABLE_NS(search, EquivQueryNode, OrQueryNode);
-IMPLEMENT_IDENTIFIABLE_NS(search, PhraseQueryNode, AndQueryNode);
-IMPLEMENT_IDENTIFIABLE_NS(search, NotQueryNode, QueryConnector);
-IMPLEMENT_IDENTIFIABLE_NS(search, NearQueryNode, AndQueryNode);
-IMPLEMENT_IDENTIFIABLE_NS(search, ONearQueryNode, NearQueryNode);
-
void QueryConnector::visitMembers(vespalib::ObjectVisitor &visitor) const
{
visit(visitor, "Operator", _opName);
- visit(visitor, "Children", (const QueryNodeList &)*this);
}
QueryConnector::QueryConnector(const char * opName) :
@@ -268,22 +253,15 @@ bool ONearQueryNode::evaluate() const
}
Query::Query() :
- Identifiable(),
_root()
{ }
Query::Query(const QueryNodeResultFactory & factory, const QueryPacketT & queryRep) :
- Identifiable(),
_root()
{
build(factory, queryRep);
}
-void Query::visitMembers(vespalib::ObjectVisitor &visitor) const
-{
- visit(visitor, "root", _root);
-}
-
bool Query::evaluate() const
{
bool ok = valid() ? _root->evaluate() : false;
diff --git a/searchlib/src/vespa/searchlib/query/query.h b/searchlib/src/vespa/searchlib/query/query.h
index 401febac202..6be1e1867c5 100644
--- a/searchlib/src/vespa/searchlib/query/query.h
+++ b/searchlib/src/vespa/searchlib/query/query.h
@@ -15,7 +15,6 @@ namespace search
class QueryConnector : public QueryNode, public QueryNodeList
{
public:
- DECLARE_IDENTIFIABLE_ABSTRACT_NS(search, QueryConnector);
QueryConnector(const char * opName);
~QueryConnector();
virtual const HitList & evaluateHits(HitList & hl) const;
@@ -45,7 +44,6 @@ private:
class TrueNode : public QueryConnector
{
public:
- DECLARE_IDENTIFIABLE_NS(search, TrueNode);
TrueNode() : QueryConnector("AND") { }
virtual bool evaluate() const;
};
@@ -56,7 +54,6 @@ public:
class AndQueryNode : public QueryConnector
{
public:
- DECLARE_IDENTIFIABLE_NS(search, AndQueryNode);
AndQueryNode() : QueryConnector("AND") { }
AndQueryNode(const char * opName) : QueryConnector(opName) { }
virtual bool evaluate() const;
@@ -69,7 +66,6 @@ public:
class AndNotQueryNode : public QueryConnector
{
public:
- DECLARE_IDENTIFIABLE_NS(search, AndNotQueryNode);
AndNotQueryNode() : QueryConnector("ANDNOT") { }
virtual bool evaluate() const;
virtual bool isFlattenable(ParseItem::ItemType type) const { return type == ParseItem::ITEM_NOT; }
@@ -81,7 +77,6 @@ public:
class OrQueryNode : public QueryConnector
{
public:
- DECLARE_IDENTIFIABLE_NS(search, OrQueryNode);
OrQueryNode() : QueryConnector("OR") { }
OrQueryNode(const char * opName) : QueryConnector(opName) { }
virtual bool evaluate() const;
@@ -99,7 +94,6 @@ public:
class EquivQueryNode : public OrQueryNode
{
public:
- DECLARE_IDENTIFIABLE_NS(search, EquivQueryNode);
EquivQueryNode() : OrQueryNode("EQUIV") { }
virtual bool evaluate() const;
virtual bool isFlattenable(ParseItem::ItemType type) const {
@@ -115,7 +109,6 @@ public:
class PhraseQueryNode : public AndQueryNode
{
public:
- DECLARE_IDENTIFIABLE_NS(search, PhraseQueryNode);
PhraseQueryNode() : AndQueryNode("PHRASE"), _fieldInfo(32) { }
virtual bool evaluate() const;
virtual const HitList & evaluateHits(HitList & hl) const;
@@ -139,7 +132,6 @@ private:
class NotQueryNode : public QueryConnector
{
public:
- DECLARE_IDENTIFIABLE_NS(search, NotQueryNode);
NotQueryNode() : QueryConnector("NOT") { }
virtual bool evaluate() const;
};
@@ -150,7 +142,6 @@ public:
class NearQueryNode : public AndQueryNode
{
public:
- DECLARE_IDENTIFIABLE_NS(search, NearQueryNode);
NearQueryNode() : AndQueryNode("NEAR"), _distance(0) { }
NearQueryNode(const char * opName) : AndQueryNode(opName), _distance(0) { }
virtual bool evaluate() const;
@@ -169,7 +160,6 @@ private:
class ONearQueryNode : public NearQueryNode
{
public:
- DECLARE_IDENTIFIABLE_NS(search, ONearQueryNode);
ONearQueryNode() : NearQueryNode("ONEAR") { }
virtual ~ONearQueryNode() { }
virtual bool evaluate() const;
@@ -183,13 +173,11 @@ public:
you want to process. The tree can also be printed. And you can read the
width and depth properties.
*/
-class Query : public vespalib::Identifiable
+class Query
{
public:
- DECLARE_IDENTIFIABLE_NS(search, Query);
Query();
Query(const QueryNodeResultFactory & factory, const QueryPacketT & queryRep);
- virtual ~Query() { }
/// Will build the query tree
bool build(const QueryNodeResultFactory & factory, const QueryPacketT & queryRep);
/// Will clear the results from the querytree.
@@ -204,11 +192,10 @@ public:
size_t depth() const;
size_t width() const;
bool valid() const { return _root.get() != NULL; }
- const QueryNode::LP & getRoot() const { return _root; }
- QueryNode::LP & getRoot() { return _root; }
+ const QueryNode & getRoot() const { return *_root; }
+ static QueryNode::UP steal(Query && query) { return std::move(query._root); }
private:
- virtual void visitMembers(vespalib::ObjectVisitor &visitor) const;
- QueryNode::LP _root;
+ QueryNode::UP _root;
};
}
diff --git a/searchlib/src/vespa/searchlib/query/query_term_decoder.cpp b/searchlib/src/vespa/searchlib/query/query_term_decoder.cpp
index c05e51468bf..251993c1046 100644
--- a/searchlib/src/vespa/searchlib/query/query_term_decoder.cpp
+++ b/searchlib/src/vespa/searchlib/query/query_term_decoder.cpp
@@ -12,8 +12,8 @@ QueryTermDecoder::decodeTerm(QueryPacketT term)
QueryTermSimple::UP result;
QueryNodeResultFactory factory;
Query query(factory, term);
- if (query.valid() && (dynamic_cast<QueryTerm *>(query.getRoot().get()))) {
- result.reset(static_cast<QueryTerm *>(query.getRoot().release()));
+ if (query.valid() && (dynamic_cast<const QueryTerm *>(&query.getRoot()))) {
+ result.reset(static_cast<QueryTerm *>(Query::steal(std::move(query)).release()));
} else {
throw vespalib::IllegalStateException("Failed decoding query term");
}
diff --git a/searchlib/src/vespa/searchlib/query/querynode.cpp b/searchlib/src/vespa/searchlib/query/querynode.cpp
index b408c7acd5c..bd4b47d9868 100644
--- a/searchlib/src/vespa/searchlib/query/querynode.cpp
+++ b/searchlib/src/vespa/searchlib/query/querynode.cpp
@@ -5,33 +5,12 @@
#include <vespa/log/log.h>
LOG_SETUP(".vsm.querynode");
-namespace search
-{
-
-IMPLEMENT_IDENTIFIABLE_ABSTRACT_NS(search, QueryNode, vespalib::Identifiable);
-
-void NewNode(QueryNode::LP & qn, QueryNodeList & currentNodeList, size_t count=0)
-{
- if ( ! currentNodeList.empty() ) {
- QueryConnector *qc = dynamic_cast<QueryConnector *> (&*currentNodeList.back());
- if (qc != 0 &&
- ((dynamic_cast<NotQueryNode *>(qc) != NULL) ||
- (dynamic_cast<PhraseQueryNode *>(qc) != NULL && (count == qc->size()))))
- {
- qc->push_back(qn);
- } else {
- currentNodeList.push_back(qn);
- }
- } else {
- currentNodeList.push_back(qn);
- }
-}
+namespace search {
namespace {
vespalib::stringref DEFAULT("default");
}
-#define CASE(c, q) case c: { qn.reset(new q()); } break;
QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factory, search::SimpleQueryStackDumpIterator & queryRep, bool allowRewrite)
{
unsigned int arity = queryRep.getArity();
@@ -69,9 +48,9 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultFa
if (qc->isFlattenable(queryRep.getType())) {
arity += queryRep.getArity();
} else {
- LP child(Build(qc, factory, queryRep,
- allowRewrite && ((dynamic_cast<NearQueryNode *> (qn.get()) == NULL) && (dynamic_cast<PhraseQueryNode *> (qn.get()) == NULL))).release());
- qc->push_back(child);
+ UP child(Build(qc, factory, queryRep,
+ allowRewrite && ((dynamic_cast<NearQueryNode *> (qn.get()) == NULL) && (dynamic_cast<PhraseQueryNode *> (qn.get()) == NULL))));
+ qc->push_back(std::move(child));
}
}
}
@@ -131,11 +110,11 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultFa
} else {
std::unique_ptr<PhraseQueryNode> phrase(new PhraseQueryNode());
- phrase->push_back(LP(new QueryTerm(factory.create(), ssTerm.substr(0, ssTerm.find('.')), ssIndex, QueryTerm::WORD)));
- phrase->push_back(LP(new QueryTerm(factory.create(), ssTerm.substr(ssTerm.find('.') + 1), ssIndex, QueryTerm::WORD)));
+ phrase->push_back(UP(new QueryTerm(factory.create(), ssTerm.substr(0, ssTerm.find('.')), ssIndex, QueryTerm::WORD)));
+ phrase->push_back(UP(new QueryTerm(factory.create(), ssTerm.substr(ssTerm.find('.') + 1), ssIndex, QueryTerm::WORD)));
std::unique_ptr<EquivQueryNode> orqn(new EquivQueryNode());
- orqn->push_back(LP(qt.release()));
- orqn->push_back(LP(phrase.release()));
+ orqn->push_back(std::move(qt));
+ orqn->push_back(std::move(phrase));
qn.reset(orqn.release());
}
}
@@ -163,7 +142,6 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultFa
}
return qn;
}
-#undef CASE
const HitList & QueryNode::evaluateHits(HitList & hl) const
{
diff --git a/searchlib/src/vespa/searchlib/query/querynode.h b/searchlib/src/vespa/searchlib/query/querynode.h
index 3989d593139..7bb42f1f6e2 100644
--- a/searchlib/src/vespa/searchlib/query/querynode.h
+++ b/searchlib/src/vespa/searchlib/query/querynode.h
@@ -2,8 +2,7 @@
#pragma once
#include "posocc.h"
-#include <vespa/vespalib/util/linkedptr.h>
-#include <vespa/searchlib/common/identifiable.h>
+#include <vespa/vespalib/stllike/string.h>
namespace search {
@@ -25,11 +24,9 @@ typedef std::vector<const QueryTerm *> ConstQueryTermList;
This is the base of any node in the query tree. Both leaf nodes (terms)
and operator nodes (AND, NOT, OR, PHRASE, NEAR, ONEAR, etc).
*/
-class QueryNode : public vespalib::Identifiable
+class QueryNode
{
public:
- DECLARE_IDENTIFIABLE_ABSTRACT_NS(search, QueryNode);
- typedef vespalib::LinkedPtr<QueryNode> LP;
typedef std::unique_ptr<QueryNode> UP;
virtual ~QueryNode() { }
@@ -59,7 +56,7 @@ class QueryNode : public vespalib::Identifiable
};
/// A list conating the QuerNode objects. With copy/assignment.
-typedef std::vector<QueryNode::LP> QueryNodeList;
+typedef std::vector<QueryNode::UP> QueryNodeList;
}
diff --git a/searchlib/src/vespa/searchlib/query/queryterm.cpp b/searchlib/src/vespa/searchlib/query/queryterm.cpp
index dc026d7f0b6..2cd9c090210 100644
--- a/searchlib/src/vespa/searchlib/query/queryterm.cpp
+++ b/searchlib/src/vespa/searchlib/query/queryterm.cpp
@@ -48,8 +48,6 @@ bool isValidInteger(int64_t value)
namespace search {
-IMPLEMENT_IDENTIFIABLE_NS(search, QueryTerm, QueryNode);
-
QueryTermBase::UCS4StringT
QueryTermBase::getUCS4Term() const {
UCS4StringT ucs4;
diff --git a/searchlib/src/vespa/searchlib/query/queryterm.h b/searchlib/src/vespa/searchlib/query/queryterm.h
index 17d2bc64972..5d275dc1d07 100644
--- a/searchlib/src/vespa/searchlib/query/queryterm.h
+++ b/searchlib/src/vespa/searchlib/query/queryterm.h
@@ -6,6 +6,8 @@
#include "querynoderesultbase.h"
#include "weight.h"
#include <vespa/vespalib/stllike/string.h>
+#include <vespa/vespalib/util/memory.h>
+#include <vespa/vespalib/objects/objectvisitor.h>
#include <vespa/fastlib/text/unicodeutil.h>
namespace search {
@@ -154,7 +156,6 @@ public:
uint32_t _hitCount;
uint32_t _fieldLength;
};
- DECLARE_IDENTIFIABLE_NS(search, QueryTerm);
QueryTerm();
QueryTerm(std::unique_ptr<QueryNodeResultBase> resultBase, const string & term, const string & index, SearchTerm type);
QueryTerm(const QueryTerm &) = default;