summaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-08-29 17:33:04 +0200
committerTor Egge <Tor.Egge@online.no>2022-08-29 17:33:04 +0200
commit7032f820c64c6a020483657b76c0ef594114d30f (patch)
tree5ac756a6623e3dcfa0bde4cdd79d897539d967e0 /streamingvisitors
parent1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (diff)
Factor out DocsumFieldWriterFactory.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt1
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp80
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h25
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp66
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h4
5 files changed, 112 insertions, 64 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
index adc00b341a3..6afb61078c7 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
+++ b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
@@ -3,6 +3,7 @@ vespa_add_library(vsm_vsmbase OBJECT
SOURCES
docsumfieldspec.cpp
docsumfilter.cpp
+ docsum_field_writer_factory.cpp
fieldsearchspec.cpp
flattendocsumwriter.cpp
slimefieldwriter.cpp
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
new file mode 100644
index 00000000000..dcf093ee92b
--- /dev/null
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
@@ -0,0 +1,80 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "docsum_field_writer_factory.h"
+#include <vespa/searchsummary/docsummary/copy_dfw.h>
+#include <vespa/searchsummary/docsummary/docsum_field_writer.h>
+#include <vespa/searchsummary/docsummary/empty_dfw.h>
+#include <vespa/searchsummary/docsummary/matched_elements_filter_dfw.h>
+#include <vespa/searchlib/common/matching_elements_fields.h>
+#include <vespa/vsm/config/config-vsmfields.h>
+
+using search::MatchingElementsFields;
+using search::docsummary::CopyDFW;
+using search::docsummary::EmptyDFW;
+using search::docsummary::IDocsumEnvironment;
+using search::docsummary::DocsumFieldWriter;
+using search::docsummary::MatchedElementsFilterDFW;
+using vespa::config::search::vsm::VsmfieldsConfig;
+
+namespace vsm {
+
+namespace {
+
+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) {
+ fields.add_mapping(field_name, spec.name);
+ }
+ if (spec.name == field_name) {
+ fields.add_field(field_name);
+ }
+ }
+}
+
+}
+
+DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config)
+ : search::docsummary::DocsumFieldWriterFactory(use_v8_geo_positions, env),
+ _vsm_fields_config(vsm_fields_config)
+{
+}
+
+DocsumFieldWriterFactory::~DocsumFieldWriterFactory() = default;
+
+std::unique_ptr<DocsumFieldWriter>
+DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc)
+{
+ std::unique_ptr<DocsumFieldWriter> fieldWriter;
+ if ((overrideName == "staticrank") ||
+ (overrideName == "ranklog") ||
+ (overrideName == "label") ||
+ (overrideName == "project") ||
+ (overrideName == "positions") ||
+ (overrideName == "absdist") ||
+ (overrideName == "subproject"))
+ {
+ fieldWriter = std::make_unique<EmptyDFW>();
+ rc = true;
+ } else if ((overrideName == "attribute") ||
+ (overrideName == "attributecombiner")) {
+ if (!argument.empty() && argument != fieldName) {
+ fieldWriter = std::make_unique<CopyDFW>(argument);
+ }
+ rc = true;
+ } else if (overrideName == "geopos") {
+ rc = true;
+ } else if ((overrideName == "matchedattributeelementsfilter") ||
+ (overrideName == "matchedelementsfilter")) {
+ vespalib::string source_field = argument.empty() ? fieldName : argument;
+ populate_fields(*_matching_elems_fields, _vsm_fields_config, source_field);
+ fieldWriter = MatchedElementsFilterDFW::create(source_field, _matching_elems_fields);
+ rc = static_cast<bool>(fieldWriter);
+ } else {
+ return search::docsummary::DocsumFieldWriterFactory::create_docsum_field_writer(fieldName, overrideName, argument, rc);
+ }
+ 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
new file mode 100644
index 00000000000..4084b435bf2
--- /dev/null
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
@@ -0,0 +1,25 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/searchsummary/docsummary/docsum_field_writer_factory.h>
+#include <vespa/vsm/config/config-vsmfields.h>
+
+namespace vsm {
+
+/*
+ * Factory interface class for creating docsum field writers, adjusted for
+ * streaming search.
+ */
+class DocsumFieldWriterFactory : public search::docsummary::DocsumFieldWriterFactory
+{
+ const vespa::config::search::vsm::VsmfieldsConfig& _vsm_fields_config;
+
+public:
+ DocsumFieldWriterFactory(bool use_v8_geo_positions, search::docsummary::IDocsumEnvironment* env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config);
+ ~DocsumFieldWriterFactory() override;
+ std::unique_ptr<search::docsummary::DocsumFieldWriter>
+ create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override;
+};
+
+}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp
index 5b9c73cb07d..22c3b270836 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp
@@ -1,80 +1,24 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/vsm/vsm/docsumconfig.h>
-#include <vespa/searchsummary/docsummary/copy_dfw.h>
-#include <vespa/searchsummary/docsummary/empty_dfw.h>
-#include <vespa/searchsummary/docsummary/matched_elements_filter_dfw.h>
+#include "docsumconfig.h"
#include <vespa/searchsummary/docsummary/resultconfig.h>
-#include <vespa/searchlib/common/matching_elements_fields.h>
#include <vespa/vsm/config/config-vsmfields.h>
-#include <vespa/vsm/config/config-vsmsummary.h>
+#include "docsum_field_writer_factory.h"
-using search::MatchingElementsFields;
-using search::docsummary::DocsumFieldWriter;
-using search::docsummary::CopyDFW;
-using search::docsummary::EmptyDFW;
-using search::docsummary::MatchedElementsFilterDFW;
-using search::docsummary::ResultConfig;
using vespa::config::search::vsm::VsmfieldsConfig;
-using vespa::config::search::vsm::VsmsummaryConfig;
namespace vsm {
-namespace {
-
-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) {
- fields.add_mapping(field_name, spec.name);
- }
- if (spec.name == field_name) {
- fields.add_field(field_name);
- }
- }
-}
-
-}
-
DynamicDocsumConfig::DynamicDocsumConfig(search::docsummary::IDocsumEnvironment* env, search::docsummary::DynamicDocsumWriter* writer, std::shared_ptr<VsmfieldsConfig> vsm_fields_config)
: Parent(env, writer),
_vsm_fields_config(std::move(vsm_fields_config))
{
}
-std::unique_ptr<DocsumFieldWriter>
-DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields)
+std::unique_ptr<search::docsummary::IDocsumFieldWriterFactory>
+DynamicDocsumConfig::make_docsum_field_writer_factory()
{
- std::unique_ptr<DocsumFieldWriter> fieldWriter;
- if ((overrideName == "staticrank") ||
- (overrideName == "ranklog") ||
- (overrideName == "label") ||
- (overrideName == "project") ||
- (overrideName == "positions") ||
- (overrideName == "absdist") ||
- (overrideName == "subproject"))
- {
- fieldWriter = std::make_unique<EmptyDFW>();
- rc = true;
- } else if ((overrideName == "attribute") ||
- (overrideName == "attributecombiner")) {
- if (!argument.empty() && argument != fieldName) {
- fieldWriter = std::make_unique<CopyDFW>(argument);
- }
- rc = true;
- } else if (overrideName == "geopos") {
- rc = true;
- } else if ((overrideName == "matchedattributeelementsfilter") ||
- (overrideName == "matchedelementsfilter")) {
- string source_field = argument.empty() ? fieldName : argument;
- populate_fields(*matching_elems_fields, *_vsm_fields_config, source_field);
- fieldWriter = MatchedElementsFilterDFW::create(source_field, matching_elems_fields);
- rc = static_cast<bool>(fieldWriter);
- } else {
- fieldWriter = search::docsummary::DynamicDocsumConfig::createFieldWriter(fieldName, overrideName, argument, rc, matching_elems_fields);
- }
- return fieldWriter;
+ return std::make_unique<DocsumFieldWriterFactory>(getResultConfig().useV8geoPositions(), getEnvironment(), *_vsm_fields_config);
}
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h
index a660c544d7d..f423a0b478a 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h
@@ -20,9 +20,7 @@ private:
public:
DynamicDocsumConfig(search::docsummary::IDocsumEnvironment* env, search::docsummary::DynamicDocsumWriter* writer, std::shared_ptr<VsmfieldsConfig> vsm_fields_config);
private:
- std::unique_ptr<search::docsummary::DocsumFieldWriter>
- createFieldWriter(const string & fieldName, const string & overrideName,
- const string & cf, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) override;
+ std::unique_ptr<search::docsummary::IDocsumFieldWriterFactory> make_docsum_field_writer_factory() override;
};
}