diff options
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); |