From 17a6c5033b0b45becf8a3ef382d51599fe9afd57 Mon Sep 17 00:00:00 2001 From: HÃ¥vard Pettersen Date: Tue, 10 Sep 2019 11:18:29 +0000 Subject: add expensive flags to phrase/same element they will affect the iterator cost tier --- .../tests/queryeval/same_element/same_element_test.cpp | 2 +- .../queryeval/simple_phrase/simple_phrase_test.cpp | 6 +++--- .../src/vespa/searchlib/query/tree/intermediatenodes.h | 17 +++++++++++++++-- .../src/vespa/searchlib/query/tree/queryreplicator.h | 7 +++---- .../queryeval/create_blueprint_visitor_helper.cpp | 2 +- .../searchlib/queryeval/same_element_blueprint.cpp | 5 ++++- .../vespa/searchlib/queryeval/same_element_blueprint.h | 2 +- .../searchlib/queryeval/simple_phrase_blueprint.cpp | 5 ++++- .../vespa/searchlib/queryeval/simple_phrase_blueprint.h | 2 +- 9 files changed, 33 insertions(+), 15 deletions(-) (limited to 'searchlib/src') 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 make_blueprint(const std::vector &children, bool fake_attr = false) { - auto result = std::make_unique(); + auto result = std::make_unique(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::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 class Phrase : public QueryNodeMixin, 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 { 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, 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(_field, _requestContext); + auto phrase = std::make_unique(_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 _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 -- cgit v1.2.3