aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-08-29 18:18:11 +0200
committerGitHub <noreply@github.com>2022-08-29 18:18:11 +0200
commitefa3ed8aac856672ef206f2d7f35ba5bdb32ceba (patch)
tree44d25c974802a7420fca2a4bad663330c22a711e
parente2d7ac5d88810d34bb05f6dda0d5f1005c065777 (diff)
parent7032f820c64c6a020483657b76c0ef594114d30f (diff)
Merge pull request #23837 from vespa-engine/toregge/factor-out-docsum-field-writer-factory
Factor out DocsumFieldWriterFactory.
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt2
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp115
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h29
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp103
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h22
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp16
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h21
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_type.h3
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp57
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h3
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultclass.h12
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp35
-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
18 files changed, 390 insertions, 209 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
index aec86d49d7d..963c94f7796 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
+++ b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
@@ -9,6 +9,7 @@ vespa_add_library(searchsummary_docsummary OBJECT
copy_dfw.cpp
docsumconfig.cpp
docsum_field_writer.cpp
+ docsum_field_writer_factory.cpp
docsum_store_document.cpp
docsumstate.cpp
docsumwriter.cpp
@@ -24,6 +25,7 @@ vespa_add_library(searchsummary_docsummary OBJECT
matched_elements_filter_dfw.cpp
positionsdfw.cpp
rankfeaturesdfw.cpp
+ res_config_entry.cpp
res_type_utils.cpp
resultclass.cpp
resultconfig.cpp
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
new file mode 100644
index 00000000000..fdbf9cf169d
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
@@ -0,0 +1,115 @@
+// 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 "attribute_combiner_dfw.h"
+#include "copy_dfw.h"
+#include "document_id_dfw.h"
+#include "empty_dfw.h"
+#include "geoposdfw.h"
+#include "idocsumenvironment.h"
+#include "juniperdfw.h"
+#include "matched_elements_filter_dfw.h"
+#include "positionsdfw.h"
+#include "rankfeaturesdfw.h"
+#include "summaryfeaturesdfw.h"
+#include <vespa/searchlib/common/matching_elements_fields.h>
+#include <vespa/vespalib/util/exceptions.h>
+
+using vespalib::IllegalArgumentException;
+
+namespace search::docsummary {
+
+DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env)
+ : _use_v8_geo_positions(use_v8_geo_positions),
+ _env(env),
+ _matching_elems_fields(std::make_shared<MatchingElementsFields>())
+{
+}
+
+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)
+{
+ rc = false;
+ std::unique_ptr<DocsumFieldWriter> fieldWriter;
+ if (overrideName == "dynamicteaser") {
+ if ( ! argument.empty() ) {
+ auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment()->getJuniper());
+ auto fw_ptr = fw.get();
+ fieldWriter = std::move(fw);
+ rc = fw_ptr->Init(fieldName.c_str(), argument);
+ } else {
+ throw IllegalArgumentException("Missing argument");
+ }
+ } else if (overrideName == "summaryfeatures") {
+ fieldWriter = std::make_unique<SummaryFeaturesDFW>(getEnvironment());
+ rc = true;
+ } else if (overrideName == "rankfeatures") {
+ fieldWriter = std::make_unique<RankFeaturesDFW>(getEnvironment());
+ rc = true;
+ } else if (overrideName == "empty") {
+ fieldWriter = std::make_unique<EmptyDFW>();
+ rc = true;
+ } else if (overrideName == "copy") {
+ if ( ! argument.empty() ) {
+ fieldWriter = std::make_unique<CopyDFW>(argument);
+ rc = true;
+ } else {
+ throw IllegalArgumentException("Missing argument");
+ }
+ } else if (overrideName == "absdist") {
+ if (getEnvironment()) {
+ fieldWriter = AbsDistanceDFW::create(argument.c_str(), getEnvironment()->getAttributeManager());
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "positions") {
+ if (getEnvironment()) {
+ fieldWriter = PositionsDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions);
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "geopos") {
+ if (getEnvironment()) {
+ fieldWriter = GeoPositionDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions);
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "attribute") {
+ if (getEnvironment() && getEnvironment()->getAttributeManager()) {
+ fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), argument);
+ rc = true; // Allow missing attribute vector
+ }
+ } else if (overrideName == "attributecombiner") {
+ if (getEnvironment() && getEnvironment()->getAttributeManager()) {
+ auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
+ const vespalib::string& source_field = argument.empty() ? fieldName : argument;
+ fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>());
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "matchedattributeelementsfilter") {
+ const vespalib::string& source_field = argument.empty() ? fieldName : argument;
+ if (getEnvironment() && getEnvironment()->getAttributeManager()) {
+ auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
+ if (attr_ctx->getAttribute(source_field) != nullptr) {
+ fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), source_field, true, _matching_elems_fields);
+ } else {
+ fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, _matching_elems_fields);
+ }
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "matchedelementsfilter") {
+ const vespalib::string& source_field = argument.empty() ? fieldName : argument;
+ if (getEnvironment() && getEnvironment()->getAttributeManager()) {
+ auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
+ fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, _matching_elems_fields);
+ rc = static_cast<bool>(fieldWriter);
+ }
+ } else if (overrideName == "documentid") {
+ fieldWriter = std::make_unique<DocumentIdDFW>();
+ rc = true;
+ } else {
+ throw IllegalArgumentException("unknown override operation '" + overrideName + "' for field '" + fieldName + "'.");
+ }
+ return fieldWriter;
+}
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
new file mode 100644
index 00000000000..2725ca748bd
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
@@ -0,0 +1,29 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "i_docsum_field_writer_factory.h"
+
+namespace search { class MatchingElementsFields; }
+
+namespace search::docsummary {
+
+class IDocsumEnvironment;
+
+/*
+ * Factory class for creating docsum field writers.
+ */
+class DocsumFieldWriterFactory : public IDocsumFieldWriterFactory
+{
+ bool _use_v8_geo_positions;
+ IDocsumEnvironment * _env;
+protected:
+ std::shared_ptr<MatchingElementsFields> _matching_elems_fields;
+ IDocsumEnvironment * getEnvironment() { return _env; }
+public:
+ DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env);
+ ~DocsumFieldWriterFactory() override;
+ std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override;
+};
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp
index 457d11e8f4b..0c2adcbfaa5 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp
@@ -1,20 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "docsumconfig.h"
-#include "attribute_combiner_dfw.h"
-#include "copy_dfw.h"
+#include "docsum_field_writer_factory.h"
#include "docsumwriter.h"
-#include "document_id_dfw.h"
-#include "empty_dfw.h"
-#include "geoposdfw.h"
-#include "idocsumenvironment.h"
-#include "juniperdfw.h"
-#include "matched_elements_filter_dfw.h"
-#include "positionsdfw.h"
-#include "rankfeaturesdfw.h"
-#include "summaryfeaturesdfw.h"
-#include <vespa/searchlib/common/matching_elements_fields.h>
-#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/vespalib/util/exceptions.h>
namespace search::docsummary {
@@ -27,99 +15,20 @@ DynamicDocsumConfig::getResultConfig() const {
return *_writer->GetResultConfig();
}
-std::unique_ptr<DocsumFieldWriter>
-DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields)
+std::unique_ptr<IDocsumFieldWriterFactory>
+DynamicDocsumConfig::make_docsum_field_writer_factory()
{
- const ResultConfig & resultConfig = getResultConfig();
- rc = false;
- std::unique_ptr<DocsumFieldWriter> fieldWriter;
- if (overrideName == "dynamicteaser") {
- if ( ! argument.empty() ) {
- auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment()->getJuniper());
- auto fw_ptr = fw.get();
- fieldWriter = std::move(fw);
- rc = fw_ptr->Init(fieldName.c_str(), argument);
- } else {
- throw IllegalArgumentException("Missing argument");
- }
- } else if (overrideName == "summaryfeatures") {
- fieldWriter = std::make_unique<SummaryFeaturesDFW>(getEnvironment());
- rc = true;
- } else if (overrideName == "rankfeatures") {
- fieldWriter = std::make_unique<RankFeaturesDFW>(getEnvironment());
- rc = true;
- } else if (overrideName == "empty") {
- fieldWriter = std::make_unique<EmptyDFW>();
- rc = true;
- } else if (overrideName == "copy") {
- if ( ! argument.empty() ) {
- fieldWriter = std::make_unique<CopyDFW>(argument);
- rc = true;
- } else {
- throw IllegalArgumentException("Missing argument");
- }
- } else if (overrideName == "absdist") {
- if (getEnvironment()) {
- fieldWriter = AbsDistanceDFW::create(argument.c_str(), getEnvironment()->getAttributeManager());
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "positions") {
- if (getEnvironment()) {
- fieldWriter = PositionsDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), resultConfig.useV8geoPositions());
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "geopos") {
- if (getEnvironment()) {
- fieldWriter = GeoPositionDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), resultConfig.useV8geoPositions());
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "attribute") {
- if (getEnvironment() && getEnvironment()->getAttributeManager()) {
- fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), argument);
- rc = true; // Allow missing attribute vector
- }
- } else if (overrideName == "attributecombiner") {
- if (getEnvironment() && getEnvironment()->getAttributeManager()) {
- auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
- const string& source_field = argument.empty() ? fieldName : argument;
- fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>());
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "matchedattributeelementsfilter") {
- const string& source_field = argument.empty() ? fieldName : argument;
- if (getEnvironment() && getEnvironment()->getAttributeManager()) {
- auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
- if (attr_ctx->getAttribute(source_field) != nullptr) {
- fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), source_field, true, matching_elems_fields);
- } else {
- fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, matching_elems_fields);
- }
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "matchedelementsfilter") {
- const string& source_field = argument.empty() ? fieldName : argument;
- if (getEnvironment() && getEnvironment()->getAttributeManager()) {
- auto attr_ctx = getEnvironment()->getAttributeManager()->createContext();
- fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, matching_elems_fields);
- rc = static_cast<bool>(fieldWriter);
- }
- } else if (overrideName == "documentid") {
- fieldWriter = std::make_unique<DocumentIdDFW>();
- rc = true;
- } else {
- throw IllegalArgumentException("unknown override operation '" + overrideName + "' for field '" + fieldName + "'.");
- }
- return fieldWriter;
+ return std::make_unique<DocsumFieldWriterFactory>(getResultConfig().useV8geoPositions(), getEnvironment());
}
void
DynamicDocsumConfig::configure(const vespa::config::search::SummarymapConfig &cfg)
{
std::vector<string> strCfg;
- auto matching_elems_fields = std::make_shared<MatchingElementsFields>();
+ auto docsum_field_writer_factory = make_docsum_field_writer_factory();
for (const auto & o : cfg.override) {
bool rc(false);
- std::unique_ptr<DocsumFieldWriter> fieldWriter = createFieldWriter(o.field, o.command, o.arguments, rc, matching_elems_fields);
+ auto fieldWriter = docsum_field_writer_factory->create_docsum_field_writer(o.field, o.command, o.arguments, rc);
if (rc && fieldWriter) {
rc = _writer->Override(o.field.c_str(), std::move(fieldWriter)); // OBJECT HAND-OVER
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h
index cb337f7f3d3..f5a82b4f79b 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h
@@ -8,6 +8,7 @@ namespace search { class MatchingElementsFields; }
namespace search::docsummary {
class IDocsumEnvironment;
+class IDocsumFieldWriterFactory;
class DocsumFieldWriter;
class DynamicDocsumWriter;
class ResultConfig;
@@ -26,9 +27,7 @@ protected:
IDocsumEnvironment * getEnvironment() { return _env; }
const ResultConfig & getResultConfig() const;
- virtual std::unique_ptr<DocsumFieldWriter>
- createFieldWriter(const string & fieldName, const string & overrideName,
- const string & argument, bool & rc, std::shared_ptr<MatchingElementsFields> matching_elems_fields);
+ virtual std::unique_ptr<IDocsumFieldWriterFactory> make_docsum_field_writer_factory();
private:
IDocsumEnvironment * _env;
DynamicDocsumWriter * _writer;
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
new file mode 100644
index 00000000000..927fef26d1a
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h
@@ -0,0 +1,22 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <memory>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace search::docsummary {
+
+class DocsumFieldWriter;
+
+/*
+ * Factory interface class for creating docsum field writers.
+ */
+class IDocsumFieldWriterFactory
+{
+public:
+ virtual ~IDocsumFieldWriterFactory() = default;
+ virtual std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) = 0;
+};
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp
new file mode 100644
index 00000000000..668fb9b519b
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp
@@ -0,0 +1,16 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "res_config_entry.h"
+
+namespace search::docsummary {
+
+ResConfigEntry::ResConfigEntry() noexcept
+ : _type(RES_BAD),
+ _bindname(),
+ _enumValue(0)
+{
+}
+
+ResConfigEntry::~ResConfigEntry() = default;
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h
new file mode 100644
index 00000000000..771125b1f45
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "res_type.h"
+#include <vespa/vespalib/stllike/string.h>
+
+namespace search::docsummary {
+
+/**
+ * This struct describes a single docsum field (name and type).
+ **/
+struct ResConfigEntry {
+ ResType _type;
+ vespalib::string _bindname;
+ int _enumValue;
+ ResConfigEntry() noexcept;
+ ~ResConfigEntry();
+};
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type.h b/searchsummary/src/vespa/searchsummary/docsummary/res_type.h
index 02c9f1522a4..e86e0eeedc8 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/res_type.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type.h
@@ -24,7 +24,8 @@ enum ResType {
RES_LONG_DATA,
RES_JSONSTRING,
RES_TENSOR,
- RES_FEATUREDATA
+ RES_FEATUREDATA,
+ RES_BAD
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp
index 98cc8372ac1..f7a1aae7455 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.cpp
@@ -22,8 +22,63 @@ ResTypeUtils::GetResTypeName(ResType type)
case RES_JSONSTRING: return "jsonstring";
case RES_TENSOR: return "tensor";
case RES_FEATUREDATA: return "featuredata";
+ default: return "unknown-type";
}
- return "unknown-type";
+}
+
+ResType
+ResTypeUtils::get_res_type(vespalib::stringref name)
+{
+ if (name == "integer") {
+ return RES_INT;
+ }
+ if (name == "short") {
+ return RES_SHORT;
+ }
+ if (name == "byte") {
+ return RES_BYTE;
+ }
+ if (name == "bool") {
+ return RES_BOOL;
+ }
+ if (name == "float") {
+ return RES_FLOAT;
+ }
+ if (name == "double") {
+ return RES_DOUBLE;
+ }
+ if (name == "int64") {
+ return RES_INT64;
+ }
+ if (name == "string") {
+ return RES_STRING;
+ }
+ if (name == "data") {
+ return RES_DATA;
+ }
+ if (name == "longstring") {
+ return RES_LONG_STRING;
+ }
+ if (name == "longdata") {
+ return RES_LONG_DATA;
+ }
+ if (name == "jsonstring") {
+ return RES_JSONSTRING;
+ }
+ if (name == "tensor") {
+ return RES_TENSOR;
+ }
+ if (name == "featuredata") {
+ return RES_FEATUREDATA;
+ }
+ // Known aliases
+ if (name == "raw") {
+ return RES_DATA;
+ }
+ if (name == "xmlstring") {
+ return RES_JSONSTRING;
+ }
+ return RES_BAD;
}
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h
index 9d73b7dc3fd..a2e881b5b4d 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_type_utils.h
@@ -3,6 +3,7 @@
#pragma once
#include "res_type.h"
+#include <vespa/vespalib/stllike/string.h>
namespace search::docsummary {
@@ -16,6 +17,8 @@ struct ResTypeUtils
* @param resType enum value of a result field type.
**/
static const char *GetResTypeName(ResType type);
+
+ static ResType get_res_type(vespalib::stringref name);
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
index 5df9ebebdf0..13bd122362a 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
@@ -2,7 +2,7 @@
#pragma once
-#include "res_type.h"
+#include "res_config_entry.h"
#include <vespa/searchlib/util/rawbuf.h>
#include <vespa/vespalib/stllike/string.h>
#include <vespa/vespalib/stllike/hash_map.h>
@@ -11,16 +11,6 @@
namespace search::docsummary {
/**
- * This struct describes a single docsum field (name and type).
- **/
-struct ResConfigEntry {
- ResType _type;
- vespalib::string _bindname;
- int _enumValue;
-};
-
-
-/**
* This class represents a specific docsum format (docsum class). It
* contains an array of ResConfigEntry instances (config
* entries). It also contains methods for mapping both
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
index 85d197f799a..f5e4c5d34cf 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
@@ -129,39 +129,10 @@ ResultConfig::ReadConfig(const vespa::config::search::SummaryConfig &cfg, const
for (unsigned int j = 0; rc && (j < cfg_class.fields.size()); j++) {
const char *fieldtype = cfg_class.fields[j].type.c_str();
const char *fieldname = cfg_class.fields[j].name.c_str();
+ auto res_type = ResTypeUtils::get_res_type(fieldtype);
LOG(debug, "Reconfiguring class '%s' field '%s' of type '%s'", cfg_class.name.c_str(), fieldname, fieldtype);
- if (strcmp(fieldtype, "integer") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_INT);
- } else if (strcmp(fieldtype, "short") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_SHORT);
- } else if (strcmp(fieldtype, "bool") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_BOOL);
- } else if (strcmp(fieldtype, "byte") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_BYTE);
- } else if (strcmp(fieldtype, "float") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_FLOAT);
- } else if (strcmp(fieldtype, "double") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_DOUBLE);
- } else if (strcmp(fieldtype, "int64") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_INT64);
- } else if (strcmp(fieldtype, "string") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_STRING);
- } else if (strcmp(fieldtype, "data") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_DATA);
- } else if (strcmp(fieldtype, "raw") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_DATA);
- } else if (strcmp(fieldtype, "longstring") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_LONG_STRING);
- } else if (strcmp(fieldtype, "longdata") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_LONG_DATA);
- } else if (strcmp(fieldtype, "xmlstring") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_JSONSTRING);
- } else if (strcmp(fieldtype, "jsonstring") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_JSONSTRING);
- } else if (strcmp(fieldtype, "tensor") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_TENSOR);
- } else if (strcmp(fieldtype, "featuredata") == 0) {
- rc = resClass->AddConfigEntry(fieldname, RES_FEATUREDATA);
+ if (res_type != RES_BAD) {
+ rc = resClass->AddConfigEntry(fieldname, res_type);
} else {
LOG(error, "%s %s.fields[%d]: unknown type '%s'", configId, cfg_class.name.c_str(), j, fieldtype);
rc = false;
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;
};
}