diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-21 15:34:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-21 15:34:26 +0100 |
commit | 24ff4f5ae0cdbc4d53221c8e6b916ef65437b1ce (patch) | |
tree | f83e0288fab677f3cfe778218cc5acf8b1a9ac49 /searchlib | |
parent | b6186a43119d3d360c5fac547337b10b5488fde6 (diff) | |
parent | 307a3d3801e445ed6c13d90e179e62bab30cd5c8 (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.cpp | 32 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/query.cpp | 22 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/query.h | 21 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/query_term_decoder.cpp | 4 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/querynode.cpp | 38 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/querynode.h | 9 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/queryterm.cpp | 2 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/query/queryterm.h | 3 |
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; |