diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-09-19 17:15:56 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-09-19 17:15:56 +0200 |
commit | 8b99ea30175098760c26e8a44442b59bc879c007 (patch) | |
tree | 58e7a2dcaabbd7b261d2a219c27c2cc29c267f81 /streamingvisitors | |
parent | dd11dce329e66dc6474a00b798f46a1ee5febfb0 (diff) |
Stop using summary field type for streaming search.
Diffstat (limited to 'streamingvisitors')
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp | 7 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h | 13 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp | 30 |
3 files changed, 27 insertions, 23 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp index 3d689b385b3..44321518c46 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp @@ -20,16 +20,15 @@ DocsumFieldSpec::FieldIdentifier & DocsumFieldSpec::FieldIdentifier::operator=(F DocsumFieldSpec::FieldIdentifier::~FieldIdentifier() = default; DocsumFieldSpec::DocsumFieldSpec() : - _resultType(search::docsummary::RES_INT), + _struct_or_multivalue(false), _command(VsmsummaryConfig::Fieldmap::Command::NONE), _outputField(), _inputFields(), _filter() { } -DocsumFieldSpec::DocsumFieldSpec(search::docsummary::ResType resultType, - VsmsummaryConfig::Fieldmap::Command command) : - _resultType(resultType), +DocsumFieldSpec::DocsumFieldSpec(VsmsummaryConfig::Fieldmap::Command command) : + _struct_or_multivalue(false), _command(command), _outputField(), _inputFields(), diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h index e08ae8c6e71..52ba099ee51 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h @@ -1,9 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once -#include <vespa/searchsummary/docsummary/resultclass.h> #include <vespa/vsm/common/document.h> -#include <vespa/vsm/common/storagedocument.h> #include <vespa/vsm/config/vsm-cfif.h> namespace search::docsummary { class SlimeFillerFilter; } @@ -15,6 +13,7 @@ namespace vsm { **/ class DocsumFieldSpec { public: + using FieldPath = document::FieldPath; /** * This class contains a field id and a field path (to navigate a field value). **/ @@ -38,7 +37,7 @@ public: typedef std::vector<FieldIdentifier> FieldIdentifierVector; private: - search::docsummary::ResType _resultType; + bool _struct_or_multivalue; VsmsummaryConfig::Fieldmap::Command _command; FieldIdentifier _outputField; FieldIdentifierVector _inputFields; @@ -46,14 +45,12 @@ private: public: DocsumFieldSpec(); - DocsumFieldSpec(search::docsummary::ResType resultType, VsmsummaryConfig::Fieldmap::Command command); + DocsumFieldSpec(VsmsummaryConfig::Fieldmap::Command command); DocsumFieldSpec(DocsumFieldSpec&&) noexcept; ~DocsumFieldSpec(); - /** - * Returns the result type for the summary field. - **/ - search::docsummary::ResType getResultType() const { return _resultType; } + bool is_struct_or_multivalue() const noexcept { return _struct_or_multivalue; } + void set_struct_or_multivalue(bool struct_or_multivalue) { _struct_or_multivalue = struct_or_multivalue; } /** * Returns the command specifying how to transform input fields into output summary field. diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp index 534f8b92445..ec28688196e 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp @@ -19,7 +19,7 @@ LOG_SETUP(".vsm.docsumfilter"); using namespace search::docsummary; - +using document::FieldPathEntry; namespace vsm { @@ -30,6 +30,17 @@ bool is_struct_or_multivalue_field_type(const document::DataType& data_type) return (data_type.isStructured() || data_type.isArray() || data_type.isWeightedSet() || data_type.isMap()); } +bool is_struct_or_multivalue_field_type(const FieldPath& fp) +{ + if (fp.size() == 1u) { + auto& fpe = fp[0]; + if (fpe.getType() == FieldPathEntry::Type::STRUCT_FIELD && is_struct_or_multivalue_field_type(fpe.getDataType())) { + return true; + } + } + return false; +} + /* * This class creates a modified field value which is then passed to * the original juniper converter. @@ -207,6 +218,9 @@ DocsumFilter::prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldS if (field != FieldMap::npos) { if (field < fieldPathMap.size()) { spec.setOutputField(DocsumFieldSpec::FieldIdentifier(field, copyPathButFirst(fieldPathMap[field]))); + if (is_struct_or_multivalue_field_type(fieldPathMap[field])) { + spec.set_struct_or_multivalue(true); + } } else { LOG(warning, "Could not find a field path for field '%s' with id '%d'", name.c_str(), field); spec.setOutputField(DocsumFieldSpec::FieldIdentifier(field, FieldPath())); @@ -217,7 +231,7 @@ DocsumFilter::prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldS } // setup input fields std::unique_ptr<SlimeFillerFilter> filter; - if (spec.getResultType() == RES_JSONSTRING) { + if (spec.is_struct_or_multivalue()) { filter = std::make_unique<SlimeFillerFilter>(); } for (size_t i = 0; i < toolsSpec.getInputNames().size(); ++i) { @@ -296,7 +310,7 @@ void DocsumFilter::init(const FieldMap & fieldMap, const FieldPathMapT & fieldPa for (uint32_t i = 0; i < entryCnt; ++i) { const ResConfigEntry &entry = *resClass->GetEntry(i); const DocsumTools::FieldSpec & toolsSpec = inputSpecs[i]; - _fields.push_back(DocsumFieldSpec(entry._type, toolsSpec.getCommand())); + _fields.push_back(DocsumFieldSpec(toolsSpec.getCommand())); LOG(debug, "About to prepare field spec for summary field '%s'", entry._name.c_str()); prepareFieldSpec(_fields.back(), toolsSpec, fieldMap, fieldPathMap); } @@ -319,10 +333,6 @@ DocsumFilter::write_flatten_field(const DocsumFieldSpec& field_spec, const Docum return false; } - if (field_spec.getResultType() != RES_LONG_STRING && field_spec.getResultType() != RES_STRING) { - LOG(debug, "write_flatten_field: Can only handle result types STRING and LONG_STRING"); - return false; - } switch (field_spec.getCommand()) { case VsmsummaryConfig::Fieldmap::Command::FLATTENJUNIPER: _flattenWriter.setSeparator(juniper::separators::record_separator_string); @@ -388,8 +398,7 @@ search::docsummary::DocsumStoreFieldValue DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc) { const auto& field_spec = _fields[entry_idx]; - ResType type = field_spec.getResultType(); - if (type == RES_JSONSTRING) { + if (field_spec.is_struct_or_multivalue()) { return get_struct_or_multivalue_summary_field(field_spec, doc); } else { if (field_spec.getInputFields().size() == 1 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { @@ -438,8 +447,7 @@ void DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vespalib::slime::Inserter& inserter) { const auto& field_spec = _fields[entry_idx]; - ResType type = field_spec.getResultType(); - if (type == RES_JSONSTRING) { + if (field_spec.is_struct_or_multivalue()) { insert_struct_or_multivalue_summary_field(field_spec, doc, inserter); } else { if (field_spec.getInputFields().size() == 1 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { |