diff options
author | Håvard Pettersen <havardpe@oath.com> | 2019-09-10 11:18:29 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2019-09-12 08:16:57 +0000 |
commit | 17a6c5033b0b45becf8a3ef382d51599fe9afd57 (patch) | |
tree | 9fd3fa6e56547ea28dd024e0acdb6f886c9c17a0 /searchlib | |
parent | d385fbe52c37b1bf896a4e16328349ac756ee4f4 (diff) |
add expensive flags to phrase/same element
they will affect the iterator cost tier
Diffstat (limited to 'searchlib')
9 files changed, 33 insertions, 15 deletions
diff --git a/searchlib/src/tests/queryeval/same_element/same_element_test.cpp b/searchlib/src/tests/queryeval/same_element/same_element_test.cpp index 45ebdd78fb3..6ec379140c0 100644 --- a/searchlib/src/tests/queryeval/same_element/same_element_test.cpp +++ b/searchlib/src/tests/queryeval/same_element/same_element_test.cpp @@ -15,7 +15,7 @@ using namespace search::queryeval; using search::attribute::ElementIterator; std::unique_ptr<SameElementBlueprint> make_blueprint(const std::vector<FakeResult> &children, bool fake_attr = false) { - auto result = std::make_unique<SameElementBlueprint>(); + auto result = std::make_unique<SameElementBlueprint>(false); for (size_t i = 0; i < children.size(); ++i) { uint32_t field_id = i; vespalib::string field_name = vespalib::make_string("f%u", field_id); diff --git a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp index aad448f7fe1..f5ce8a9608b 100644 --- a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp +++ b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp @@ -173,7 +173,7 @@ PhraseSearchTest::PhraseSearchTest(bool expiredDoom) : _requestContext(nullptr, expiredDoom ? 0 : std::numeric_limits<int64_t>::max()), _index(), _phrase_fs(field, fieldId, phrase_handle), - _phrase(_phrase_fs, _requestContext), + _phrase(_phrase_fs, _requestContext, false), _children(), _md(MatchData::makeTestInstance(100, 10)), _order(), @@ -301,7 +301,7 @@ Test::requireThatBlueprintExposesFieldWithEstimate() { FakeRequestContext requestContext; FieldSpec f("foo", 1, 1); - SimplePhraseBlueprint phrase(f, requestContext); + SimplePhraseBlueprint phrase(f, requestContext, false); ASSERT_TRUE(phrase.getState().numFields() == 1); EXPECT_EQUAL(f.getFieldId(), phrase.getState().field(0).getFieldId()); EXPECT_EQUAL(f.getHandle(), phrase.getState().field(0).getHandle()); @@ -327,7 +327,7 @@ Test::requireThatBlueprintForcesPositionDataOnChildren() { FakeRequestContext requestContext; FieldSpec f("foo", 1, 1, true); - SimplePhraseBlueprint phrase(f, requestContext); + SimplePhraseBlueprint phrase(f, requestContext, false); EXPECT_TRUE(f.isFilter()); EXPECT_TRUE(!phrase.getNextChildField(f).isFilter()); } diff --git a/searchlib/src/vespa/searchlib/query/tree/intermediatenodes.h b/searchlib/src/vespa/searchlib/query/tree/intermediatenodes.h index 6d643d951f0..3bca4f041b3 100644 --- a/searchlib/src/vespa/searchlib/query/tree/intermediatenodes.h +++ b/searchlib/src/vespa/searchlib/query/tree/intermediatenodes.h @@ -99,17 +99,30 @@ class ONear : public QueryNodeMixin<ONear, Intermediate> class Phrase : public QueryNodeMixin<Phrase, Intermediate>, public Term { public: Phrase(const vespalib::string &view, int32_t id, Weight weight) - : Term(view, id, weight) {} + : Term(view, id, weight), _expensive(false) {} virtual ~Phrase() = 0; + Phrase &set_expensive(bool value) { + _expensive = value; + return *this; + } + bool is_expensive() const { return _expensive; } +private: + bool _expensive; }; class SameElement : public QueryNodeMixin<SameElement, Intermediate> { public: - SameElement(const vespalib::string &view) : _view(view) {} + SameElement(const vespalib::string &view) : _view(view), _expensive(false) {} virtual ~SameElement() = 0; const vespalib::string & getView() const { return _view; } + SameElement &set_expensive(bool value) { + _expensive = value; + return *this; + } + bool is_expensive() const { return _expensive; } private: vespalib::string _view; + bool _expensive; }; class WeightedSetTerm : public QueryNodeMixin<WeightedSetTerm, Intermediate>, public Term { diff --git a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h index 7bf6c17f136..e7c3fd8c73b 100644 --- a/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h +++ b/searchlib/src/vespa/searchlib/query/tree/queryreplicator.h @@ -70,12 +70,12 @@ private: void visit(Phrase &node) override { replicate(node, _builder.addPhrase(node.getChildren().size(), node.getView(), - node.getId(), node.getWeight())); + node.getId(), node.getWeight()).set_expensive(node.is_expensive())); visitNodes(node.getChildren()); } void visit(SameElement &node) override { - _builder.addSameElement(node.getChildren().size(), node.getView()); + _builder.addSameElement(node.getChildren().size(), node.getView()).set_expensive(node.is_expensive()); visitNodes(node.getChildren()); } @@ -107,8 +107,7 @@ private: } void replicate(const Term &original, Term &replica) { - replica.setTermIndex(original.getTermIndex()); - replica.setRanked(original.isRanked()); + replica.setStateFrom(original); } void visit(NumberTerm &node) override { diff --git a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp index e3588d88ccb..3731b2ff6a8 100644 --- a/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/create_blueprint_visitor_helper.cpp @@ -31,7 +31,7 @@ CreateBlueprintVisitorHelper::getResult() void CreateBlueprintVisitorHelper::visitPhrase(query::Phrase &n) { - auto phrase = std::make_unique<SimplePhraseBlueprint>(_field, _requestContext); + auto phrase = std::make_unique<SimplePhraseBlueprint>(_field, _requestContext, n.is_expensive()); for (const query::Node * child : n.getChildren()) { FieldSpecList fields; fields.add(phrase->getNextChildField(_field)); diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index fa9cc82975f..2376b129fc1 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -10,12 +10,15 @@ namespace search::queryeval { -SameElementBlueprint::SameElementBlueprint() +SameElementBlueprint::SameElementBlueprint(bool expensive) : ComplexLeafBlueprint(FieldSpecBaseList()), _estimate(), _layout(), _terms() { + if (expensive) { + set_cost_tier(State::COST_TIER_EXPENSIVE); + } } SameElementBlueprint::~SameElementBlueprint() = default; diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h index decb518a7c9..3b29e518aa1 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h @@ -17,7 +17,7 @@ private: std::vector<Blueprint::UP> _terms; public: - SameElementBlueprint(); + SameElementBlueprint(bool expensive); SameElementBlueprint(const SameElementBlueprint &) = delete; SameElementBlueprint &operator=(const SameElementBlueprint &) = delete; ~SameElementBlueprint(); diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp index ed7690f605f..7429553d889 100644 --- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp @@ -9,7 +9,7 @@ namespace search::queryeval { -SimplePhraseBlueprint::SimplePhraseBlueprint(const FieldSpec &field, const IRequestContext & requestContext) +SimplePhraseBlueprint::SimplePhraseBlueprint(const FieldSpec &field, const IRequestContext & requestContext, bool expensive) : ComplexLeafBlueprint(field), _doom(requestContext.getSoftDoom()), _field(field), @@ -17,6 +17,9 @@ SimplePhraseBlueprint::SimplePhraseBlueprint(const FieldSpec &field, const IRequ _layout(), _terms() { + if (expensive) { + set_cost_tier(State::COST_TIER_EXPENSIVE); + } } SimplePhraseBlueprint::~SimplePhraseBlueprint() diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h index 26668f85cb7..c313c0b38ad 100644 --- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h @@ -23,7 +23,7 @@ private: SimplePhraseBlueprint &operator=(const SimplePhraseBlueprint &); // disabled public: - SimplePhraseBlueprint(const FieldSpec &field, const IRequestContext & requestContext); + SimplePhraseBlueprint(const FieldSpec &field, const IRequestContext & requestContext, bool expensive); ~SimplePhraseBlueprint(); // used by create visitor |