diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-09-03 20:39:43 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-09-03 20:39:43 +0200 |
commit | b040af00f48216b183eb5b9a5dd7b7b32efd0821 (patch) | |
tree | f06dd621c268c398911ea64ace945971e907544e | |
parent | ef44d786c39c6bb9d172e16ec9e61eaab2d99d6d (diff) |
Catch attempts to access fields not present in document type when generating
document summary.
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/docsum_store_document.cpp | 19 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp | 28 |
2 files changed, 32 insertions, 15 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_store_document.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_store_document.cpp index 0a388f4de07..85ee1aa302d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_store_document.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_store_document.cpp @@ -3,6 +3,7 @@ #include "docsum_store_document.h" #include "check_undefined_value_visitor.h" #include "summaryfieldconverter.h" +#include <vespa/document/base/exceptions.h> #include <vespa/document/datatype/datatype.h> #include <vespa/document/fieldvalue/document.h> #include <vespa/vespalib/data/slime/inserter.h> @@ -23,8 +24,12 @@ DocsumStoreDocument::get_field_value(const vespalib::string& field_name) const const document::Field& field = _document->getField(field_name); auto value(field.getDataType().createFieldValue()); if (value) { - if (_document->getValue(field, *value)) { - return DocsumStoreFieldValue(std::move(value)); + try { + if (_document->getValue(field, *value)) { + return DocsumStoreFieldValue(std::move(value)); + } + } catch (document::FieldNotFoundException&) { + // Field was not found in document type. Return empty value. } } } @@ -45,9 +50,13 @@ DocsumStoreDocument::get_juniper_input(const vespalib::string& field_name) const void DocsumStoreDocument::insert_summary_field(const vespalib::string& field_name, vespalib::slime::Inserter& inserter) const { - auto field_value = get_field_value(field_name); - if (field_value) { - SummaryFieldConverter::insert_summary_field(*field_value, inserter); + try { + auto field_value = get_field_value(field_name); + if (field_value) { + SummaryFieldConverter::insert_summary_field(*field_value, inserter); + } + } catch (document::FieldNotFoundException&) { + // Field was not found in document type. Don't insert anything. } } diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp index a49eec1a869..9d3d390efe1 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp @@ -68,12 +68,16 @@ DocsumStoreVsmDocument::get_field_value(const vespalib::string& field_name) cons assert((uint32_t) entry_idx < _result_class.GetNumEntries()); return _docsum_filter.get_summary_field(entry_idx, _vsm_document); } - const document::Field & field = _document->getField(field_name); - auto value(field.getDataType().createFieldValue()); - if (value) { - if (_document->getValue(field, *value)) { - return DocsumStoreFieldValue(std::move(value)); + try { + const document::Field & field = _document->getField(field_name); + auto value(field.getDataType().createFieldValue()); + if (value) { + if (_document->getValue(field, *value)) { + return DocsumStoreFieldValue(std::move(value)); + } } + } catch (document::FieldNotFoundException&) { + // Field was not found in document type. Return empty value. } } return {}; @@ -96,12 +100,16 @@ DocsumStoreVsmDocument::insert_summary_field(const vespalib::string& field_name, _docsum_filter.insert_summary_field(entry_idx, _vsm_document, inserter); return; } - const document::Field & field = _document->getField(field_name); - auto value(field.getDataType().createFieldValue()); - if (value) { - if (_document->getValue(field, *value)) { - SummaryFieldConverter::insert_summary_field(*value, inserter); + try { + const document::Field & field = _document->getField(field_name); + auto value(field.getDataType().createFieldValue()); + if (value) { + if (_document->getValue(field, *value)) { + SummaryFieldConverter::insert_summary_field(*value, inserter); + } } + } catch (document::FieldNotFoundException&) { + // Field was not found in document type. Don't insert anything. } } } |