diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-05-20 13:10:09 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2020-05-20 13:10:09 +0000 |
commit | 47e95a1a3506525c832517a4f8b0e925c9f12c02 (patch) | |
tree | 669e929e6f21741c880e95a131409c26241dbe19 | |
parent | eb1e9294ad2c207f7c9b465f42d2b3de72fd336e (diff) |
Prepare to support matched-elements-only for arrays and weighted sets of primitive types.
This renames StructFieldMapper to MatchingElementsFields with added support for basic fields.
Also some terminology is aligned.
47 files changed, 353 insertions, 344 deletions
diff --git a/searchcore/src/tests/proton/matching/matching_test.cpp b/searchcore/src/tests/proton/matching/matching_test.cpp index 00a319db394..9d5b67af81c 100644 --- a/searchcore/src/tests/proton/matching/matching_test.cpp +++ b/searchcore/src/tests/proton/matching/matching_test.cpp @@ -363,10 +363,10 @@ struct MyWorld { return docsum_matcher->get_rank_features(); } - MatchingElements::UP get_matching_elements(const DocsumRequest &req, const StructFieldMapper &mapper) { + MatchingElements::UP get_matching_elements(const DocsumRequest &req, const MatchingElementsFields &fields) { Matcher::SP matcher = createMatcher(); auto docsum_matcher = matcher->create_docsum_matcher(req, searchContext, attributeContext, *sessionManager); - return docsum_matcher->get_matching_elements(mapper); + return docsum_matcher->get_matching_elements(fields); } }; @@ -922,10 +922,10 @@ TEST("require that docsum matcher can extract matching elements from same elemen world.basicSetup(); world.add_same_element_results("foo", "bar"); auto request = world.create_docsum_request(make_same_element_stack_dump("foo", "bar"), {20}); - StructFieldMapper mapper; - mapper.add_mapping("my", "my.a1"); - mapper.add_mapping("my", "my.f1"); - auto result = world.get_matching_elements(*request, mapper); + MatchingElementsFields fields; + fields.add_mapping("my", "my.a1"); + fields.add_mapping("my", "my.f1"); + auto result = world.get_matching_elements(*request, fields); const auto &list = result->get_matching_elements(20, "my"); ASSERT_EQUAL(list.size(), 1u); EXPECT_EQUAL(list[0], 2u); @@ -936,10 +936,10 @@ TEST("require that docsum matcher can extract matching elements from single attr world.basicSetup(); world.add_same_element_results("foo", "bar"); auto request = world.create_docsum_request(make_simple_stack_dump("my.a1", "foo"), {20}); - StructFieldMapper mapper; - mapper.add_mapping("my", "my.a1"); - mapper.add_mapping("my", "my.f1"); - auto result = world.get_matching_elements(*request, mapper); + MatchingElementsFields fields; + fields.add_mapping("my", "my.a1"); + fields.add_mapping("my", "my.f1"); + auto result = world.get_matching_elements(*request, fields); const auto &list = result->get_matching_elements(20, "my"); ASSERT_EQUAL(list.size(), 2u); EXPECT_EQUAL(list[0], 2u); diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp index 872b4b27584..4fcd5aff4f9 100644 --- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp @@ -214,10 +214,10 @@ DocsumContext::ParseLocation(search::docsummary::GetDocsumsState *state) } std::unique_ptr<MatchingElements> -DocsumContext::fill_matching_elements(const StructFieldMapper &struct_field_mapper) +DocsumContext::fill_matching_elements(const MatchingElementsFields &fields) { if (_matcher) { - return _matcher->get_matching_elements(_request, _searchCtx, _attrCtx, _sessionMgr, struct_field_mapper); + return _matcher->get_matching_elements(_request, _searchCtx, _attrCtx, _sessionMgr, fields); } return std::make_unique<MatchingElements>(); } diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.h b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.h index 467add7face..1624048828f 100644 --- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.h +++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.h @@ -53,7 +53,7 @@ public: void FillSummaryFeatures(search::docsummary::GetDocsumsState * state, search::docsummary::IDocsumEnvironment * env) override; void FillRankFeatures(search::docsummary::GetDocsumsState * state, search::docsummary::IDocsumEnvironment * env) override; void ParseLocation(search::docsummary::GetDocsumsState * state) override; - std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::StructFieldMapper &struct_field_mapper) override; + std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::MatchingElementsFields &fields) override; }; } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.cpp b/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.cpp index a9f87cb249e..c8d0a572cd9 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.cpp @@ -19,7 +19,7 @@ LOG_SETUP(".proton.matching.docsum_matcher"); using search::FeatureSet; using search::MatchingElements; -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::fef::FeatureResolver; using search::fef::RankProgram; using search::queryeval::AndNotBlueprint; @@ -100,13 +100,13 @@ void find_matching_elements(const std::vector<uint32_t> &docs, const SameElement for (uint32_t i = 0; i < docs.size(); ++i) { search->find_matching_elements(docs[i], matches); if (!matches.empty()) { - result.add_matching_elements(docs[i], same_element.struct_field_name(), matches); + result.add_matching_elements(docs[i], same_element.field_name(), matches); matches.clear(); } } } -void find_matching_elements(const std::vector<uint32_t> &docs, const vespalib::string &struct_field_name, const AttrSearchCtx &attr_ctx, MatchingElements &result) { +void find_matching_elements(const std::vector<uint32_t> &docs, const vespalib::string &field_name, const AttrSearchCtx &attr_ctx, MatchingElements &result) { int32_t weight = 0; std::vector<uint32_t> matches; for (uint32_t i = 0; i < docs.size(); ++i) { @@ -114,26 +114,26 @@ void find_matching_elements(const std::vector<uint32_t> &docs, const vespalib::s matches.push_back(id); } if (!matches.empty()) { - result.add_matching_elements(docs[i], struct_field_name, matches); + result.add_matching_elements(docs[i], field_name, matches); matches.clear(); } } } -void find_matching_elements(const StructFieldMapper &mapper, const std::vector<uint32_t> &docs, const Blueprint &bp, MatchingElements &result) { +void find_matching_elements(const MatchingElementsFields &fields, const std::vector<uint32_t> &docs, const Blueprint &bp, MatchingElements &result) { if (auto same_element = as<SameElementBlueprint>(bp)) { - if (mapper.is_struct_field(same_element->struct_field_name())) { + if (fields.has_field(same_element->field_name())) { find_matching_elements(docs, *same_element, result); } } else if (const AttrSearchCtx *attr_ctx = bp.get_attribute_search_context()) { - if (mapper.is_struct_subfield(attr_ctx->attributeName())) { - find_matching_elements(docs, mapper.get_struct_field(attr_ctx->attributeName()), *attr_ctx, result); + if (fields.has_struct_field(attr_ctx->attributeName())) { + find_matching_elements(docs, fields.get_enclosing_field(attr_ctx->attributeName()), *attr_ctx, result); } } else if (auto and_not = as<AndNotBlueprint>(bp)) { - find_matching_elements(mapper, docs, and_not->getChild(0), result); + find_matching_elements(fields, docs, and_not->getChild(0), result); } else if (auto intermediate = as<IntermediateBlueprint>(bp)) { for (size_t i = 0; i < intermediate->childCnt(); ++i) { - find_matching_elements(mapper, docs, intermediate->getChild(i), result); + find_matching_elements(fields, docs, intermediate->getChild(i), result); } } } @@ -189,12 +189,12 @@ DocsumMatcher::get_rank_features() const } MatchingElements::UP -DocsumMatcher::get_matching_elements(const StructFieldMapper &field_mapper) const +DocsumMatcher::get_matching_elements(const MatchingElementsFields &fields) const { auto result = std::make_unique<MatchingElements>(); - if (_mtf && !field_mapper.empty()) { + if (_mtf && !fields.empty()) { if (const Blueprint *root = _mtf->query().peekRoot()) { - find_matching_elements(field_mapper, _docs, *root, *result); + find_matching_elements(fields, _docs, *root, *result); } } return result; diff --git a/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.h b/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.h index 7fdfbc1d2ba..2e2250c476c 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.h +++ b/searchcore/src/vespa/searchcore/proton/matching/docsum_matcher.h @@ -3,8 +3,8 @@ #pragma once #include <vespa/searchlib/common/featureset.h> -#include <vespa/searchlib/common/struct_field_mapper.h> #include <vespa/searchlib/common/matching_elements.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vector> #include <memory> @@ -22,7 +22,7 @@ class DocsumMatcher { private: using FeatureSet = search::FeatureSet; - using StructFieldMapper = search::StructFieldMapper; + using MatchingElementsFields = search::MatchingElementsFields; using MatchingElements = search::MatchingElements; std::shared_ptr<SearchSession> _from_session; @@ -40,7 +40,7 @@ public: FeatureSet::UP get_summary_features() const; FeatureSet::UP get_rank_features() const; - MatchingElements::UP get_matching_elements(const StructFieldMapper &field_mapper) const; + MatchingElements::UP get_matching_elements(const MatchingElementsFields &fields) const; }; } diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp index 630ac66f4f1..93b4f63060f 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.cpp @@ -27,7 +27,7 @@ using namespace search::grouping; using search::DocumentMetaData; using search::LidUsageStats; using search::FeatureSet; -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::MatchingElements; using search::attribute::IAttributeContext; using search::fef::MatchDataLayout; @@ -336,10 +336,10 @@ Matcher::getRankFeatures(const DocsumRequest & req, ISearchContext & searchCtx, MatchingElements::UP Matcher::get_matching_elements(const DocsumRequest &req, ISearchContext &search_ctx, IAttributeContext &attr_ctx, SessionManager &session_manager, - const StructFieldMapper &field_mapper) + const MatchingElementsFields &fields) { auto docsum_matcher = create_docsum_matcher(req, search_ctx, attr_ctx, session_manager); - return docsum_matcher->get_matching_elements(field_mapper); + return docsum_matcher->get_matching_elements(fields); } DocsumMatcher::UP diff --git a/searchcore/src/vespa/searchcore/proton/matching/matcher.h b/searchcore/src/vespa/searchcore/proton/matching/matcher.h index 14562ffd6ca..243fdad63ae 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/matcher.h +++ b/searchcore/src/vespa/searchcore/proton/matching/matcher.h @@ -12,7 +12,7 @@ #include <vespa/searchcommon/attribute/i_attribute_functor.h> #include <vespa/searchlib/fef/blueprintfactory.h> #include <vespa/searchlib/common/featureset.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/searchlib/common/matching_elements.h> #include <vespa/searchlib/common/resultset.h> #include <vespa/searchlib/queryeval/blueprint.h> @@ -54,8 +54,8 @@ private: using SearchRequest = search::engine::SearchRequest; using Properties = search::fef::Properties; using my_clock = std::chrono::steady_clock; - using StructFieldMapper = search::StructFieldMapper; using MatchingElements = search::MatchingElements; + using MatchingElementsFields = search::MatchingElementsFields; IndexEnvironment _indexEnv; search::fef::BlueprintFactory _blueprintFactory; std::shared_ptr<search::fef::RankSetup> _rankSetup; @@ -162,13 +162,13 @@ public: * @param search_ctx abstract view of searchable data * @param attr_ctx abstract view of attribute data * @param session_manager multilevel grouping session and query cache - * @param field_mapper knows which fields to collect information - * about and how they relate to each other + * @param fields knows which fields to collect information + * about and how they relate to each other * @return matching elements **/ MatchingElements::UP get_matching_elements(const DocsumRequest &req, ISearchContext &search_ctx, IAttributeContext &attr_ctx, SessionManager &session_manager, - const StructFieldMapper &field_mapper); + const MatchingElementsFields &fields); DocsumMatcher::UP create_docsum_matcher(const DocsumRequest &req, ISearchContext &search_ctx, IAttributeContext &attr_ctx, SessionManager &session_manager); diff --git a/searchlib/CMakeLists.txt b/searchlib/CMakeLists.txt index 47b382af3f1..e9e2087e9d1 100644 --- a/searchlib/CMakeLists.txt +++ b/searchlib/CMakeLists.txt @@ -104,8 +104,8 @@ vespa_define_module( src/tests/common/bitvector src/tests/common/location src/tests/common/matching_elements + src/tests/common/matching_elements_fields src/tests/common/resultset - src/tests/common/struct_field_mapper src/tests/common/summaryfeatures src/tests/diskindex/bitvector src/tests/diskindex/diskindex diff --git a/searchlib/src/tests/common/matching_elements_fields/CMakeLists.txt b/searchlib/src/tests/common/matching_elements_fields/CMakeLists.txt new file mode 100644 index 00000000000..3d6f338315a --- /dev/null +++ b/searchlib/src/tests/common/matching_elements_fields/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchlib_common_matching_elements_fields_test_app TEST + SOURCES + matching_elements_fields_test.cpp + DEPENDS + searchlib + gtest +) +vespa_add_test(NAME searchlib_common_matching_elements_fields_test_app COMMAND searchlib_common_matching_elements_fields_test_app) diff --git a/searchlib/src/tests/common/matching_elements_fields/matching_elements_fields_test.cpp b/searchlib/src/tests/common/matching_elements_fields/matching_elements_fields_test.cpp new file mode 100644 index 00000000000..766be30f8f1 --- /dev/null +++ b/searchlib/src/tests/common/matching_elements_fields/matching_elements_fields_test.cpp @@ -0,0 +1,55 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/vespalib/gtest/gtest.h> +#include <vespa/searchlib/common/matching_elements_fields.h> + +using namespace search; + +namespace { + +std::string str(const vespalib::string &s) { return std::string(s.data(), s.size()); } + +} + +struct MatchingElementsFieldsTest : ::testing::Test { + MatchingElementsFields fields; + MatchingElementsFieldsTest() : fields() { + fields.add_mapping("foo", "foo.a"); + fields.add_mapping("foo", "foo.b"); + fields.add_mapping("bar", "bar.x"); + fields.add_mapping("bar", "bar.y"); + fields.add_field("baz"); + } + ~MatchingElementsFieldsTest() = default; +}; + +TEST_F(MatchingElementsFieldsTest, require_that_field_can_be_identified) { + EXPECT_TRUE(fields.has_field("foo")); + EXPECT_TRUE(fields.has_field("bar")); + EXPECT_TRUE(fields.has_field("baz")); + EXPECT_TRUE(!fields.has_field("foo.a")); + EXPECT_TRUE(!fields.has_field("bar.x")); + EXPECT_TRUE(!fields.has_field("bogus")); +} + +TEST_F(MatchingElementsFieldsTest, require_that_struct_field_can_be_identified) { + EXPECT_TRUE(!fields.has_struct_field("foo")); + EXPECT_TRUE(!fields.has_struct_field("bar")); + EXPECT_TRUE(!fields.has_struct_field("baz")); + EXPECT_TRUE(fields.has_struct_field("foo.a")); + EXPECT_TRUE(fields.has_struct_field("bar.x")); + EXPECT_TRUE(!fields.has_struct_field("bogus")); +} + +TEST_F(MatchingElementsFieldsTest, require_that_struct_field_maps_to_enclosing_field_name) { + EXPECT_EQ(str(fields.get_enclosing_field("foo.a")), str("foo")); + EXPECT_EQ(str(fields.get_enclosing_field("foo.b")), str("foo")); + EXPECT_EQ(str(fields.get_enclosing_field("bar.x")), str("bar")); + EXPECT_EQ(str(fields.get_enclosing_field("bar.y")), str("bar")); +} + +TEST_F(MatchingElementsFieldsTest, require_that_nonexisting_struct_field_maps_to_empty_string) { + EXPECT_EQ(str(fields.get_enclosing_field("bogus")), str("")); +} + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/tests/common/struct_field_mapper/CMakeLists.txt b/searchlib/src/tests/common/struct_field_mapper/CMakeLists.txt deleted file mode 100644 index f5712d22989..00000000000 --- a/searchlib/src/tests/common/struct_field_mapper/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -vespa_add_executable(searchlib_common_struct_field_mapper_test_app TEST - SOURCES - struct_field_mapper_test.cpp - DEPENDS - searchlib - gtest -) -vespa_add_test(NAME searchlib_common_struct_field_mapper_test_app COMMAND searchlib_common_struct_field_mapper_test_app) diff --git a/searchlib/src/tests/common/struct_field_mapper/struct_field_mapper_test.cpp b/searchlib/src/tests/common/struct_field_mapper/struct_field_mapper_test.cpp deleted file mode 100644 index c5368111859..00000000000 --- a/searchlib/src/tests/common/struct_field_mapper/struct_field_mapper_test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#include <vespa/vespalib/gtest/gtest.h> -#include <vespa/searchlib/common/struct_field_mapper.h> - -using namespace search; - -namespace { - -std::string str(const vespalib::string &s) { return std::string(s.data(), s.size()); } - -} - -struct StructFieldMapperTest : ::testing::Test { - StructFieldMapper mapper; - StructFieldMapperTest() : mapper() { - mapper.add_mapping("foo", "foo.a"); - mapper.add_mapping("foo", "foo.b"); - mapper.add_mapping("bar", "bar.x"); - mapper.add_mapping("bar", "bar.y"); - } - ~StructFieldMapperTest() = default; -}; - -TEST_F(StructFieldMapperTest, require_that_struct_field_can_be_identified) { - EXPECT_TRUE(mapper.is_struct_field("foo")); - EXPECT_TRUE(mapper.is_struct_field("bar")); - EXPECT_TRUE(!mapper.is_struct_field("foo.a")); - EXPECT_TRUE(!mapper.is_struct_field("bar.x")); - EXPECT_TRUE(!mapper.is_struct_field("bogus")); -} - -TEST_F(StructFieldMapperTest, require_that_struct_subfield_can_be_identified) { - EXPECT_TRUE(!mapper.is_struct_subfield("foo")); - EXPECT_TRUE(!mapper.is_struct_subfield("bar")); - EXPECT_TRUE(mapper.is_struct_subfield("foo.a")); - EXPECT_TRUE(mapper.is_struct_subfield("bar.x")); - EXPECT_TRUE(!mapper.is_struct_subfield("bogus")); -} - -TEST_F(StructFieldMapperTest, require_that_struct_subfield_maps_to_enclosing_struct_field_name) { - EXPECT_EQ(str(mapper.get_struct_field("foo.a")), str("foo")); - EXPECT_EQ(str(mapper.get_struct_field("foo.b")), str("foo")); - EXPECT_EQ(str(mapper.get_struct_field("bar.x")), str("bar")); - EXPECT_EQ(str(mapper.get_struct_field("bar.y")), str("bar")); -} - -TEST_F(StructFieldMapperTest, require_that_nonexisting_struct_subfield_maps_to_empty_string) { - EXPECT_EQ(str(mapper.get_struct_field("bogus")), str("")); -} - -GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/vespa/searchlib/common/CMakeLists.txt b/searchlib/src/vespa/searchlib/common/CMakeLists.txt index 36264a2035b..5d30260a169 100644 --- a/searchlib/src/vespa/searchlib/common/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/common/CMakeLists.txt @@ -18,6 +18,7 @@ vespa_add_library(searchlib_common OBJECT locationiterators.cpp mapnames.cpp matching_elements.cpp + matching_elements_fields.cpp packets.cpp partialbitvector.cpp resultset.cpp @@ -26,7 +27,6 @@ vespa_add_library(searchlib_common OBJECT sortdata.cpp sortresults.cpp sortspec.cpp - struct_field_mapper.cpp threaded_compactable_lid_space.cpp tunefileinfo.cpp DEPENDS diff --git a/searchlib/src/vespa/searchlib/common/matching_elements.cpp b/searchlib/src/vespa/searchlib/common/matching_elements.cpp index 1a4653e267b..87049f7d843 100644 --- a/searchlib/src/vespa/searchlib/common/matching_elements.cpp +++ b/searchlib/src/vespa/searchlib/common/matching_elements.cpp @@ -9,19 +9,19 @@ MatchingElements::MatchingElements() = default; MatchingElements::~MatchingElements() = default; void -MatchingElements::add_matching_elements(uint32_t docid, const vespalib::string &struct_field_name, const std::vector<uint32_t> &elements) +MatchingElements::add_matching_elements(uint32_t docid, const vespalib::string &field_name, const std::vector<uint32_t> &elements) { - auto &list = _map[key_t(docid, struct_field_name)]; + auto &list = _map[key_t(docid, field_name)]; std::vector<uint32_t> new_list; std::set_union(list.begin(), list.end(), elements.begin(), elements.end(), std::back_inserter(new_list)); list = std::move(new_list); } const std::vector<uint32_t> & -MatchingElements::get_matching_elements(uint32_t docid, const vespalib::string &struct_field_name) const +MatchingElements::get_matching_elements(uint32_t docid, const vespalib::string &field_name) const { static const std::vector<uint32_t> empty; - auto res = _map.find(key_t(docid, struct_field_name)); + auto res = _map.find(key_t(docid, field_name)); if (res == _map.end()) { return empty; } diff --git a/searchlib/src/vespa/searchlib/common/matching_elements.h b/searchlib/src/vespa/searchlib/common/matching_elements.h index b31b258ea4c..60fe7167bfd 100644 --- a/searchlib/src/vespa/searchlib/common/matching_elements.h +++ b/searchlib/src/vespa/searchlib/common/matching_elements.h @@ -9,8 +9,8 @@ namespace search { /** - * Keeps track of which elements matched the query for a set of struct - * fields across multiple documents. + * Keeps track of which elements matched the query for a set of fields + * across multiple documents. **/ class MatchingElements { @@ -26,8 +26,8 @@ public: using UP = std::unique_ptr<MatchingElements>; - void add_matching_elements(uint32_t docid, const vespalib::string &struct_field_name, const std::vector<uint32_t> &elements); - const std::vector<uint32_t> &get_matching_elements(uint32_t docid, const vespalib::string &struct_field_name) const; + void add_matching_elements(uint32_t docid, const vespalib::string &field_name, const std::vector<uint32_t> &elements); + const std::vector<uint32_t> &get_matching_elements(uint32_t docid, const vespalib::string &field_name) const; }; } // namespace search diff --git a/searchlib/src/vespa/searchlib/common/matching_elements_fields.cpp b/searchlib/src/vespa/searchlib/common/matching_elements_fields.cpp new file mode 100644 index 00000000000..b36e1eb333e --- /dev/null +++ b/searchlib/src/vespa/searchlib/common/matching_elements_fields.cpp @@ -0,0 +1,10 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "matching_elements_fields.h" + +namespace search { + +MatchingElementsFields::MatchingElementsFields() = default; +MatchingElementsFields::~MatchingElementsFields() = default; + +} // namespace search diff --git a/searchlib/src/vespa/searchlib/common/matching_elements_fields.h b/searchlib/src/vespa/searchlib/common/matching_elements_fields.h new file mode 100644 index 00000000000..f8bb0f373fe --- /dev/null +++ b/searchlib/src/vespa/searchlib/common/matching_elements_fields.h @@ -0,0 +1,51 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/vespalib/stllike/string.h> +#include <set> +#include <map> + +namespace search { + +/** + * Keeps track of a set of field names to calculate MatchingElements for. + * + * Also has mapping of the full name of struct fields into the name of the enclosing field. + * Example: + * A map<string, string> field "my_map" could contain two struct fields: "my_map.key" and "my_map.value". + **/ +class MatchingElementsFields { +private: + std::set<vespalib::string> _fields; + std::map<vespalib::string, vespalib::string> _struct_fields; + +public: + MatchingElementsFields(); + ~MatchingElementsFields(); + bool empty() const { return _fields.empty(); } + void add_field(const vespalib::string &field_name) { + _fields.insert(field_name); + } + void add_mapping(const vespalib::string &field_name, + const vespalib::string &struct_field_name) { + _fields.insert(field_name); + _struct_fields[struct_field_name] = field_name; + } + bool has_field(const vespalib::string &field_name) const { + return (_fields.count(field_name) > 0); + } + bool has_struct_field(const vespalib::string &struct_field_name) const { + return (_struct_fields.find(struct_field_name) != _struct_fields.end()); + } + const vespalib::string &get_enclosing_field(const vespalib::string &struct_field_name) const { + static const vespalib::string empty; + auto res = _struct_fields.find(struct_field_name); + if (res == _struct_fields.end()) { + return empty; + } + return res->second; + } +}; + +} // namespace search diff --git a/searchlib/src/vespa/searchlib/common/struct_field_mapper.cpp b/searchlib/src/vespa/searchlib/common/struct_field_mapper.cpp deleted file mode 100644 index 849cfd06ade..00000000000 --- a/searchlib/src/vespa/searchlib/common/struct_field_mapper.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#include "struct_field_mapper.h" - -namespace search { - -StructFieldMapper::StructFieldMapper() = default; -StructFieldMapper::~StructFieldMapper() = default; - -} // namespace search diff --git a/searchlib/src/vespa/searchlib/common/struct_field_mapper.h b/searchlib/src/vespa/searchlib/common/struct_field_mapper.h deleted file mode 100644 index 1d0604daec3..00000000000 --- a/searchlib/src/vespa/searchlib/common/struct_field_mapper.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#pragma once - -#include <vespa/vespalib/stllike/string.h> -#include <set> -#include <map> - -namespace search { - -/** - * Keeps track of a set of struct field names and enables mapping the - * full name of struct subfields into the name of the enclosing struct - * field. - **/ -class StructFieldMapper -{ -private: - std::set<vespalib::string> _struct_fields; - std::map<vespalib::string,vespalib::string> _struct_subfields; - -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) - { - _struct_fields.insert(struct_field_name); - _struct_subfields[struct_subfield_name] = struct_field_name; - } - bool is_struct_field(const vespalib::string &field_name) const { - return (_struct_fields.count(field_name) > 0); - } - bool is_struct_subfield(const vespalib::string &field_name) const { - return (_struct_subfields.find(field_name) != _struct_subfields.end()); - } - const vespalib::string &get_struct_field(const vespalib::string &struct_subfield_name) const { - static const vespalib::string empty; - auto res = _struct_subfields.find(struct_subfield_name); - if (res == _struct_subfields.end()) { - return empty; - } - return res->second; - } -}; - -} // namespace search diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index d1e0a2528e7..ac4f164b09f 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -11,12 +11,12 @@ namespace search::queryeval { -SameElementBlueprint::SameElementBlueprint(const vespalib::string &struct_field_name_in, bool expensive) +SameElementBlueprint::SameElementBlueprint(const vespalib::string &field_name_in, bool expensive) : ComplexLeafBlueprint(FieldSpecBaseList()), _estimate(), _layout(), _terms(), - _struct_field_name(struct_field_name_in) + _field_name(field_name_in) { if (expensive) { set_cost_tier(State::COST_TIER_EXPENSIVE); diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h index fc19abe4c5e..8d647ac3a32 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h @@ -17,10 +17,10 @@ private: HitEstimate _estimate; fef::MatchDataLayout _layout; std::vector<Blueprint::UP> _terms; - vespalib::string _struct_field_name; + vespalib::string _field_name; public: - SameElementBlueprint(const vespalib::string &struct_field_name_in, bool expensive); + SameElementBlueprint(const vespalib::string &field_name_in, bool expensive); SameElementBlueprint(const SameElementBlueprint &) = delete; SameElementBlueprint &operator=(const SameElementBlueprint &) = delete; ~SameElementBlueprint(); @@ -42,7 +42,7 @@ public: 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; } + const vespalib::string &field_name() const { return _field_name; } }; } diff --git a/searchsummary/src/tests/docsummary/attribute_combiner/attribute_combiner_test.cpp b/searchsummary/src/tests/docsummary/attribute_combiner/attribute_combiner_test.cpp index 7a82187f355..ae8e5f88c28 100644 --- a/searchsummary/src/tests/docsummary/attribute_combiner/attribute_combiner_test.cpp +++ b/searchsummary/src/tests/docsummary/attribute_combiner/attribute_combiner_test.cpp @@ -9,7 +9,7 @@ #include <vespa/searchlib/attribute/integerbase.h> #include <vespa/searchlib/attribute/stringbase.h> #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/searchlib/util/slime_output_raw_buf_adapter.h> #include <vespa/searchsummary/docsummary/docsumstate.h> #include <vespa/searchsummary/docsummary/docsum_field_writer_state.h> @@ -171,7 +171,7 @@ public: void FillSummaryFeatures(GetDocsumsState *, IDocsumEnvironment *) override { } void FillRankFeatures(GetDocsumsState *, IDocsumEnvironment *) override { } void ParseLocation(GetDocsumsState *) override { } - std::unique_ptr<MatchingElements> fill_matching_elements(const search::StructFieldMapper &) override { return std::make_unique<MatchingElements>(_matching_elements); } + std::unique_ptr<MatchingElements> fill_matching_elements(const search::MatchingElementsFields &) override { return std::make_unique<MatchingElements>(_matching_elements); } ~DummyStateCallback() override { } }; @@ -196,7 +196,7 @@ struct AttributeCombinerTest : public ::testing::Test std::unique_ptr<IDocsumFieldWriter> writer; DummyStateCallback stateCallback; GetDocsumsState state; - std::shared_ptr<search::StructFieldMapper> _struct_field_mapper; + std::shared_ptr<search::MatchingElementsFields> _matching_elems_fields; AttributeCombinerTest(); ~AttributeCombinerTest(); @@ -209,7 +209,7 @@ AttributeCombinerTest::AttributeCombinerTest() writer(), stateCallback(), state(stateCallback), - _struct_field_mapper() + _matching_elems_fields() { state._attrCtx = attrs.mgr.createContext(); } @@ -220,9 +220,9 @@ void AttributeCombinerTest::set_field(const vespalib::string &field_name, bool filter_elements) { if (filter_elements) { - _struct_field_mapper = std::make_shared<search::StructFieldMapper>(); + _matching_elems_fields = std::make_shared<search::MatchingElementsFields>(); } - writer = AttributeCombinerDFW::create(field_name, *state._attrCtx, filter_elements, _struct_field_mapper); + writer = AttributeCombinerDFW::create(field_name, *state._attrCtx, filter_elements, _matching_elems_fields); EXPECT_TRUE(writer->setFieldWriterStateIndex(0)); state._fieldWriterStates.resize(1); } @@ -308,43 +308,43 @@ TEST_F(AttributeCombinerTest, require_that_attribute_combiner_dfw_generates_corr assertWritten("null", 5); } -TEST_F(AttributeCombinerTest, require_that_struct_field_mapper_is_setup_for_filtered_array_of_struct) +TEST_F(AttributeCombinerTest, require_that_matching_elems_fields_is_setup_for_filtered_array_of_struct) { set_field("array", true); - EXPECT_TRUE(_struct_field_mapper); - EXPECT_TRUE(_struct_field_mapper->is_struct_field("array")); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("map")); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("smap")); - EXPECT_EQ("", _struct_field_mapper->get_struct_field("array.foo")); - EXPECT_EQ("array", _struct_field_mapper->get_struct_field("array.name")); - EXPECT_EQ("array", _struct_field_mapper->get_struct_field("array.val")); - EXPECT_EQ("array", _struct_field_mapper->get_struct_field("array.fval")); + EXPECT_TRUE(_matching_elems_fields); + EXPECT_TRUE(_matching_elems_fields->has_field("array")); + EXPECT_FALSE(_matching_elems_fields->has_field("map")); + EXPECT_FALSE(_matching_elems_fields->has_field("smap")); + EXPECT_EQ("", _matching_elems_fields->get_enclosing_field("array.foo")); + EXPECT_EQ("array", _matching_elems_fields->get_enclosing_field("array.name")); + EXPECT_EQ("array", _matching_elems_fields->get_enclosing_field("array.val")); + EXPECT_EQ("array", _matching_elems_fields->get_enclosing_field("array.fval")); } -TEST_F(AttributeCombinerTest, require_that_struct_field_mapper_is_setup_for_filtered_map_of_struct) +TEST_F(AttributeCombinerTest, require_that_matching_elems_fields_is_setup_for_filtered_map_of_struct) { set_field("smap", true); - EXPECT_TRUE(_struct_field_mapper); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("array")); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("map")); - EXPECT_TRUE(_struct_field_mapper->is_struct_field("smap")); - EXPECT_EQ("", _struct_field_mapper->get_struct_field("smap.foo")); - EXPECT_EQ("smap", _struct_field_mapper->get_struct_field("smap.key")); - EXPECT_EQ("smap", _struct_field_mapper->get_struct_field("smap.value.name")); - EXPECT_EQ("smap", _struct_field_mapper->get_struct_field("smap.value.val")); - EXPECT_EQ("smap", _struct_field_mapper->get_struct_field("smap.value.fval")); + EXPECT_TRUE(_matching_elems_fields); + EXPECT_FALSE(_matching_elems_fields->has_field("array")); + EXPECT_FALSE(_matching_elems_fields->has_field("map")); + EXPECT_TRUE(_matching_elems_fields->has_field("smap")); + EXPECT_EQ("", _matching_elems_fields->get_enclosing_field("smap.foo")); + EXPECT_EQ("smap", _matching_elems_fields->get_enclosing_field("smap.key")); + EXPECT_EQ("smap", _matching_elems_fields->get_enclosing_field("smap.value.name")); + EXPECT_EQ("smap", _matching_elems_fields->get_enclosing_field("smap.value.val")); + EXPECT_EQ("smap", _matching_elems_fields->get_enclosing_field("smap.value.fval")); } -TEST_F(AttributeCombinerTest, require_that_struct_field_mapper_is_setup_for_filtered_map_of_string) +TEST_F(AttributeCombinerTest, require_that_matching_elems_fields_is_setup_for_filtered_map_of_string) { set_field("map", true); - EXPECT_TRUE(_struct_field_mapper); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("array")); - EXPECT_TRUE(_struct_field_mapper->is_struct_field("map")); - EXPECT_FALSE(_struct_field_mapper->is_struct_field("smap")); - EXPECT_EQ("", _struct_field_mapper->get_struct_field("map.foo")); - EXPECT_EQ("map", _struct_field_mapper->get_struct_field("map.key")); - EXPECT_EQ("map", _struct_field_mapper->get_struct_field("map.value")); + EXPECT_TRUE(_matching_elems_fields); + EXPECT_FALSE(_matching_elems_fields->has_field("array")); + EXPECT_TRUE(_matching_elems_fields->has_field("map")); + EXPECT_FALSE(_matching_elems_fields->has_field("smap")); + EXPECT_EQ("", _matching_elems_fields->get_enclosing_field("map.foo")); + EXPECT_EQ("map", _matching_elems_fields->get_enclosing_field("map.key")); + EXPECT_EQ("map", _matching_elems_fields->get_enclosing_field("map.value")); } } diff --git a/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp b/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp index dff3acc5b89..ed91d4a88eb 100644 --- a/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp +++ b/searchsummary/src/tests/docsummary/matched_elements_filter/matched_elements_filter_test.cpp @@ -7,7 +7,7 @@ #include <vespa/searchlib/attribute/attributefactory.h> #include <vespa/searchlib/attribute/attributevector.h> #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/searchlib/util/slime_output_raw_buf_adapter.h> #include <vespa/searchsummary/docsummary/docsumstate.h> #include <vespa/searchsummary/docsummary/idocsumenvironment.h> @@ -26,7 +26,7 @@ LOG_SETUP("matched_elements_filter_test"); using search::AttributeFactory; using search::AttributeVector; using search::MatchingElements; -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::attribute::BasicType; using search::attribute::CollectionType; using search::attribute::Config; @@ -178,7 +178,7 @@ public: void FillSummaryFeatures(GetDocsumsState*, IDocsumEnvironment*) override {} void FillRankFeatures(GetDocsumsState*, IDocsumEnvironment*) override {} void ParseLocation(GetDocsumsState*) override {} - std::unique_ptr<MatchingElements> fill_matching_elements(const StructFieldMapper&) override { + std::unique_ptr<MatchingElements> fill_matching_elements(const MatchingElementsFields&) override { auto result = std::make_unique<MatchingElements>(); result->add_matching_elements(doc_id, _field_name, _matching_elements); return result; @@ -189,7 +189,7 @@ class MatchedElementsFilterTest : public ::testing::Test { private: DocsumStore _doc_store; AttributeContext _attr_ctx; - std::shared_ptr<StructFieldMapper> _mapper; + std::shared_ptr<MatchingElementsFields> _fields; Slime run_filter_field_writer(const std::string& input_field_name, const ElementVector& matching_elements) { auto writer = make_field_writer(input_field_name); @@ -209,21 +209,21 @@ public: MatchedElementsFilterTest() : _doc_store(), _attr_ctx(), - _mapper(std::make_shared<StructFieldMapper>()) + _fields(std::make_shared<MatchingElementsFields>()) { } ~MatchedElementsFilterTest() {} std::unique_ptr<IDocsumFieldWriter> make_field_writer(const std::string& input_field_name) { int input_field_enum = _doc_store.get_config().GetFieldNameEnum().Lookup(input_field_name.c_str()); return MatchedElementsFilterDFW::create(input_field_name, input_field_enum, - _attr_ctx, _mapper); + _attr_ctx, _fields); } void expect_filtered(const std::string& input_field_name, const ElementVector& matching_elements, const std::string& exp_slime_as_json) { Slime act = run_filter_field_writer(input_field_name, matching_elements); SlimeValue exp(exp_slime_as_json); EXPECT_EQ(exp.slime, act); } - const StructFieldMapper& mapper() const { return *_mapper; } + const MatchingElementsFields& fields() const { return *_fields; } }; TEST_F(MatchedElementsFilterTest, filters_elements_in_array_field_value) @@ -249,12 +249,12 @@ TEST_F(MatchedElementsFilterTest, filters_elements_in_array_field_value_when_inp expect_filtered("array_in_doc", {0, 1, 100}, "[]"); } -TEST_F(MatchedElementsFilterTest, struct_field_mapper_is_setup_for_array_field_value) +TEST_F(MatchedElementsFilterTest, matching_elements_fields_is_setup_for_array_field_value) { auto writer = make_field_writer("array"); - EXPECT_TRUE(mapper().is_struct_field("array")); - EXPECT_EQ("", mapper().get_struct_field("array.name")); - EXPECT_EQ("array", mapper().get_struct_field("array.weight")); + EXPECT_TRUE(fields().has_field("array")); + EXPECT_EQ("", fields().get_enclosing_field("array.name")); + EXPECT_EQ("array", fields().get_enclosing_field("array.weight")); } TEST_F(MatchedElementsFilterTest, filters_elements_in_map_field_value) @@ -280,21 +280,21 @@ TEST_F(MatchedElementsFilterTest, filters_elements_in_map_field_value_when_input expect_filtered("map_in_doc", {0, 1, 100}, "[]"); } -TEST_F(MatchedElementsFilterTest, struct_field_mapper_is_setup_for_map_field_value) +TEST_F(MatchedElementsFilterTest, matching_elements_fields_is_setup_for_map_field_value) { { auto writer = make_field_writer("map"); - EXPECT_TRUE(mapper().is_struct_field("map")); - EXPECT_EQ("", mapper().get_struct_field("map.key")); - EXPECT_EQ("map", mapper().get_struct_field("map.value.name")); - EXPECT_EQ("", mapper().get_struct_field("map.value.weight")); + EXPECT_TRUE(fields().has_field("map")); + EXPECT_EQ("", fields().get_enclosing_field("map.key")); + EXPECT_EQ("map", fields().get_enclosing_field("map.value.name")); + EXPECT_EQ("", fields().get_enclosing_field("map.value.weight")); } { auto writer = make_field_writer("map2"); - EXPECT_TRUE(mapper().is_struct_field("map2")); - EXPECT_EQ("map2", mapper().get_struct_field("map2.key")); - EXPECT_EQ("", mapper().get_struct_field("map2.value.name")); - EXPECT_EQ("", mapper().get_struct_field("map2.value.weight")); + EXPECT_TRUE(fields().has_field("map2")); + EXPECT_EQ("map2", fields().get_enclosing_field("map2.key")); + EXPECT_EQ("", fields().get_enclosing_field("map2.value.name")); + EXPECT_EQ("", fields().get_enclosing_field("map2.value.weight")); } } diff --git a/searchsummary/src/tests/docsummary/positionsdfw_test.cpp b/searchsummary/src/tests/docsummary/positionsdfw_test.cpp index 4cad98a8e01..f54b4c19dc3 100644 --- a/searchsummary/src/tests/docsummary/positionsdfw_test.cpp +++ b/searchsummary/src/tests/docsummary/positionsdfw_test.cpp @@ -110,7 +110,7 @@ struct MyGetDocsumsStateCallback : GetDocsumsStateCallback { virtual void FillSummaryFeatures(GetDocsumsState *, IDocsumEnvironment *) override {} virtual void FillRankFeatures(GetDocsumsState *, IDocsumEnvironment *) override {} virtual void ParseLocation(GetDocsumsState *) override {} - std::unique_ptr<MatchingElements> fill_matching_elements(const StructFieldMapper &) override { abort(); } + std::unique_ptr<MatchingElements> fill_matching_elements(const MatchingElementsFields &) override { abort(); } }; template <typename AttrType> diff --git a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp index 5b74666cbec..6fceef37f09 100644 --- a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp +++ b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp @@ -78,7 +78,7 @@ struct DocsumFixture : IDocsumStore, GetDocsumsStateCallback { void FillSummaryFeatures(GetDocsumsState *, IDocsumEnvironment *) override { } void FillRankFeatures(GetDocsumsState *, IDocsumEnvironment *) override { } void ParseLocation(GetDocsumsState *) override { } - std::unique_ptr<MatchingElements> fill_matching_elements(const search::StructFieldMapper &) override { abort(); } + std::unique_ptr<MatchingElements> fill_matching_elements(const search::MatchingElementsFields &) override { abort(); } }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.cpp index 4e3cbaa512d..7a656eb0422 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.cpp @@ -7,7 +7,7 @@ #include <vespa/searchcommon/attribute/iattributecontext.h> #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vespalib/data/slime/cursor.h> #include <cassert> @@ -105,14 +105,14 @@ ArrayAttributeFieldWriterState::insertField(uint32_t docId, vespalib::slime::Ins ArrayAttributeCombinerDFW::ArrayAttributeCombinerDFW(const vespalib::string &fieldName, const StructFieldsResolver& fields_resolver, bool filter_elements, - std::shared_ptr<StructFieldMapper> struct_field_mapper) - : AttributeCombinerDFW(fieldName, filter_elements, std::move(struct_field_mapper)), + std::shared_ptr<MatchingElementsFields> matching_elems_fields) + : AttributeCombinerDFW(fieldName, filter_elements, std::move(matching_elems_fields)), _fields(fields_resolver.get_array_fields()), _attributeNames(fields_resolver.get_array_attributes()), _is_map_of_scalar(fields_resolver.is_map_of_scalar()) { - if (filter_elements && _struct_field_mapper && !_struct_field_mapper->is_struct_field(fieldName)) { - fields_resolver.apply_to(*_struct_field_mapper); + if (filter_elements && _matching_elems_fields && !_matching_elems_fields->has_field(fieldName)) { + fields_resolver.apply_to(*_matching_elems_fields); } } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.h b/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.h index 2fda1f69572..742128a229d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/array_attribute_combiner_dfw.h @@ -27,7 +27,7 @@ public: ArrayAttributeCombinerDFW(const vespalib::string &fieldName, const StructFieldsResolver& fields_resolver, bool filter_elements, - std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> matching_elems_fields); ~ArrayAttributeCombinerDFW() override; }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp index 8eb77c0ed9c..4ad42133f14 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.cpp @@ -6,7 +6,7 @@ #include "docsumstate.h" #include "struct_fields_resolver.h" #include "struct_map_attribute_combiner_dfw.h" -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <algorithm> #include <vespa/log/log.h> @@ -16,12 +16,13 @@ using search::attribute::IAttributeContext; namespace search::docsummary { -AttributeCombinerDFW::AttributeCombinerDFW(const vespalib::string &fieldName, bool filter_elements, std::shared_ptr<StructFieldMapper> struct_field_mapper) +AttributeCombinerDFW::AttributeCombinerDFW(const vespalib::string &fieldName, bool filter_elements, + std::shared_ptr<MatchingElementsFields> matching_elems_fields) : ISimpleDFW(), _stateIndex(0), _filter_elements(filter_elements), _fieldName(fieldName), - _struct_field_mapper(std::move(struct_field_mapper)) + _matching_elems_fields(std::move(matching_elems_fields)) { } @@ -41,15 +42,16 @@ AttributeCombinerDFW::setFieldWriterStateIndex(uint32_t fieldWriterStateIndex) } std::unique_ptr<IDocsumFieldWriter> -AttributeCombinerDFW::create(const vespalib::string &fieldName, IAttributeContext &attrCtx, bool filter_elements, std::shared_ptr<StructFieldMapper> struct_field_mapper) +AttributeCombinerDFW::create(const vespalib::string &fieldName, IAttributeContext &attrCtx, bool filter_elements, + std::shared_ptr<MatchingElementsFields> matching_elems_fields) { StructFieldsResolver structFields(fieldName, attrCtx, true); if (structFields.has_error()) { return std::unique_ptr<IDocsumFieldWriter>(); } else if (structFields.is_map_of_struct()) { - return std::make_unique<StructMapAttributeCombinerDFW>(fieldName, structFields, filter_elements, std::move(struct_field_mapper)); + return std::make_unique<StructMapAttributeCombinerDFW>(fieldName, structFields, filter_elements, std::move(matching_elems_fields)); } - return std::make_unique<ArrayAttributeCombinerDFW>(fieldName, structFields, filter_elements, std::move(struct_field_mapper)); + return std::make_unique<ArrayAttributeCombinerDFW>(fieldName, structFields, filter_elements, std::move(matching_elems_fields)); } void @@ -59,7 +61,7 @@ AttributeCombinerDFW::insertField(uint32_t docid, GetDocsumsState *state, ResTyp if (!fieldWriterState) { const MatchingElements *matching_elements = nullptr; if (_filter_elements) { - matching_elements = &state->get_matching_elements(*_struct_field_mapper); + matching_elements = &state->get_matching_elements(*_matching_elems_fields); } fieldWriterState = allocFieldWriterState(*state->_attrCtx, matching_elements); } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h index a8ab5f2f8f5..bb635d4d280 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/attribute_combiner_dfw.h @@ -6,7 +6,7 @@ namespace search { class MatchingElements; -class StructFieldMapper; +class MatchingElementsFields; } namespace search::attribute { class IAttributeContext; } @@ -25,15 +25,17 @@ protected: uint32_t _stateIndex; const bool _filter_elements; vespalib::string _fieldName; - std::shared_ptr<StructFieldMapper> _struct_field_mapper; - AttributeCombinerDFW(const vespalib::string &fieldName, bool filter_elements, std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> _matching_elems_fields; + AttributeCombinerDFW(const vespalib::string &fieldName, bool filter_elements, + std::shared_ptr<MatchingElementsFields> matching_elems_fields); protected: virtual std::unique_ptr<DocsumFieldWriterState> allocFieldWriterState(search::attribute::IAttributeContext &context, const MatchingElements* matching_elements) = 0; public: ~AttributeCombinerDFW() override; bool IsGenerated() const override; bool setFieldWriterStateIndex(uint32_t fieldWriterStateIndex) override; - static std::unique_ptr<IDocsumFieldWriter> create(const vespalib::string &fieldName, search::attribute::IAttributeContext &attrCtx, bool filter_elements, std::shared_ptr<StructFieldMapper> struct_field_mapper); + static std::unique_ptr<IDocsumFieldWriter> create(const vespalib::string &fieldName, search::attribute::IAttributeContext &attrCtx, + bool filter_elements, std::shared_ptr<MatchingElementsFields> matching_elems_fields); void insertField(uint32_t docid, GetDocsumsState *state, ResType type, vespalib::slime::Inserter &target) override; }; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp index 9235ce2b181..2c3366cb94d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp @@ -10,7 +10,7 @@ #include "positionsdfw.h" #include "rankfeaturesdfw.h" #include "textextractordfw.h" -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vespalib/util/stringfmt.h> #include <vespa/vespalib/util/exceptions.h> @@ -25,7 +25,7 @@ DynamicDocsumConfig::getResultConfig() const { } IDocsumFieldWriter::UP -DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<StructFieldMapper> struct_field_mapper) +DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields) { const ResultConfig & resultConfig = getResultConfig(); rc = false; @@ -97,14 +97,14 @@ DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & } else if (overrideName == "attributecombiner") { if (getEnvironment() && getEnvironment()->getAttributeManager()) { auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); - fieldWriter = AttributeCombinerDFW::create(fieldName, *attr_ctx, false, std::shared_ptr<StructFieldMapper>()); + fieldWriter = AttributeCombinerDFW::create(fieldName, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>()); rc = static_cast<bool>(fieldWriter); } } else if (overrideName == "matchedattributeelementsfilter") { string source_field = argument.empty() ? fieldName : argument; if (getEnvironment() && getEnvironment()->getAttributeManager()) { auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); - fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, struct_field_mapper); + fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, matching_elems_fields); rc = static_cast<bool>(fieldWriter); } } else if (overrideName == "matchedelementsfilter") { @@ -112,7 +112,7 @@ DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & if (getEnvironment() && getEnvironment()->getAttributeManager()) { auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); fieldWriter = MatchedElementsFilterDFW::create(source_field, resultConfig.GetFieldNameEnum().Lookup(source_field.c_str()), - *attr_ctx, struct_field_mapper); + *attr_ctx, matching_elems_fields); rc = static_cast<bool>(fieldWriter); } } else { @@ -125,14 +125,14 @@ void DynamicDocsumConfig::configure(const vespa::config::search::SummarymapConfig &cfg) { std::vector<string> strCfg; - auto struct_field_mapper = std::make_shared<StructFieldMapper>(); + auto matching_elems_fields = std::make_shared<MatchingElementsFields>(); if ((cfg.defaultoutputclass != -1) && !_writer->SetDefaultOutputClass(cfg.defaultoutputclass)) { throw IllegalArgumentException(make_string("could not set default output class to %d", cfg.defaultoutputclass)); } for (size_t i = 0; i < cfg.override.size(); ++i) { const vespa::config::search::SummarymapConfig::Override & o = cfg.override[i]; bool rc(false); - IDocsumFieldWriter::UP fieldWriter = createFieldWriter(o.field, o.command, o.arguments, rc, struct_field_mapper); + IDocsumFieldWriter::UP fieldWriter = createFieldWriter(o.field, o.command, o.arguments, rc, matching_elems_fields); if (rc && fieldWriter.get() != NULL) { rc = _writer->Override(o.field.c_str(), fieldWriter.release()); // OBJECT HAND-OVER } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h index 34ca49824c5..f6f1939cc62 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h @@ -4,7 +4,7 @@ #include <vespa/config-summarymap.h> -namespace search { class StructFieldMapper; } +namespace search { class MatchingElementsFields; } namespace search::docsummary { class IDocsumEnvironment; @@ -29,7 +29,7 @@ protected: virtual std::unique_ptr<IDocsumFieldWriter> createFieldWriter(const string & fieldName, const string & overrideName, - const string & argument, bool & rc, std::shared_ptr<StructFieldMapper> struct_field_mapper); + const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields); private: IDocsumEnvironment * _env; DynamicDocsumWriter * _writer; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp index 3270e4b4c98..ebbf97e9f55 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp @@ -50,10 +50,10 @@ GetDocsumsState::~GetDocsumsState() } const MatchingElements & -GetDocsumsState::get_matching_elements(const StructFieldMapper &struct_field_mapper) +GetDocsumsState::get_matching_elements(const MatchingElementsFields &matching_elems_fields) { if (!_matching_elements) { - _matching_elements = _callback.fill_matching_elements(struct_field_mapper); + _matching_elements = _callback.fill_matching_elements(matching_elems_fields); } return *_matching_elements; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h index 350e2410c9d..57cae341682 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h @@ -15,7 +15,7 @@ namespace juniper { namespace search { class MatchingElements; -class StructFieldMapper; +class MatchingElementsFields; } namespace search::common { class Location; } namespace search::attribute { @@ -35,7 +35,7 @@ public: virtual void FillSummaryFeatures(GetDocsumsState * state, IDocsumEnvironment * env) = 0; virtual void FillRankFeatures(GetDocsumsState * state, IDocsumEnvironment * env) = 0; virtual void ParseLocation(GetDocsumsState * state) = 0; - virtual std::unique_ptr<MatchingElements> fill_matching_elements(const StructFieldMapper &struct_field_mapper) = 0; + virtual std::unique_ptr<MatchingElements> fill_matching_elements(const MatchingElementsFields &matching_elems_fields) = 0; virtual ~GetDocsumsStateCallback(void) { } GetDocsumsStateCallback(const GetDocsumsStateCallback &) = delete; GetDocsumsStateCallback & operator = (const GetDocsumsStateCallback &) = delete; @@ -96,7 +96,7 @@ public: GetDocsumsState& operator=(const GetDocsumsState &) = delete; GetDocsumsState(GetDocsumsStateCallback &callback); ~GetDocsumsState(); - const MatchingElements &get_matching_elements(const StructFieldMapper &struct_field_mapper); + const MatchingElements &get_matching_elements(const MatchingElementsFields &matching_elems_fields); }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.cpp index 443634b3e3f..6991d3acb29 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.cpp @@ -8,7 +8,7 @@ #include <vespa/document/fieldvalue/literalfieldvalue.h> #include <vespa/searchcommon/attribute/iattributecontext.h> #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vespalib/data/slime/binary_format.h> #include <vespa/vespalib/data/slime/slime.h> #include <vespa/vespalib/data/smart_buffer.h> @@ -29,35 +29,35 @@ namespace search::docsummary { const std::vector<uint32_t>& MatchedElementsFilterDFW::get_matching_elements(uint32_t docid, GetDocsumsState& state) const { - return state.get_matching_elements(*_struct_field_mapper).get_matching_elements(docid, _input_field_name); + return state.get_matching_elements(*_matching_elems_fields).get_matching_elements(docid, _input_field_name); } MatchedElementsFilterDFW::MatchedElementsFilterDFW(const std::string& input_field_name, uint32_t input_field_enum, - std::shared_ptr<StructFieldMapper> struct_field_mapper) + std::shared_ptr<MatchingElementsFields> matching_elems_fields) : _input_field_name(input_field_name), _input_field_enum(input_field_enum), - _struct_field_mapper(std::move(struct_field_mapper)) + _matching_elems_fields(std::move(matching_elems_fields)) { } std::unique_ptr<IDocsumFieldWriter> MatchedElementsFilterDFW::create(const std::string& input_field_name, uint32_t input_field_enum, - std::shared_ptr<StructFieldMapper> struct_field_mapper) + std::shared_ptr<MatchingElementsFields> matching_elems_fields) { - return std::make_unique<MatchedElementsFilterDFW>(input_field_name, input_field_enum, std::move(struct_field_mapper)); + return std::make_unique<MatchedElementsFilterDFW>(input_field_name, input_field_enum, std::move(matching_elems_fields)); } std::unique_ptr<IDocsumFieldWriter> MatchedElementsFilterDFW::create(const std::string& input_field_name, uint32_t input_field_enum, search::attribute::IAttributeContext& attr_ctx, - std::shared_ptr<StructFieldMapper> struct_field_mapper) + std::shared_ptr<MatchingElementsFields> matching_elems_fields) { StructFieldsResolver resolver(input_field_name, attr_ctx, false); if (resolver.has_error()) { return std::unique_ptr<IDocsumFieldWriter>(); } - resolver.apply_to(*struct_field_mapper); - return std::make_unique<MatchedElementsFilterDFW>(input_field_name, input_field_enum, std::move(struct_field_mapper)); + resolver.apply_to(*matching_elems_fields); + return std::make_unique<MatchedElementsFilterDFW>(input_field_name, input_field_enum, std::move(matching_elems_fields)); } MatchedElementsFilterDFW::~MatchedElementsFilterDFW() = default; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.h b/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.h index 966b5b95fa7..087ddfd8d40 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/matched_elements_filter_dfw.h @@ -16,18 +16,18 @@ class MatchedElementsFilterDFW : public IDocsumFieldWriter { private: std::string _input_field_name; uint32_t _input_field_enum; - std::shared_ptr<StructFieldMapper> _struct_field_mapper; + std::shared_ptr<MatchingElementsFields> _matching_elems_fields; const std::vector<uint32_t>& get_matching_elements(uint32_t docid, GetDocsumsState& state) const; public: MatchedElementsFilterDFW(const std::string& input_field_name, uint32_t input_field_enum, - std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> matching_elems_fields); static std::unique_ptr<IDocsumFieldWriter> create(const std::string& input_field_name, uint32_t input_field_enum, - std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> matching_elems_fields); static std::unique_ptr<IDocsumFieldWriter> create(const std::string& input_field_name, uint32_t input_field_enum, search::attribute::IAttributeContext& attr_ctx, - std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> matching_elems_fields); ~MatchedElementsFilterDFW(); bool IsGenerated() const override { return false; } void insertField(uint32_t docid, GeneralResult* result, GetDocsumsState *state, diff --git a/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.cpp b/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.cpp index 749fc2941a6..9caad947335 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.cpp @@ -2,7 +2,7 @@ #include "struct_fields_resolver.h" #include <vespa/searchcommon/attribute/iattributecontext.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <algorithm> #include <vespa/log/log.h> @@ -78,18 +78,18 @@ StructFieldsResolver::StructFieldsResolver(const vespalib::string& field_name, c StructFieldsResolver::~StructFieldsResolver() = default; void -StructFieldsResolver::apply_to(StructFieldMapper& mapper) const +StructFieldsResolver::apply_to(MatchingElementsFields& fields) const { if (is_map_of_struct()) { if (_has_map_key) { - mapper.add_mapping(_field_name, _map_key_attribute); + fields.add_mapping(_field_name, _map_key_attribute); } for (const auto& sub_field : _map_value_attributes) { - mapper.add_mapping(_field_name, sub_field); + fields.add_mapping(_field_name, sub_field); } } else { for (const auto& sub_field : _array_attributes) { - mapper.add_mapping(_field_name, sub_field); + fields.add_mapping(_field_name, sub_field); } } } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.h b/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.h index b88e51a346b..e1db36d8a43 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/struct_fields_resolver.h @@ -7,7 +7,7 @@ namespace search { namespace attribute { class IAttributeContext; } -class StructFieldMapper; +class MatchingElementsFields; } namespace search::docsummary { @@ -45,7 +45,7 @@ public: const StringVector& get_array_fields() const { return _array_fields; } const StringVector& get_array_attributes() const { return _array_attributes; } bool has_error() const { return _error; } - void apply_to(StructFieldMapper& mapper) const; + void apply_to(MatchingElementsFields& fields) const; }; } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.cpp index 0a2c4726577..5344162b402 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.cpp @@ -7,7 +7,7 @@ #include <vespa/searchcommon/attribute/iattributecontext.h> #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vespalib/data/slime/cursor.h> #include <cassert> @@ -124,14 +124,14 @@ StructMapAttributeFieldWriterState::insertField(uint32_t docId, vespalib::slime: StructMapAttributeCombinerDFW::StructMapAttributeCombinerDFW(const vespalib::string &fieldName, const StructFieldsResolver& fields_resolver, bool filter_elements, - std::shared_ptr<StructFieldMapper> struct_field_mapper) - : AttributeCombinerDFW(fieldName, filter_elements, std::move(struct_field_mapper)), + std::shared_ptr<MatchingElementsFields> matching_elems_fields) + : AttributeCombinerDFW(fieldName, filter_elements, std::move(matching_elems_fields)), _keyAttributeName(fields_resolver.get_map_key_attribute()), _valueFields(fields_resolver.get_map_value_fields()), _valueAttributeNames(fields_resolver.get_map_value_attributes()) { - if (filter_elements && _struct_field_mapper && !_struct_field_mapper->is_struct_field(fieldName)) { - fields_resolver.apply_to(*_struct_field_mapper); + if (filter_elements && _matching_elems_fields && !_matching_elems_fields->has_field(fieldName)) { + fields_resolver.apply_to(*_matching_elems_fields); } } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.h b/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.h index a28e487fb1c..c2fdbebc0b6 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/struct_map_attribute_combiner_dfw.h @@ -26,7 +26,7 @@ public: StructMapAttributeCombinerDFW(const vespalib::string &fieldName, const StructFieldsResolver& fields_resolver, bool filter_elements, - std::shared_ptr<StructFieldMapper> struct_field_mapper); + std::shared_ptr<MatchingElementsFields> matching_elems_fields); ~StructMapAttributeCombinerDFW() override; }; diff --git a/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp b/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp index 8135f378dd3..b40e045f8b0 100644 --- a/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp +++ b/streamingvisitors/src/tests/matching_elements_filler/matching_elements_filler_test.cpp @@ -1,27 +1,27 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/document/datatype/datatypes.h> -#include <vespa/document/fieldvalue/document.h> #include <vespa/document/fieldvalue/arrayfieldvalue.h> +#include <vespa/document/fieldvalue/document.h> #include <vespa/document/fieldvalue/intfieldvalue.h> #include <vespa/document/fieldvalue/mapfieldvalue.h> #include <vespa/document/fieldvalue/stringfieldvalue.h> #include <vespa/document/fieldvalue/structfieldvalue.h> -#include <vespa/searchlib/fef/matchdata.h> -#include <vespa/searchlib/common/struct_field_mapper.h> #include <vespa/searchlib/common/matching_elements.h> +#include <vespa/searchlib/common/matching_elements_fields.h> +#include <vespa/searchlib/fef/matchdata.h> +#include <vespa/searchlib/query/streaming/query.h> +#include <vespa/searchlib/query/streaming/queryterm.h> #include <vespa/searchlib/query/tree/querybuilder.h> #include <vespa/searchlib/query/tree/simplequery.h> #include <vespa/searchlib/query/tree/stackdumpcreator.h> -#include <vespa/searchlib/query/streaming/queryterm.h> -#include <vespa/searchlib/query/streaming/query.h> -#include <vespa/vsm/searcher/fieldsearcher.h> -#include <vespa/vsm/searcher/utf8strchrfieldsearcher.h> -#include <vespa/vsm/searcher/intfieldsearcher.h> #include <vespa/searchvisitor/hitcollector.h> #include <vespa/searchvisitor/matching_elements_filler.h> #include <vespa/vdslib/container/searchresult.h> #include <vespa/vespalib/gtest/gtest.h> +#include <vespa/vsm/searcher/fieldsearcher.h> +#include <vespa/vsm/searcher/intfieldsearcher.h> +#include <vespa/vsm/searcher/utf8strchrfieldsearcher.h> #include <iostream> using document::ArrayDataType; @@ -38,7 +38,7 @@ using document::StringFieldValue; using document::StructDataType; using document::StructFieldValue; using search::MatchingElements; -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::fef::MatchData; using search::query::StackDumpCreator; using search::query::Weight; @@ -256,24 +256,23 @@ vsm::DocumentTypeIndexFieldMapT make_index_to_field_ids() { return ret; } -StructFieldMapper make_struct_field_mapper() { - StructFieldMapper mapper; - mapper.add_mapping("elem_array", "elem_array.name"); - mapper.add_mapping("elem_array", "elem_array.weight"); - mapper.add_mapping("elem_map", "elem_map.key"); - mapper.add_mapping("elem_map", "elem_map.value.name"); - mapper.add_mapping("elem_map", "elem_map.value.weight"); - mapper.add_mapping("str_int_map", "str_int_map.key"); - mapper.add_mapping("str_int_map", "str_int_map.value"); - return mapper; - +MatchingElementsFields make_matching_elements_fields() { + MatchingElementsFields fields; + fields.add_mapping("elem_array", "elem_array.name"); + fields.add_mapping("elem_array", "elem_array.weight"); + fields.add_mapping("elem_map", "elem_map.key"); + fields.add_mapping("elem_map", "elem_map.value.name"); + fields.add_mapping("elem_map", "elem_map.value.weight"); + fields.add_mapping("str_int_map", "str_int_map.key"); + fields.add_mapping("str_int_map", "str_int_map.value"); + return fields; } } class MatchingElementsFillerTest : public ::testing::Test { const MyDocType _doc_type; - StructFieldMapper _struct_field_mapper; + MatchingElementsFields _matching_elems_fields; vsm::SharedFieldPathMap _field_path_map; vsm::FieldIdTSearcherMap _field_searcher_map; vsm::DocumentTypeIndexFieldMapT _index_to_field_ids; @@ -296,7 +295,7 @@ public: MatchingElementsFillerTest::MatchingElementsFillerTest() : ::testing::Test(), _doc_type(), - _struct_field_mapper(make_struct_field_mapper()), + _matching_elems_fields(make_matching_elements_fields()), _field_path_map(make_field_path_map(_doc_type)), _field_searcher_map(make_field_searcher_map()), _index_to_field_ids(make_index_to_field_ids()), @@ -325,7 +324,7 @@ MatchingElementsFillerTest::fill_matching_elements(Query &&query) _query = std::move(query); _field_searcher_map.prepare(_index_to_field_ids, _shared_searcher_buf, _query); _matching_elements_filler = std::make_unique<MatchingElementsFiller>(_field_searcher_map, _query, _hit_collector, _search_result); - _matching_elements = _matching_elements_filler->fill_matching_elements(_struct_field_mapper); + _matching_elements = _matching_elements_filler->fill_matching_elements(_matching_elems_fields); } void diff --git a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp index 994a7993666..fe717313ca4 100644 --- a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp @@ -2,14 +2,14 @@ #include "matching_elements_filler.h" #include <vespa/searchlib/common/matching_elements.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vsm/searcher/fieldsearcher.h> #include <vespa/vdslib/container/searchresult.h> #include "hitcollector.h" #include <algorithm> using search::MatchingElements; -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::streaming::AndNotQueryNode; using search::streaming::HitList; using search::streaming::Query; @@ -27,15 +27,15 @@ namespace { struct SubFieldTerm { - vespalib::string _struct_field_name; + vespalib::string _field_name; const QueryTerm* _term; public: - SubFieldTerm(vespalib::string struct_field_name, const QueryTerm* term) - : _struct_field_name(std::move(struct_field_name)), + SubFieldTerm(vespalib::string field_name, const QueryTerm* term) + : _field_name(std::move(field_name)), _term(term) { } - const vespalib::string& get_struct_field_name() const { return _struct_field_name; } + const vespalib::string& get_field_name() const { return _field_name; } const QueryTerm& get_term() const { return *_term; } }; @@ -47,12 +47,12 @@ class Matcher HitList _hit_list; std::vector<uint32_t> _elements; - void select_query_nodes(const StructFieldMapper& mapper, const QueryNode& query_node); - void add_matching_elements(const vespalib::string& struct_field_name, uint32_t doc_lid, const HitList& hit_list, MatchingElements& matching_elements); + void select_query_nodes(const MatchingElementsFields& fields, const QueryNode& query_node); + void add_matching_elements(const vespalib::string& field_name, uint32_t doc_lid, const HitList& hit_list, MatchingElements& matching_elements); void find_matching_elements(const SameElementQueryNode& same_element, uint32_t doc_lid, MatchingElements& matching_elements); void find_matching_elements(const SubFieldTerm& sub_field_term, uint32_t doc_lid, MatchingElements& matching_elements); public: - Matcher(vsm::FieldIdTSearcherMap& field_searcher_map, const StructFieldMapper& mapper, const Query& query); + Matcher(vsm::FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, const Query& query); ~Matcher(); bool empty() const { return _same_element_nodes.empty() && _sub_field_terms.empty(); } void find_matching_elements(const vsm::StorageDocument& doc, uint32_t doc_lid, MatchingElements& matching_elements); @@ -61,39 +61,39 @@ public: template<typename T> const T* as(const QueryNode& query_node) { return dynamic_cast<const T*>(&query_node); } -Matcher::Matcher(FieldIdTSearcherMap& field_searcher_map, const StructFieldMapper& mapper, const Query& query) +Matcher::Matcher(FieldIdTSearcherMap& field_searcher_map, const MatchingElementsFields& fields, const Query& query) : _same_element_nodes(), _sub_field_terms(), _field_searcher_map(field_searcher_map), _hit_list() { - select_query_nodes(mapper, query.getRoot()); + select_query_nodes(fields, query.getRoot()); } Matcher::~Matcher() = default; void -Matcher::select_query_nodes(const StructFieldMapper& mapper, const QueryNode& query_node) +Matcher::select_query_nodes(const MatchingElementsFields& fields, const QueryNode& query_node) { if (auto same_element = as<SameElementQueryNode>(query_node)) { - if (mapper.is_struct_field(same_element->getIndex())) { + if (fields.has_field(same_element->getIndex())) { _same_element_nodes.emplace_back(same_element); } } else if (auto query_term = as<QueryTerm>(query_node)) { - if (mapper.is_struct_subfield(query_term->getIndex())) { - _sub_field_terms.emplace_back(mapper.get_struct_field(query_term->getIndex()), query_term); + if (fields.has_struct_field(query_term->getIndex())) { + _sub_field_terms.emplace_back(fields.get_enclosing_field(query_term->getIndex()), query_term); } } else if (auto and_not = as<AndNotQueryNode>(query_node)) { - select_query_nodes(mapper, *(*and_not)[0]); + select_query_nodes(fields, *(*and_not)[0]); } else if (auto intermediate = as<QueryConnector>(query_node)) { for (size_t i = 0; i < intermediate->size(); ++i) { - select_query_nodes(mapper, *(*intermediate)[i]); + select_query_nodes(fields, *(*intermediate)[i]); } } } void -Matcher::add_matching_elements(const vespalib::string& struct_field_name, uint32_t doc_lid, const HitList& hit_list, MatchingElements& matching_elements) +Matcher::add_matching_elements(const vespalib::string& field_name, uint32_t doc_lid, const HitList& hit_list, MatchingElements& matching_elements) { _elements.clear(); for (auto& hit : hit_list) { @@ -104,7 +104,7 @@ Matcher::add_matching_elements(const vespalib::string& struct_field_name, uint32 auto last = std::unique(_elements.begin(), _elements.end()); _elements.erase(last, _elements.end()); } - matching_elements.add_matching_elements(doc_lid, struct_field_name, _elements); + matching_elements.add_matching_elements(doc_lid, field_name, _elements); } void @@ -121,7 +121,7 @@ Matcher::find_matching_elements(const SubFieldTerm& sub_field_term, uint32_t doc { const HitList& hit_list = sub_field_term.get_term().evaluateHits(_hit_list); if (!hit_list.empty()) { - add_matching_elements(sub_field_term.get_struct_field_name(), doc_lid, hit_list, matching_elements); + add_matching_elements(sub_field_term.get_field_name(), doc_lid, hit_list, matching_elements); } } @@ -154,13 +154,13 @@ MatchingElementsFiller::MatchingElementsFiller(FieldIdTSearcherMap& field_search MatchingElementsFiller::~MatchingElementsFiller() = default; std::unique_ptr<MatchingElements> -MatchingElementsFiller::fill_matching_elements(const StructFieldMapper& struct_field_mapper) +MatchingElementsFiller::fill_matching_elements(const MatchingElementsFields& fields) { auto result = std::make_unique<MatchingElements>(); - if (struct_field_mapper.empty()) { + if (fields.empty()) { return result; } - Matcher matcher(_field_searcher_map, struct_field_mapper, _query); + Matcher matcher(_field_searcher_map, fields, _query); if (matcher.empty()) { return result; } diff --git a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.h b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.h index c93f89ac43d..244d3cea6bc 100644 --- a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.h +++ b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.h @@ -29,7 +29,7 @@ public: MatchingElementsFiller(vsm::FieldIdTSearcherMap& field_searcher_map, search::streaming::Query& query, HitCollector& hit_collector, vdslib::SearchResult& search_result); virtual ~MatchingElementsFiller(); - std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::StructFieldMapper& struct_field_mapper) override; + std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::MatchingElementsFields& fields) override; }; } diff --git a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp index 7402a45fa4a..2512bea26df 100644 --- a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp +++ b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp @@ -3,11 +3,11 @@ #include <vespa/vsm/vsm/docsumconfig.h> #include <vespa/searchsummary/docsummary/docsumfieldwriter.h> #include <vespa/searchsummary/docsummary/matched_elements_filter_dfw.h> -#include <vespa/searchlib/common/struct_field_mapper.h> +#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vsm/config/config-vsmfields.h> #include <vespa/vsm/config/config-vsmsummary.h> -using search::StructFieldMapper; +using search::MatchingElementsFields; using search::docsummary::IDocsumFieldWriter; using search::docsummary::EmptyDFW; using search::docsummary::MatchedElementsFilterDFW; @@ -19,12 +19,12 @@ namespace vsm { namespace { -void populate_mapper(StructFieldMapper& mapper, VsmfieldsConfig& fields_config, const vespalib::string& field_name) +void populate_fields(MatchingElementsFields& fields, VsmfieldsConfig& fields_config, const vespalib::string& field_name) { vespalib::string prefix = field_name + "."; for (const auto& spec : fields_config.fieldspec) { if (spec.name.substr(0, prefix.size()) == prefix) { - mapper.add_mapping(field_name, spec.name); + fields.add_mapping(field_name, spec.name); } } } @@ -38,7 +38,7 @@ DynamicDocsumConfig::DynamicDocsumConfig(search::docsummary::IDocsumEnvironment* } IDocsumFieldWriter::UP -DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<search::StructFieldMapper> struct_field_mapper) +DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) { IDocsumFieldWriter::UP fieldWriter; if ((overrideName == "staticrank") || @@ -60,11 +60,11 @@ DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & string source_field = argument.empty() ? fieldName : argument; const ResultConfig& resultConfig = getResultConfig(); int source_field_enum = resultConfig.GetFieldNameEnum().Lookup(source_field.c_str()); - populate_mapper(*struct_field_mapper, *_vsm_fields_config, source_field); - fieldWriter = MatchedElementsFilterDFW::create(source_field, source_field_enum, struct_field_mapper); + populate_fields(*matching_elems_fields, *_vsm_fields_config, source_field); + fieldWriter = MatchedElementsFilterDFW::create(source_field, source_field_enum, matching_elems_fields); rc = static_cast<bool>(fieldWriter); } else { - fieldWriter = search::docsummary::DynamicDocsumConfig::createFieldWriter(fieldName, overrideName, argument, rc, struct_field_mapper); + fieldWriter = search::docsummary::DynamicDocsumConfig::createFieldWriter(fieldName, overrideName, argument, rc, matching_elems_fields); } return fieldWriter; } diff --git a/vsm/src/vespa/vsm/vsm/docsumconfig.h b/vsm/src/vespa/vsm/vsm/docsumconfig.h index 17128798ef2..8be9324b9d6 100644 --- a/vsm/src/vespa/vsm/vsm/docsumconfig.h +++ b/vsm/src/vespa/vsm/vsm/docsumconfig.h @@ -22,7 +22,7 @@ public: private: std::unique_ptr<search::docsummary::IDocsumFieldWriter> createFieldWriter(const string & fieldName, const string & overrideName, - const string & cf, bool & rc, std::shared_ptr<search::StructFieldMapper> struct_field_mapper) override; + const string & cf, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) override; }; } diff --git a/vsm/src/vespa/vsm/vsm/i_matching_elements_filler.h b/vsm/src/vespa/vsm/vsm/i_matching_elements_filler.h index a30dcbf2a5b..45233818452 100644 --- a/vsm/src/vespa/vsm/vsm/i_matching_elements_filler.h +++ b/vsm/src/vespa/vsm/vsm/i_matching_elements_filler.h @@ -6,7 +6,7 @@ namespace search { class MatchingElements; -class StructFieldMapper; +class MatchingElementsFields; } namespace vsm { @@ -17,7 +17,7 @@ namespace vsm { */ class IMatchingElementsFiller { public: - virtual std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::StructFieldMapper& struct_field_mapper) = 0; + virtual std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::MatchingElementsFields& fields) = 0; virtual ~IMatchingElementsFiller() = default; }; diff --git a/vsm/src/vespa/vsm/vsm/vsm-adapter.cpp b/vsm/src/vespa/vsm/vsm/vsm-adapter.cpp index dd7b36015e4..5d8c7735c0e 100644 --- a/vsm/src/vespa/vsm/vsm/vsm-adapter.cpp +++ b/vsm/src/vespa/vsm/vsm/vsm-adapter.cpp @@ -50,10 +50,10 @@ void GetDocsumsStateCallback::FillDocumentLocations(GetDocsumsState *state, IDoc } std::unique_ptr<MatchingElements> -GetDocsumsStateCallback::fill_matching_elements(const search::StructFieldMapper& struct_field_mapper) +GetDocsumsStateCallback::fill_matching_elements(const search::MatchingElementsFields& fields) { if (_matching_elements_filler) { - return _matching_elements_filler->fill_matching_elements(struct_field_mapper); + return _matching_elements_filler->fill_matching_elements(fields); } return std::make_unique<MatchingElements>(); } diff --git a/vsm/src/vespa/vsm/vsm/vsm-adapter.h b/vsm/src/vespa/vsm/vsm/vsm-adapter.h index 96d12e23db6..cffae318586 100644 --- a/vsm/src/vespa/vsm/vsm/vsm-adapter.h +++ b/vsm/src/vespa/vsm/vsm/vsm-adapter.h @@ -42,7 +42,7 @@ public: void FillRankFeatures(GetDocsumsState * state, IDocsumEnvironment * env) override; void ParseLocation(GetDocsumsState * state) override; virtual void FillDocumentLocations(GetDocsumsState * state, IDocsumEnvironment * env); - virtual std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::StructFieldMapper& struct_field_mapper) override; + virtual std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::MatchingElementsFields& fields) override; void setSummaryFeatures(const search::FeatureSet::SP & sf) { _summaryFeatures = sf; } void setRankFeatures(const search::FeatureSet::SP & rf) { _rankFeatures = rf; } void set_matching_elements_filler(std::unique_ptr<IMatchingElementsFiller> matching_elements_filler); |