aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-09-02 17:43:55 +0200
committerGitHub <noreply@github.com>2022-09-02 17:43:55 +0200
commitd48dc47be7c68dbdb4efd2acdba9cb8563b80e98 (patch)
treeb31be0abecc81f672a8aca17ee19969a838895cf
parente3ee4675463c373d699f6f31479d171868bcfc7e (diff)
Revert "Use commands from summary config to setup document field rewriters."
-rw-r--r--searchcore/src/tests/proton/docsummary/docsummary.cpp17
-rw-r--r--searchcore/src/tests/proton/docsummary/summary.cfg33
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp11
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt1
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp41
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h37
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp61
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h7
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp6
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultclass.cpp23
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultclass.h6
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp16
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h3
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp2
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt1
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp24
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h27
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp12
20 files changed, 204 insertions, 133 deletions
diff --git a/searchcore/src/tests/proton/docsummary/docsummary.cpp b/searchcore/src/tests/proton/docsummary/docsummary.cpp
index b034b77086c..93e8f3d248b 100644
--- a/searchcore/src/tests/proton/docsummary/docsummary.cpp
+++ b/searchcore/src/tests/proton/docsummary/docsummary.cpp
@@ -35,7 +35,6 @@
#include <vespa/searchlib/tensor/tensor_attribute.h>
#include <vespa/searchlib/transactionlog/nosyncproxy.h>
#include <vespa/searchlib/transactionlog/translogserver.h>
-#include <vespa/searchsummary/docsummary/i_docsum_field_writer_factory.h>
#include <vespa/searchsummary/docsummary/i_docsum_store_document.h>
#include <vespa/searchsummary/docsummary/summaryfieldconverter.h>
#include <vespa/vespalib/data/simple_buffer.h>
@@ -78,19 +77,6 @@ using namespace vespalib::slime;
namespace proton {
-class MockDocsumFieldWriterFactory : public search::docsummary::IDocsumFieldWriterFactory
-{
-public:
- std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override {
- (void) fieldName;
- (void) overrideName;
- (void) argument;
- (void) rc;
- return {};
- }
-
-};
-
class DirMaker
{
public:
@@ -1135,8 +1121,7 @@ Fixture::Fixture()
std::string cfgId("summary");
_summaryCfg = ConfigGetter<vespa::config::search::SummaryConfig>::getConfig(
cfgId, ::config::FileSpec(TEST_PATH("summary.cfg")));
- auto docsum_field_writer_factory = std::make_unique<MockDocsumFieldWriterFactory>();
- _resultCfg.ReadConfig(*_summaryCfg, cfgId.c_str(), *docsum_field_writer_factory);
+ _resultCfg.ReadConfig(*_summaryCfg, cfgId.c_str());
}
Fixture::~Fixture() = default;
diff --git a/searchcore/src/tests/proton/docsummary/summary.cfg b/searchcore/src/tests/proton/docsummary/summary.cfg
index 33641351c02..cceb15c8fd2 100644
--- a/searchcore/src/tests/proton/docsummary/summary.cfg
+++ b/searchcore/src/tests/proton/docsummary/summary.cfg
@@ -61,54 +61,31 @@ classes[2].id 2
classes[2].fields[2]
classes[2].fields[0].name "aa"
classes[2].fields[0].type "integer"
-classes[2].fields[0].command "copy"
-classes[2].fields[0].source "ab"
classes[2].fields[1].name "ab"
classes[2].fields[1].type "integer"
-classes[2].fields[1].command "empty"
classes[3].name "class3"
classes[3].id 3
classes[3].fields[10]
classes[3].fields[0].name "ba"
classes[3].fields[0].type "integer"
-classes[3].fields[0].command "attribute"
-classes[3].fields[0].source "ba"
classes[3].fields[1].name "bb"
classes[3].fields[1].type "float"
-classes[3].fields[1].command "attribute"
-classes[3].fields[1].source "bb"
classes[3].fields[2].name "bc"
classes[3].fields[2].type "longstring"
-classes[3].fields[2].command "attribute"
-classes[3].fields[2].source "bc"
classes[3].fields[3].name "bd"
classes[3].fields[3].type "jsonstring"
-classes[3].fields[3].command "attribute"
-classes[3].fields[3].source "bd"
classes[3].fields[4].name "be"
classes[3].fields[4].type "jsonstring"
-classes[3].fields[4].command "attribute"
-classes[3].fields[4].source "be"
classes[3].fields[5].name "bf"
classes[3].fields[5].type "jsonstring"
-classes[3].fields[5].command "attribute"
-classes[3].fields[5].source "bf"
classes[3].fields[6].name "bg"
classes[3].fields[6].type "jsonstring"
-classes[3].fields[6].command "attribute"
-classes[3].fields[6].source "bg"
classes[3].fields[7].name "bh"
classes[3].fields[7].type "jsonstring"
-classes[3].fields[7].command "attribute"
-classes[3].fields[7].source "bh"
classes[3].fields[8].name "bi"
classes[3].fields[8].type "jsonstring"
-classes[3].fields[8].command "attribute"
-classes[3].fields[8].source "bi"
classes[3].fields[9].name "bj"
classes[3].fields[9].type "tensor"
-classes[3].fields[9].command "attribute"
-classes[3].fields[9].source "bj"
classes[4].name "class4"
classes[4].id 4
classes[4].fields[1]
@@ -121,28 +98,18 @@ classes[5].fields[0].name "sp2"
classes[5].fields[0].type "int64"
classes[5].fields[1].name "sp2x"
classes[5].fields[1].type "xmlstring"
-classes[5].fields[1].command "positions"
-classes[5].fields[1].source "sp2"
classes[5].fields[2].name "ap2"
classes[5].fields[2].type "jsonstring"
classes[5].fields[3].name "ap2x"
classes[5].fields[3].type "xmlstring"
-classes[5].fields[3].command "positions"
-classes[5].fields[3].source "ap2"
classes[5].fields[4].name "wp2"
classes[5].fields[4].type "jsonstring"
classes[5].fields[5].name "wp2x"
classes[5].fields[5].type "xmlstring"
-classes[5].fields[5].command "positions"
-classes[5].fields[5].source "wp2"
classes[6].name "class6"
classes[6].id 6
classes[6].fields[6]
classes[6].fields[0].name "ba"
classes[6].fields[0].type "integer"
-classes[6].fields[0].command "attribute"
-classes[6].fields[0].source "ba"
classes[6].fields[1].name "bb"
classes[6].fields[1].type "float"
-classes[6].fields[1].command "attribute"
-classes[6].fields[1].source "bb"
diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
index 9a4ec121d3b..942dac63955 100644
--- a/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/docsummary/docsumcontext.cpp
@@ -71,13 +71,13 @@ makeSlimeParams(size_t chunkSize) {
vespalib::Slime::UP
DocsumContext::createSlimeReply()
{
- IDocsumWriter::ResolveClassInfo rci = _docsumWriter.resolveClassInfo(_docsumState._args.getResultClassName());
- _docsumWriter.InitState(_attrMgr, _docsumState, rci);
+ _docsumWriter.InitState(_attrMgr, &_docsumState);
const size_t estimatedChunkSize(std::min(0x200000ul, _docsumState._docsumbuf.size()*0x400ul));
vespalib::Slime::UP response(std::make_unique<vespalib::Slime>(makeSlimeParams(estimatedChunkSize)));
Cursor & root = response->setObject();
Cursor & array = root.setArray(DOCSUMS);
const Symbol docsumSym = response->insert(DOCSUM);
+ IDocsumWriter::ResolveClassInfo rci = _docsumWriter.resolveClassInfo(_docsumState._args.getResultClassName());
_docsumState._omit_summary_features = (rci.outputClass != nullptr) ? rci.outputClass->omit_summary_features() : true;
uint32_t num_ok(0);
for (uint32_t docId : _docsumState._docsumbuf) {
diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
index 6a0133e913d..3e3a3529e46 100644
--- a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
+++ b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
@@ -9,7 +9,7 @@
#include <vespa/juniper/rpinterface.h>
#include <vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.h>
#include <vespa/vespalib/util/lambdatask.h>
-#include <vespa/searchsummary/docsummary/docsum_field_writer_factory.h>
+#include <vespa/searchsummary/docsummary/docsumconfig.h>
#include <vespa/searchsummary/docsummary/keywordextractor.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/fastlib/text/normwordfolder.h>
@@ -92,10 +92,8 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg,
_docStore(std::move(docStore)),
_repo(std::move(repo))
{
- _juniperConfig = std::make_unique<juniper::Juniper>(&_juniperProps, _wordFolder.get());
auto resultConfig = std::make_unique<ResultConfig>();
- auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summaryCfg.usev8geopositions, *this);
- if (!resultConfig->ReadConfig(summaryCfg, make_string("SummaryManager(%s)", baseDir.c_str()).c_str(), *docsum_field_writer_factory)) {
+ if (!resultConfig->ReadConfig(summaryCfg, make_string("SummaryManager(%s)", baseDir.c_str()).c_str())) {
std::ostringstream oss;
::config::OstreamConfigWriter writer(oss);
writer.write(summaryCfg);
@@ -103,10 +101,11 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg,
(make_string("Could not initialize summary result config for directory '%s' based on summary config '%s'",
baseDir.c_str(), oss.str().c_str()));
}
- docsum_field_writer_factory.reset();
+ _juniperConfig = std::make_unique<juniper::Juniper>(&_juniperProps, _wordFolder.get());
_docsumWriter = std::make_unique<DynamicDocsumWriter>(std::move(resultConfig), std::unique_ptr<KeywordExtractor>());
- (void) summarymapCfg;
+ DynamicDocsumConfig dynCfg(*this, _docsumWriter.get());
+ dynCfg.configure(summarymapCfg);
}
IDocsumStore::UP
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
index 8070bed8b03..963c94f7796 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
+++ b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
@@ -7,6 +7,7 @@ vespa_add_library(searchsummary_docsummary OBJECT
attributedfw.cpp
check_undefined_value_visitor.cpp
copy_dfw.cpp
+ docsumconfig.cpp
docsum_field_writer.cpp
docsum_field_writer_factory.cpp
docsum_store_document.cpp
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp
new file mode 100644
index 00000000000..0c2adcbfaa5
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.cpp
@@ -0,0 +1,41 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "docsumconfig.h"
+#include "docsum_field_writer_factory.h"
+#include "docsumwriter.h"
+#include <vespa/vespalib/util/exceptions.h>
+
+namespace search::docsummary {
+
+using vespalib::IllegalArgumentException;
+using vespalib::make_string;
+
+const ResultConfig &
+DynamicDocsumConfig::getResultConfig() const {
+ return *_writer->GetResultConfig();
+}
+
+std::unique_ptr<IDocsumFieldWriterFactory>
+DynamicDocsumConfig::make_docsum_field_writer_factory()
+{
+ return std::make_unique<DocsumFieldWriterFactory>(getResultConfig().useV8geoPositions(), getEnvironment());
+}
+
+void
+DynamicDocsumConfig::configure(const vespa::config::search::SummarymapConfig &cfg)
+{
+ std::vector<string> strCfg;
+ auto docsum_field_writer_factory = make_docsum_field_writer_factory();
+ for (const auto & o : cfg.override) {
+ bool rc(false);
+ 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
+ }
+ if (!rc) {
+ throw IllegalArgumentException(o.command + " override operation failed during initialization");
+ }
+ }
+}
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h
new file mode 100644
index 00000000000..2b0f90a8e8b
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumconfig.h
@@ -0,0 +1,37 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/config-summarymap.h>
+
+namespace search { class MatchingElementsFields; }
+namespace search::docsummary {
+
+class IDocsumEnvironment;
+class IDocsumFieldWriterFactory;
+class DocsumFieldWriter;
+class DynamicDocsumWriter;
+class ResultConfig;
+
+class DynamicDocsumConfig
+{
+public:
+ DynamicDocsumConfig(const IDocsumEnvironment& env, DynamicDocsumWriter * writer) :
+ _env(env),
+ _writer(writer)
+ { }
+ virtual ~DynamicDocsumConfig() = default;
+ void configure(const vespa::config::search::SummarymapConfig &cfg);
+protected:
+ using string = vespalib::string;
+ const IDocsumEnvironment& getEnvironment() { return _env; }
+ const ResultConfig & getResultConfig() const;
+
+ virtual std::unique_ptr<IDocsumFieldWriterFactory> make_docsum_field_writer_factory();
+private:
+ const IDocsumEnvironment& _env;
+ DynamicDocsumWriter * _writer;
+};
+
+}
+
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
index 181af0ca9a3..89de20b6a81 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
@@ -60,7 +60,7 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid,
vespalib::slime::Cursor & docsum = topInserter.insertObject();
for (uint32_t i = 0; i < rci.outputClass->GetNumEntries(); ++i) {
const ResConfigEntry *resCfg = rci.outputClass->GetEntry(i);
- const DocsumFieldWriter *writer = resCfg->_docsum_field_writer.get();
+ const DocsumFieldWriter *writer = _overrideTable[resCfg->_enumValue].get();
if (state->_args.needField(resCfg->_bindname) && ! writer->isDefaultValue(docid, state)) {
const Memory field_name(resCfg->_bindname.data(), resCfg->_bindname.size());
ObjectInserter inserter(docsum, field_name);
@@ -78,7 +78,7 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid,
for (uint32_t i = 0; i < rci.outputClass->GetNumEntries(); ++i) {
const ResConfigEntry *outCfg = rci.outputClass->GetEntry(i);
if ( ! state->_args.needField(outCfg->_bindname)) continue;
- const DocsumFieldWriter *writer = outCfg->_docsum_field_writer.get();
+ const DocsumFieldWriter *writer = _overrideTable[outCfg->_enumValue].get();
const Memory field_name(outCfg->_bindname.data(), outCfg->_bindname.size());
ObjectInserter inserter(docsum, field_name);
if (writer != nullptr) {
@@ -96,31 +96,60 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid,
DynamicDocsumWriter::DynamicDocsumWriter(std::unique_ptr<ResultConfig> config, std::unique_ptr<KeywordExtractor> extractor)
: _resultConfig(std::move(config)),
- _keywordExtractor(std::move(extractor))
+ _keywordExtractor(std::move(extractor)),
+ _numFieldWriterStates(0),
+ _overrideTable(_resultConfig->GetFieldNameEnum().GetNumEntries())
{
}
DynamicDocsumWriter::~DynamicDocsumWriter() = default;
-void
-DynamicDocsumWriter::InitState(const IAttributeManager & attrMan, GetDocsumsState& state, const ResolveClassInfo& rci)
+bool
+DynamicDocsumWriter::Override(const char *fieldName, std::unique_ptr<DocsumFieldWriter> writer)
{
- state._kwExtractor = _keywordExtractor.get();
- state._attrCtx = attrMan.createContext();
- auto result_class = rci.outputClass;
- if (result_class == nullptr) {
- return;
+ uint32_t fieldEnumValue = _resultConfig->GetFieldNameEnum().Lookup(fieldName);
+
+ if (fieldEnumValue >= _overrideTable.size() || _overrideTable[fieldEnumValue]) {
+ if (fieldEnumValue >= _overrideTable.size()) {
+ LOG(warning, "cannot override docsum field '%s'; undefined field name", fieldName);
+ } else if (_overrideTable[fieldEnumValue] != nullptr) {
+ LOG(warning, "cannot override docsum field '%s'; already overridden", fieldName);
+ }
+ return false;
}
- size_t num_entries = result_class->GetNumEntries();
- state._attributes.resize(num_entries);
- state._fieldWriterStates.resize(result_class->get_num_field_writer_states());
- for (size_t i(0); i < num_entries; i++) {
- const DocsumFieldWriter *fw = result_class->GetEntry(i)->_docsum_field_writer.get();
+
+ writer->setIndex(fieldEnumValue);
+ auto writer_ptr = writer.get();
+ _overrideTable[fieldEnumValue] = std::move(writer);
+ if (writer_ptr->setFieldWriterStateIndex(_numFieldWriterStates)) {
+ ++_numFieldWriterStates;
+ }
+
+ bool generated = writer_ptr->IsGenerated();
+ for (auto & result_class : *_resultConfig) {
+ if (result_class.GetIndexFromEnumValue(fieldEnumValue) >= 0) {
+ result_class.getDynamicInfo().update_override_counts(generated);
+ }
+ }
+
+ return true;
+}
+
+
+void
+DynamicDocsumWriter::InitState(const IAttributeManager & attrMan, GetDocsumsState *state)
+{
+ state->_kwExtractor = _keywordExtractor.get();
+ state->_attrCtx = attrMan.createContext();
+ state->_attributes.resize(_overrideTable.size());
+ state->_fieldWriterStates.resize(_numFieldWriterStates);
+ for (size_t i(0); i < state->_attributes.size(); i++) {
+ const DocsumFieldWriter *fw = _overrideTable[i].get();
if (fw) {
const vespalib::string & attributeName = fw->getAttributeName();
if (!attributeName.empty()) {
- state._attributes[i] = state._attrCtx->getAttribute(attributeName);
+ state->_attributes[i] = state->_attrCtx->getAttribute(attributeName);
}
}
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
index c0579638593..9ae44623475 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
@@ -36,7 +36,7 @@ public:
};
virtual ~IDocsumWriter() = default;
- virtual void InitState(const search::IAttributeManager & attrMan, GetDocsumsState& state, const ResolveClassInfo& rci) = 0;
+ virtual void InitState(const search::IAttributeManager & attrMan, GetDocsumsState *state) = 0;
virtual void insertDocsum(const ResolveClassInfo & rci, uint32_t docid, GetDocsumsState *state,
IDocsumStore *docinfos, Inserter & target) = 0;
virtual ResolveClassInfo resolveClassInfo(vespalib::stringref outputClassName) const = 0;
@@ -49,6 +49,8 @@ class DynamicDocsumWriter : public IDocsumWriter
private:
std::unique_ptr<ResultConfig> _resultConfig;
std::unique_ptr<KeywordExtractor> _keywordExtractor;
+ uint32_t _numFieldWriterStates;
+ std::vector<std::unique_ptr<const DocsumFieldWriter>> _overrideTable;
ResolveClassInfo resolveOutputClass(vespalib::stringref outputClassName) const;
@@ -60,7 +62,8 @@ public:
const ResultConfig *GetResultConfig() { return _resultConfig.get(); }
- void InitState(const search::IAttributeManager & attrMan, GetDocsumsState& state, const ResolveClassInfo& rci) override;
+ bool Override(const char *fieldName, std::unique_ptr<DocsumFieldWriter> writer);
+ void InitState(const search::IAttributeManager & attrMan, GetDocsumsState *state) override;
void insertDocsum(const ResolveClassInfo & outputClassInfo, uint32_t docid, GetDocsumsState *state,
IDocsumStore *docinfos, Inserter & inserter) override;
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp
index b00b5d975a2..668fb9b519b 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.cpp
@@ -1,20 +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"
-#include "docsum_field_writer.h"
namespace search::docsummary {
ResConfigEntry::ResConfigEntry() noexcept
: _type(RES_BAD),
_bindname(),
- _enumValue(0),
- _docsum_field_writer()
+ _enumValue(0)
{
}
ResConfigEntry::~ResConfigEntry() = default;
-ResConfigEntry::ResConfigEntry(ResConfigEntry&&) noexcept = default;
-
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h
index 6277e955c3d..771125b1f45 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/res_config_entry.h
@@ -4,12 +4,9 @@
#include "res_type.h"
#include <vespa/vespalib/stllike/string.h>
-#include <memory>
namespace search::docsummary {
-class DocsumFieldWriter;
-
/**
* This struct describes a single docsum field (name and type).
**/
@@ -17,10 +14,8 @@ struct ResConfigEntry {
ResType _type;
vespalib::string _bindname;
int _enumValue;
- std::unique_ptr<DocsumFieldWriter> _docsum_field_writer;
ResConfigEntry() noexcept;
~ResConfigEntry();
- ResConfigEntry(ResConfigEntry&&) noexcept;
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.cpp
index 78a9804ccd4..9930c39cb7b 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.cpp
@@ -1,7 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "resultclass.h"
-#include "docsum_field_writer.h"
#include "resultconfig.h"
#include <vespa/vespalib/stllike/hashtable.hpp>
#include <cassert>
@@ -15,8 +14,7 @@ ResultClass::ResultClass(const char *name, util::StringEnum & fieldEnum)
_fieldEnum(fieldEnum),
_enumMap(),
_dynInfo(),
- _omit_summary_features(false),
- _num_field_writer_states(0)
+ _omit_summary_features(false)
{ }
@@ -30,7 +28,7 @@ ResultClass::GetIndexFromName(const char* name) const
}
bool
-ResultClass::AddConfigEntry(const char *name, ResType type, std::unique_ptr<DocsumFieldWriter> docsum_field_writer)
+ResultClass::AddConfigEntry(const char *name, ResType type)
{
if (_nameMap.find(name) != _nameMap.end())
return false;
@@ -41,25 +39,10 @@ ResultClass::AddConfigEntry(const char *name, ResType type, std::unique_ptr<Docs
e._bindname = name;
e._enumValue = _fieldEnum.Add(name);
assert(e._enumValue >= 0);
- if (docsum_field_writer) {
- docsum_field_writer->setIndex(_entries.size());
- bool generated = docsum_field_writer->IsGenerated();
- getDynamicInfo().update_override_counts(generated);
- if (docsum_field_writer->setFieldWriterStateIndex(_num_field_writer_states)) {
- ++_num_field_writer_states;
- }
- }
- e._docsum_field_writer = std::move(docsum_field_writer);
- _entries.push_back(std::move(e));
+ _entries.push_back(e);
return true;
}
-bool
-ResultClass::AddConfigEntry(const char *name, ResType type)
-{
- return AddConfigEntry(name, type, {});
-}
-
void
ResultClass::CreateEnumMap()
{
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
index e11032d1aac..39e94e5050e 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultclass.h
@@ -50,7 +50,6 @@ private:
// Whether or not summary features should be omitted when filling this summary class.
// As default, summary features are always included.
bool _omit_summary_features;
- size_t _num_field_writer_states;
public:
typedef std::unique_ptr<ResultClass> UP;
@@ -96,13 +95,10 @@ public:
* @return true(success)/false(fail)
* @param name the name of the field to add.
* @param type the type of the field to add.
- * @param docsum_field_writer field writer for writing field
**/
- bool AddConfigEntry(const char *name, ResType type, std::unique_ptr<DocsumFieldWriter> docsum_field_writer);
bool AddConfigEntry(const char *name, ResType type);
-
/**
* This method may be called to create an internal mapping from
* field name enumerated value to field index. When building up a
@@ -173,8 +169,6 @@ public:
bool omit_summary_features() const {
return _omit_summary_features;
}
-
- size_t get_num_field_writer_states() const noexcept { return _num_field_writer_states; }
};
}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
index 63ccf80d4e7..f5e4c5d34cf 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.cpp
@@ -1,8 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "resultconfig.h"
-#include "docsum_field_writer.h"
-#include "docsum_field_writer_factory.h"
#include "resultclass.h"
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/vespalib/stllike/hash_map.hpp>
@@ -101,7 +99,7 @@ bool ResultConfig::wantedV8geoPositions() {
}
bool
-ResultConfig::ReadConfig(const vespa::config::search::SummaryConfig &cfg, const char *configId, IDocsumFieldWriterFactory& docsum_field_writer_factory)
+ResultConfig::ReadConfig(const vespa::config::search::SummaryConfig &cfg, const char *configId)
{
bool rc = true;
Reset();
@@ -131,20 +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();
- vespalib::string override_name = cfg_class.fields[j].command;
- vespalib::string source_name = cfg_class.fields[j].source;
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 (res_type != RES_BAD) {
- std::unique_ptr<DocsumFieldWriter> docsum_field_writer;
- if (!override_name.empty()) {
- docsum_field_writer = docsum_field_writer_factory.create_docsum_field_writer(fieldname, override_name, source_name, rc);
- if (!rc) {
- LOG(error, "%s override operation failed during initialization", override_name.c_str());
- break;
- }
- }
- rc = resClass->AddConfigEntry(fieldname, res_type, std::move(docsum_field_writer));
+ 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/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h
index 9aaf6fa65b3..220c988b634 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/resultconfig.h
@@ -8,7 +8,6 @@
namespace search::docsummary {
-class IDocsumFieldWriterFactory;
class ResultClass;
/**
@@ -177,7 +176,7 @@ public:
* @return true(success)/false(fail)
* @param configId reference on server
**/
- bool ReadConfig(const vespa::config::search::SummaryConfig &cfg, const char *configId, IDocsumFieldWriterFactory& docsum_field_writer_factory);
+ bool ReadConfig(const vespa::config::search::SummaryConfig &cfg, const char *configId);
};
}
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
index 0bf41f9a379..9c39d929e4c 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
@@ -161,7 +161,7 @@ SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::str
if (_stack_dump.has_value()) {
ds._args.SetStackDump(_stack_dump.value().size(), _stack_dump.value().data());
}
- _docsumWriter->InitState(_attr_manager, ds, state->get_resolve_class_info());
+ _docsumWriter->InitState(_attr_manager, &ds);
auto insres = _docsum_states.insert(std::make_pair(summary_class, std::move(state)));
return *insres.first->second;
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
index 1e766baf0ed..6afb61078c7 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
+++ b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt
@@ -9,6 +9,7 @@ vespa_add_library(vsm_vsmbase OBJECT
slimefieldwriter.cpp
snippetmodifier.cpp
vsm-adapter.cpp
+ docsumconfig.cpp
DEPENDS
vsm_vconfig
)
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp
new file mode 100644
index 00000000000..59e56e657be
--- /dev/null
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp
@@ -0,0 +1,24 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "docsumconfig.h"
+#include <vespa/searchsummary/docsummary/resultconfig.h>
+#include <vespa/vsm/config/config-vsmfields.h>
+#include "docsum_field_writer_factory.h"
+
+using vespa::config::search::vsm::VsmfieldsConfig;
+
+namespace vsm {
+
+DynamicDocsumConfig::DynamicDocsumConfig(const 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<search::docsummary::IDocsumFieldWriterFactory>
+DynamicDocsumConfig::make_docsum_field_writer_factory()
+{
+ 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
new file mode 100644
index 00000000000..760d493dbc1
--- /dev/null
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h
@@ -0,0 +1,27 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/searchsummary/docsummary/docsumconfig.h>
+
+namespace vespa::config::search::vsm {
+namespace internal { class InternalVsmfieldsType; }
+typedef const internal::InternalVsmfieldsType VsmfieldsConfig;
+}
+namespace vsm {
+
+class DynamicDocsumConfig : public search::docsummary::DynamicDocsumConfig
+{
+public:
+ using Parent = search::docsummary::DynamicDocsumConfig;
+ using VsmfieldsConfig = vespa::config::search::vsm::VsmfieldsConfig;
+private:
+ std::shared_ptr<VsmfieldsConfig> _vsm_fields_config;
+public:
+ DynamicDocsumConfig(const search::docsummary::IDocsumEnvironment& env, search::docsummary::DynamicDocsumWriter* writer, std::shared_ptr<VsmfieldsConfig> vsm_fields_config);
+private:
+ std::unique_ptr<search::docsummary::IDocsumFieldWriterFactory> make_docsum_field_writer_factory() override;
+};
+
+}
+
diff --git a/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp b/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
index e220cf685e2..2bf6b2f3972 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
@@ -1,7 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "vsm-adapter.hpp"
-#include "docsum_field_writer_factory.h"
+#include "docsumconfig.h"
#include "i_matching_elements_filler.h"
#include <vespa/searchlib/common/matching_elements.h>
#include <vespa/searchsummary/docsummary/keywordextractor.h>
@@ -144,18 +144,16 @@ VSMAdapter::configure(const VSMConfigSnapshot & snapshot)
// create new docsum tools
auto docsumTools = std::make_unique<DocsumTools>();
- // configure juniper (used by search::docsummary::DocsumFieldWriterFactory)
+ // configure juniper (used when configuring DynamicDocsumConfig)
_juniperProps = std::make_unique<JuniperProperties>(*juniperrc);
auto juniper = std::make_unique<juniper::Juniper>(_juniperProps.get(), &_wordFolder);
docsumTools->setJuniper(std::move(juniper));
// init result config
auto resCfg = std::make_unique<ResultConfig>();
- auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summary.get()->usev8geopositions, *docsumTools, *_fieldsCfg.get());
- if ( ! resCfg->ReadConfig(*summary.get(), _configId.c_str(), *docsum_field_writer_factory)) {
+ if ( ! resCfg->ReadConfig(*summary.get(), _configId.c_str())) {
throw std::runtime_error("(re-)configuration of VSM (docsum tools) failed due to bad summary config");
}
- docsum_field_writer_factory.reset();
// init keyword extractor
auto kwExtractor = std::make_unique<KeywordExtractor>(nullptr);
@@ -167,6 +165,10 @@ VSMAdapter::configure(const VSMConfigSnapshot & snapshot)
auto writer = std::make_unique<DynamicDocsumWriter>(std::move(resCfg), std::move(kwExtractor));
docsumTools->set_writer(std::move(writer));
+ // configure dynamic docsum writer
+ DynamicDocsumConfig dynDocsumConfig(*docsumTools, docsumTools->getDocsumWriter(), _fieldsCfg.get());
+ dynDocsumConfig.configure(*summaryMap.get());
+
// configure new docsum tools
if (docsumTools->obtainFieldNames(vsmSummary)) {
// latch new docsum tools into production