summaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-09-20 09:32:37 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-09-20 09:32:37 +0000
commitab1d992c75d0d103453f7ac4867c1af1d0097f44 (patch)
tree34e5b272a6895abe84e1eba48a862aba2b2db60d /streamingvisitors
parentb66a12b478e9fbda0900c36b1ec67d53dc811488 (diff)
Various cleanup for c+11 and make code anonymous.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp205
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h20
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