diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2022-09-20 12:02:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-20 12:02:13 +0200 |
commit | 93f0f40704dc6338279f8469a21d992c2c89efc8 (patch) | |
tree | 34e5b272a6895abe84e1eba48a862aba2b2db60d /streamingvisitors | |
parent | b66a12b478e9fbda0900c36b1ec67d53dc811488 (diff) | |
parent | ab1d992c75d0d103453f7ac4867c1af1d0097f44 (diff) |
Merge pull request #24136 from vespa-engine/balder/cleanup-and-make-code-anonymous
Various cleanup for c+11 and make code anonymous.
Diffstat (limited to 'streamingvisitors')
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp | 205 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h | 20 |
2 files changed, 102 insertions, 123 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp index ec28688196e..ad054aadd9c 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp @@ -11,7 +11,6 @@ #include <vespa/searchsummary/docsummary/summaryfieldconverter.h> #include <vespa/document/base/exceptions.h> #include <vespa/document/datatype/datatype.h> -#include <vespa/document/fieldvalue/iteratorhandler.h> #include <vespa/document/fieldvalue/stringfieldvalue.h> #include <vespa/vespalib/data/slime/inserter.h> @@ -20,6 +19,7 @@ LOG_SETUP(".vsm.docsumfilter"); using namespace search::docsummary; using document::FieldPathEntry; +using FieldMap = vsm::StringFieldIdTMap; namespace vsm { @@ -41,6 +41,94 @@ bool is_struct_or_multivalue_field_type(const FieldPath& fp) return false; } +FieldPath +copyPathButFirst(const FieldPath & rhs) { + // skip the element that correspond to the start field value + FieldPath path; + if ( ! rhs.empty()) { + for (auto it = rhs.begin() + 1; it != rhs.end(); ++it) { + path.push_back(std::make_unique<document::FieldPathEntry>(**it)); + } + } + return path; +} + +void +prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldSpec & toolsSpec, + const FieldMap & fieldMap, const FieldPathMapT & fieldPathMap) +{ + { // setup output field + const vespalib::string & name = toolsSpec.getOutputName(); + LOG(debug, "prepareFieldSpec: output field name '%s'", name.c_str()); + FieldIdT field = fieldMap.fieldNo(name); + 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())); + } + } else { + LOG(warning, "Could not find output summary field '%s'", name.c_str()); + } + } + // setup input fields + std::unique_ptr<SlimeFillerFilter> filter; + if (spec.is_struct_or_multivalue()) { + filter = std::make_unique<SlimeFillerFilter>(); + } + for (const auto & name : toolsSpec.getInputNames()) { + LOG(debug, "prepareFieldSpec: input field name '%s'", name.c_str()); + FieldIdT field = fieldMap.fieldNo(name); + if (field != FieldMap::npos) { + if (field < fieldPathMap.size()) { + LOG(debug, "field %u < map size %zu", field, fieldPathMap.size()); + spec.getInputFields().push_back(DocsumFieldSpec::FieldIdentifier(field, copyPathButFirst(fieldPathMap[field]))); + } else { + LOG(warning, "Could not find a field path for field '%s' with id '%d'", name.c_str(), field); + spec.getInputFields().push_back(DocsumFieldSpec::FieldIdentifier(field, FieldPath())); + } + } else { + LOG(warning, "Could not find input summary field '%s'", name.c_str()); + } + SlimeFillerFilter::add_remaining(filter, name); + } + if (filter && !filter->empty()) { + spec.set_filter(std::move(filter)); + } +} + +search::docsummary::DocsumStoreFieldValue +get_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc) +{ + // Filtering not yet implemented, return whole struct or multivalue field + const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getOutputField(); + const document::FieldValue* field_value = doc.getField(fieldId.getId()); + return DocsumStoreFieldValue(field_value); +} + +void +insert_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter) +{ + if (field_spec.getCommand() != VsmsummaryConfig::Fieldmap::Command::NONE) { + return; + } + const DocsumFieldSpec::FieldIdentifier& fieldId = field_spec.getOutputField(); + const document::FieldValue* fv = doc.getField(fieldId.getId()); + if (fv == nullptr) { + return; + } + CheckUndefinedValueVisitor check_undefined; + fv->accept(check_undefined); + if (!check_undefined.is_undefined()) { + SlimeFiller writer(inserter, nullptr, field_spec.get_filter()); + fv->accept(writer); + } +} + /* * This class creates a modified field value which is then passed to * the original juniper converter. @@ -92,7 +180,7 @@ class DocsumStoreVsmDocument : public IDocsumStoreDocument return (storage_doc != nullptr && storage_doc->valid()) ? &storage_doc->docDoc() : nullptr; } static const ResultClass& get_result_class(const DocsumFilter& docsum_filter) { - auto result_class = docsum_filter.getTools()->getResultClass(); + auto result_class = docsum_filter.getTools().getResultClass(); assert(result_class != nullptr); return *result_class; } @@ -195,70 +283,6 @@ DocsumStoreVsmDocument::insert_document_id(vespalib::slime::Inserter& inserter) } -FieldPath -copyPathButFirst(const FieldPath & rhs) { - // skip the element that correspond to the start field value - FieldPath path; - if ( ! rhs.empty()) { - for (auto it = rhs.begin() + 1; it != rhs.end(); ++it) { - path.push_back(std::make_unique<document::FieldPathEntry>(**it)); - } - } - return path; -} - -void -DocsumFilter::prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldSpec & toolsSpec, - const FieldMap & fieldMap, const FieldPathMapT & fieldPathMap) -{ - { // setup output field - const vespalib::string & name = toolsSpec.getOutputName(); - LOG(debug, "prepareFieldSpec: output field name '%s'", name.c_str()); - FieldIdT field = fieldMap.fieldNo(name); - 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())); - } - } else { - LOG(warning, "Could not find output summary field '%s'", name.c_str()); - } - } - // setup input fields - std::unique_ptr<SlimeFillerFilter> filter; - if (spec.is_struct_or_multivalue()) { - filter = std::make_unique<SlimeFillerFilter>(); - } - for (size_t i = 0; i < toolsSpec.getInputNames().size(); ++i) { - const vespalib::string & name = toolsSpec.getInputNames()[i]; - LOG(debug, "prepareFieldSpec: input field name '%s'", name.c_str()); - FieldIdT field = fieldMap.fieldNo(name); - if (field != FieldMap::npos) { - if (field < fieldPathMap.size()) { - LOG(debug, "field %u < map size %zu", field, fieldPathMap.size()); - spec.getInputFields().push_back(DocsumFieldSpec::FieldIdentifier(field, copyPathButFirst(fieldPathMap[field]))); - } else { - LOG(warning, "Could not find a field path for field '%s' with id '%d'", name.c_str(), field); - spec.getInputFields().push_back(DocsumFieldSpec::FieldIdentifier(field, FieldPath())); - } - if (_highestFieldNo <= field) { - _highestFieldNo = field + 1; - } - } else { - LOG(warning, "Could not find input summary field '%s'", name.c_str()); - } - SlimeFillerFilter::add_remaining(filter, name); - } - if (filter && !filter->empty()) { - spec.set_filter(std::move(filter)); - } -} - const document::FieldValue * DocsumFilter::getFieldValue(const DocsumFieldSpec::FieldIdentifier & fieldId, VsmsummaryConfig::Fieldmap::Command command, @@ -269,28 +293,24 @@ DocsumFilter::getFieldValue(const DocsumFieldSpec::FieldIdentifier & fieldId, if (fv == nullptr) { return nullptr; } - switch (command) { - case VsmsummaryConfig::Fieldmap::Command::FLATTENJUNIPER: + if (command == VsmsummaryConfig::Fieldmap::Command::FLATTENJUNIPER) { if (_snippetModifiers != nullptr) { - FieldModifier * mod = _snippetModifiers->getModifier(fId); + FieldModifier *mod = _snippetModifiers->getModifier(fId); if (mod != nullptr) { _cachedValue = mod->modify(*fv, fieldId.getPath()); modified = true; return _cachedValue.get(); } } - [[fallthrough]]; - default: - return fv; } + return fv; } -DocsumFilter::DocsumFilter(const DocsumToolsPtr &tools, const IDocSumCache & docsumCache) : +DocsumFilter::DocsumFilter(DocsumToolsPtr tools, const IDocSumCache & docsumCache) : _docsumCache(&docsumCache), - _tools(tools), + _tools(std::move(tools)), _fields(), - _highestFieldNo(0), _flattenWriter(), _snippetModifiers(nullptr), _cachedValue(), @@ -341,8 +361,7 @@ DocsumFilter::write_flatten_field(const DocsumFieldSpec& field_spec, const Docum break; } const DocsumFieldSpec::FieldIdentifierVector & inputFields = field_spec.getInputFields(); - for (size_t i = 0; i < inputFields.size(); ++i) { - const DocsumFieldSpec::FieldIdentifier & fieldId = inputFields[i]; + for (const auto & fieldId : inputFields) { bool modified = false; const document::FieldValue * fv = getFieldValue(fieldId, field_spec.getCommand(), doc, modified); if (fv != nullptr) { @@ -374,15 +393,6 @@ DocsumFilter::getMappedDocsum(uint32_t id) } search::docsummary::DocsumStoreFieldValue -DocsumFilter::get_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc) -{ - // Filtering not yet implemented, return whole struct or multivalue field - const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getOutputField(); - const document::FieldValue* field_value = doc.getField(fieldId.getId()); - return DocsumStoreFieldValue(field_value); -} - -search::docsummary::DocsumStoreFieldValue DocsumFilter::get_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc) { if (!write_flatten_field(field_spec, doc)) { @@ -405,7 +415,7 @@ DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc) const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getInputFields()[0]; const document::FieldValue* field_value = doc.getField(fieldId.getId()); return DocsumStoreFieldValue(field_value); - } else if (field_spec.getInputFields().size() == 0 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { + } else if (field_spec.getInputFields().empty() && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { return {}; } else { return get_flattened_summary_field(field_spec, doc); @@ -414,25 +424,6 @@ DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc) } void -DocsumFilter::insert_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter) -{ - if (field_spec.getCommand() != VsmsummaryConfig::Fieldmap::Command::NONE) { - return; - } - const DocsumFieldSpec::FieldIdentifier& fieldId = field_spec.getOutputField(); - const document::FieldValue* fv = doc.getField(fieldId.getId()); - if (fv == nullptr) { - return; - } - CheckUndefinedValueVisitor check_undefined; - fv->accept(check_undefined); - if (!check_undefined.is_undefined()) { - SlimeFiller writer(inserter, nullptr, field_spec.get_filter()); - fv->accept(writer); - } -} - -void DocsumFilter::insert_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter) { if (!write_flatten_field(field_spec, doc)) { @@ -456,7 +447,7 @@ DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vesp if (field_value != nullptr) { SummaryFieldConverter::insert_summary_field(*field_value, inserter); } - } else if (field_spec.getInputFields().size() == 0 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { + } else if (field_spec.getInputFields().empty() && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { } else { insert_flattened_summary_field(field_spec, doc, inserter); } diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h index 339627be9ea..cb6ae66ae22 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h @@ -23,36 +23,30 @@ namespace vsm { class DocsumFilter : public IDocsumStore { private: - typedef std::vector<DocsumFieldSpec> FieldSpecList; // list of summary field specs - typedef std::vector<vespalib::string> StringList; - typedef StringFieldIdTMap FieldMap; + using FieldSpecList = std::vector<DocsumFieldSpec>; // list of summary field specs + using FieldMap = StringFieldIdTMap; const IDocSumCache * _docsumCache; DocsumToolsPtr _tools; FieldSpecList _fields; // list of summary fields to generate - size_t _highestFieldNo; FlattenDocsumWriter _flattenWriter; const FieldModifierMap * _snippetModifiers; document::FieldValue::UP _cachedValue; document::FieldPath _emptyFieldPath; - void prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldSpec & toolsSpec, - const FieldMap & fieldMap, const FieldPathMapT & fieldPathMap); const document::FieldValue * getFieldValue(const DocsumFieldSpec::FieldIdentifier & fieldId, VsmsummaryConfig::Fieldmap::Command command, const Document & docsum, bool & modified); bool write_flatten_field(const DocsumFieldSpec& field_spec, const Document & docsum); - search::docsummary::DocsumStoreFieldValue get_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc); search::docsummary::DocsumStoreFieldValue get_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc); - void insert_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter); void insert_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter); public: - DocsumFilter(const DocsumToolsPtr & tools, const IDocSumCache & docsumCache); + DocsumFilter(DocsumToolsPtr tools, const IDocSumCache & docsumCache); DocsumFilter(const DocsumFilter &) = delete; DocsumFilter &operator=(const DocsumFilter &) = delete; ~DocsumFilter() override; - const DocsumToolsPtr & getTools() const { return _tools; } + const DocsumTools & getTools() const { return *_tools; } /** * Initializes this docsum filter using the given field map and field path map. @@ -69,12 +63,6 @@ public: **/ void setSnippetModifiers(const FieldModifierMap & modifiers) { _snippetModifiers = &modifiers; } - /** - * Returns the highest field id + 1 among all fields in the field spec list. - **/ - size_t getHighestFieldNo() const { return _highestFieldNo; } - - void setDocSumStore(const IDocSumCache & docsumCache) { _docsumCache = &docsumCache; } // Inherit doc from IDocsumStore |