diff options
author | Håvard Pettersen <havardpe@oath.com> | 2019-10-02 14:16:29 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2019-10-02 14:30:51 +0000 |
commit | 8c9ddd4a626e43d564c1aea343a7cf706c486fee (patch) | |
tree | df70a4b754439741d882b58d0d2acf79b00adfd2 /searchlib | |
parent | f2779a77280698ff06c5fe3b1b85d34b95180a6e (diff) |
collect matching elements by using SameElement blueprints
Diffstat (limited to 'searchlib')
4 files changed, 22 insertions, 10 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 622c8077c14..a4ca1ade999 100644 --- a/searchlib/src/tests/queryeval/same_element/same_element_test.cpp +++ b/searchlib/src/tests/queryeval/same_element/same_element_test.cpp @@ -23,7 +23,7 @@ void verify_elements(SameElementSearch &se, uint32_t docid, const std::initializ } std::unique_ptr<SameElementBlueprint> make_blueprint(const std::vector<FakeResult> &children, bool fake_attr = false) { - auto result = std::make_unique<SameElementBlueprint>(false); + auto result = std::make_unique<SameElementBlueprint>("foo", 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/vespa/searchlib/common/struct_field_mapper.h b/searchlib/src/vespa/searchlib/common/struct_field_mapper.h index 07951db99f7..1d0604daec3 100644 --- a/searchlib/src/vespa/searchlib/common/struct_field_mapper.h +++ b/searchlib/src/vespa/searchlib/common/struct_field_mapper.h @@ -22,6 +22,7 @@ private: public: StructFieldMapper(); ~StructFieldMapper(); + bool empty() const { return _struct_fields.empty(); } void add_mapping(const vespalib::string &struct_field_name, const vespalib::string &struct_subfield_name) { diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index 2376b129fc1..9b84136e67c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -10,11 +10,12 @@ namespace search::queryeval { -SameElementBlueprint::SameElementBlueprint(bool expensive) +SameElementBlueprint::SameElementBlueprint(const vespalib::string &struct_field_name_in, bool expensive) : ComplexLeafBlueprint(FieldSpecBaseList()), _estimate(), _layout(), - _terms() + _terms(), + _struct_field_name(struct_field_name_in) { if (expensive) { set_cost_tier(State::COST_TIER_EXPENSIVE); @@ -60,13 +61,9 @@ SameElementBlueprint::fetchPostings(bool strict) } } -SearchIterator::UP -SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, - bool strict) const +std::unique_ptr<SameElementSearch> +SameElementBlueprint::create_same_element_search(bool strict) const { - (void) tfmda; - assert(!tfmda.valid()); - fef::MatchDataLayout my_layout = _layout; std::vector<fef::TermFieldHandle> extra_handles; for (size_t i = 0; i < _terms.size(); ++i) { @@ -93,6 +90,15 @@ SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArra return std::make_unique<SameElementSearch>(std::move(md), std::move(children), childMatch, strict); } +SearchIterator::UP +SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, + bool strict) const +{ + (void) tfmda; + assert(!tfmda.valid()); + return create_same_element_search(strict); +} + void SameElementBlueprint::visitMembers(vespalib::ObjectVisitor &visitor) const { diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h index 3b29e518aa1..e6fe9f8929c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h @@ -9,15 +9,18 @@ namespace search::fef { class TermFieldMatchData; } namespace search::queryeval { +class SameElementSearch; + class SameElementBlueprint : public ComplexLeafBlueprint { private: HitEstimate _estimate; fef::MatchDataLayout _layout; std::vector<Blueprint::UP> _terms; + vespalib::string _struct_field_name; public: - SameElementBlueprint(bool expensive); + SameElementBlueprint(const vespalib::string &struct_field_name_in, bool expensive); SameElementBlueprint(const SameElementBlueprint &) = delete; SameElementBlueprint &operator=(const SameElementBlueprint &) = delete; ~SameElementBlueprint(); @@ -34,10 +37,12 @@ public: void optimize_self() override; void fetchPostings(bool strict) override; + std::unique_ptr<SameElementSearch> create_same_element_search(bool strict) const; SearchIteratorUP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override; void visitMembers(vespalib::ObjectVisitor &visitor) const override; const std::vector<Blueprint::UP> &terms() const { return _terms; } + const vespalib::string &struct_field_name() const { return _struct_field_name; } }; } |