summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-03-31 16:47:40 +0200
committerGitHub <noreply@github.com>2023-03-31 16:47:40 +0200
commit1ff9bc8eca4fe0f8e9ac34969510d69291360ceb (patch)
treef403882e886c3893709a8cbe9ba901d8566d16cb
parent6601f2ecb1a5c84940a6e998af7ac0ffdfb766d0 (diff)
parent0ac05b65c3a4246311763429b2ec3e31ad8e30b0 (diff)
Merge pull request #26664 from vespa-engine/geirst/improve-matching-elements-setup
Use one MatchingElementsFields instance per summary class.
-rw-r--r--searchcore/src/tests/proton/docsummary/docsummary_test.cpp5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp12
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h4
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp5
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp9
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h3
7 files changed, 27 insertions, 16 deletions
diff --git a/searchcore/src/tests/proton/docsummary/docsummary_test.cpp b/searchcore/src/tests/proton/docsummary/docsummary_test.cpp
index 020f4ff42c1..70f81d629d5 100644
--- a/searchcore/src/tests/proton/docsummary/docsummary_test.cpp
+++ b/searchcore/src/tests/proton/docsummary/docsummary_test.cpp
@@ -107,7 +107,10 @@ namespace proton {
class MockDocsumFieldWriterFactory : public search::docsummary::IDocsumFieldWriterFactory
{
public:
- std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string&, const vespalib::string&, const vespalib::string&) override {
+ std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string&,
+ const vespalib::string&,
+ const vespalib::string&,
+ std::shared_ptr<search::MatchingElementsFields>) override {
return {};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
index d6f06c9161e..6ac4fea2921 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
@@ -23,8 +23,7 @@ namespace search::docsummary {
DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IQueryTermFilterFactory& query_term_filter_factory)
: _use_v8_geo_positions(use_v8_geo_positions),
_env(env),
- _query_term_filter_factory(query_term_filter_factory),
- _matching_elems_fields(std::make_shared<MatchingElementsFields>())
+ _query_term_filter_factory(query_term_filter_factory)
{
}
@@ -58,7 +57,8 @@ throw_missing_source(const vespalib::string& command)
std::unique_ptr<DocsumFieldWriter>
DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
- const vespalib::string& source)
+ const vespalib::string& source,
+ std::shared_ptr<MatchingElementsFields> matching_elems_fields)
{
std::unique_ptr<DocsumFieldWriter> fieldWriter;
if (command == command::dynamic_teaser) {
@@ -116,9 +116,9 @@ DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fie
if (has_attribute_manager()) {
auto attr_ctx = getEnvironment().getAttributeManager()->createContext();
if (attr_ctx->getAttribute(source_field) != nullptr) {
- fieldWriter = AttributeDFWFactory::create(*getEnvironment().getAttributeManager(), source_field, true, _matching_elems_fields);
+ fieldWriter = AttributeDFWFactory::create(*getEnvironment().getAttributeManager(), source_field, true, matching_elems_fields);
} else {
- fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, _matching_elems_fields);
+ fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, matching_elems_fields);
}
throw_if_nullptr(fieldWriter, command);
}
@@ -126,7 +126,7 @@ DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fie
const vespalib::string& source_field = source.empty() ? field_name : source;
if (has_attribute_manager()) {
auto attr_ctx = getEnvironment().getAttributeManager()->createContext();
- fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, _matching_elems_fields);
+ fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, matching_elems_fields);
throw_if_nullptr(fieldWriter, command);
}
} else if (command == command::documentid) {
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
index e50fb85cca6..7175f043701 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
@@ -20,7 +20,6 @@ class DocsumFieldWriterFactory : public IDocsumFieldWriterFactory
const IDocsumEnvironment& _env;
const IQueryTermFilterFactory& _query_term_filter_factory;
protected:
- std::shared_ptr<MatchingElementsFields> _matching_elems_fields;
const IDocsumEnvironment& getEnvironment() const noexcept { return _env; }
bool has_attribute_manager() const noexcept;
public:
@@ -28,7 +27,8 @@ public:
~DocsumFieldWriterFactory() override;
std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
- const vespalib::string& source) override;
+ const vespalib::string& source,
+ std::shared_ptr<MatchingElementsFields> matching_elems_fields) override;
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h
index 6a5cd691857..bc2ebe3c40c 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h
@@ -5,6 +5,8 @@
#include <memory>
#include <vespa/vespalib/stllike/string.h>
+namespace search { class MatchingElementsFields; }
+
namespace search::docsummary {
class DocsumFieldWriter;
@@ -21,7 +23,8 @@ public:
*/
virtual std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
- const vespalib::string& source) = 0;
+ const vespalib::string& source,
+ std::shared_ptr<MatchingElementsFields> matching_elems_fields) = 0;
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
index f620dcb1df5..eddb67f5822 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
@@ -5,6 +5,7 @@
#include "docsum_field_writer_factory.h"
#include "resultclass.h"
#include <vespa/config-summary.h>
+#include <vespa/searchlib/common/matching_elements_fields.h>
#include <vespa/vespalib/stllike/hash_map.hpp>
#include <vespa/vespalib/util/exceptions.h>
#include <atomic>
@@ -124,6 +125,7 @@ ResultConfig::readConfig(const SummaryConfig &cfg, const char *configId, IDocsum
break;
}
resClass->set_omit_summary_features(cfg_class.omitsummaryfeatures);
+ auto matching_elems_fields = std::make_shared<MatchingElementsFields>();
for (const auto & field : cfg_class.fields) {
const char *fieldname = field.name.c_str();
vespalib::string command = field.command;
@@ -134,7 +136,8 @@ ResultConfig::readConfig(const SummaryConfig &cfg, const char *configId, IDocsum
try {
docsum_field_writer = docsum_field_writer_factory.create_docsum_field_writer(fieldname,
command,
- source_name);
+ source_name,
+ matching_elems_fields);
} catch (const vespalib::IllegalArgumentException& ex) {
LOG(error, "Exception during setup of summary result class '%s': field='%s', command='%s', source='%s': %s",
cfg_class.name.c_str(), fieldname, command.c_str(), source_name.c_str(), ex.getMessage().c_str());
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
index 36873b713aa..b103d7d85b2 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
@@ -48,7 +48,8 @@ DocsumFieldWriterFactory::~DocsumFieldWriterFactory() = default;
std::unique_ptr<DocsumFieldWriter>
DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
- const vespalib::string& source)
+ const vespalib::string& source,
+ std::shared_ptr<MatchingElementsFields> matching_elems_fields)
{
std::unique_ptr<DocsumFieldWriter> fieldWriter;
using namespace search::docsummary;
@@ -65,10 +66,10 @@ DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fie
} else if ((command == command::matched_attribute_elements_filter) ||
(command == command::matched_elements_filter)) {
vespalib::string source_field = source.empty() ? field_name : source;
- populate_fields(*_matching_elems_fields, _vsm_fields_config, source_field);
- fieldWriter = MatchedElementsFilterDFW::create(source_field, _matching_elems_fields);
+ populate_fields(*matching_elems_fields, _vsm_fields_config, source_field);
+ fieldWriter = MatchedElementsFilterDFW::create(source_field, matching_elems_fields);
} else {
- return search::docsummary::DocsumFieldWriterFactory::create_docsum_field_writer(field_name, command, source);
+ return search::docsummary::DocsumFieldWriterFactory::create_docsum_field_writer(field_name, command, source, matching_elems_fields);
}
return fieldWriter;
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
index 078c466d3d2..ac5cae8c49d 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
@@ -21,7 +21,8 @@ public:
std::unique_ptr<search::docsummary::DocsumFieldWriter>
create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
- const vespalib::string& source) override;
+ const vespalib::string& source,
+ std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) override;
};
}