diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-09-02 17:43:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-02 17:43:55 +0200 |
commit | d48dc47be7c68dbdb4efd2acdba9cb8563b80e98 (patch) | |
tree | b31be0abecc81f672a8aca17ee19969a838895cf | |
parent | e3ee4675463c373d699f6f31479d171868bcfc7e (diff) |
Revert "Use commands from summary config to setup document field rewriters."
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 |