diff options
author | Arne H Juul <arnej@yahoo-inc.com> | 2017-02-10 22:38:21 +0100 |
---|---|---|
committer | Arne H Juul <arnej@yahoo-inc.com> | 2017-02-10 22:38:21 +0100 |
commit | c887a46e0ad58850a299fd4bbc0328b714f0a7c8 (patch) | |
tree | df3ddac015e46a26cbce4d513fd217f207d95610 /vsm/src | |
parent | 77026d390cb95bd203c5a594ecb869a856947751 (diff) |
Use SummaryFieldConverter to generate slime
Diffstat (limited to 'vsm/src')
-rw-r--r-- | vsm/src/vespa/vsm/vsm/docsumfilter.cpp | 49 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/vsm/docsumfilter.h | 1 |
2 files changed, 47 insertions, 3 deletions
diff --git a/vsm/src/vespa/vsm/vsm/docsumfilter.cpp b/vsm/src/vespa/vsm/vsm/docsumfilter.cpp index 3584ccae5f9..e824ce1bff6 100644 --- a/vsm/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/vsm/src/vespa/vsm/vsm/docsumfilter.cpp @@ -3,6 +3,7 @@ #include "docsumfilter.h" #include "jsondocsumwriter.h" #include <vespa/searchsummary/docsummary/resultclass.h> +#include <vespa/searchsummary/docsummary/summaryfieldconverter.h> #include <vespa/vespalib/util/jsonwriter.h> #include <vespa/document/fieldvalue/literalfieldvalue.h> #include <vespa/document/base/exceptions.h> @@ -335,6 +336,44 @@ DocsumFilter::writeJSONField(const DocsumFieldSpec & fieldSpec, } void +DocsumFilter::writeSlimeField(const DocsumFieldSpec & fieldSpec, + const Document & docsum, + ResultPacker & packer) +{ + if (fieldSpec.getCommand() == VsmsummaryConfig::Fieldmap::NONE) { + const DocsumFieldSpec::FieldIdentifier & fieldId = fieldSpec.getOutputField(); + const document::FieldValue * fv = docsum.getField(fieldId.getId()); + if (fv != NULL) { + LOG(debug, "writeSlimeField: About to write field '%d' as Slime: field value = '%s'", + fieldId.getId(), fv->toString().c_str()); + const document::FieldValue::UP converted = + SummaryFieldConverter::convertSummaryField(false, *fv, true); + if (converted.get() != NULL) { + if (converted->getClass().inherits(document::LiteralFieldValueB::classId)) { + const document::LiteralFieldValueB *lfv = + static_cast<const document::LiteralFieldValueB *>(converted.get()); + vespalib::stringref s = lfv->getValueRef(); + packer.AddLongString(s.c_str(), s.size()); + return; + } else { + vespalib::string s = converted->getAsString(); + packer.AddLongString(s.c_str(), s.size()); + return; + } + } else { + LOG(warning, "writeSlimeField: Could not convert value for field '%d'", fieldId.getId()); + } + } else { + LOG(warning, "writeSlimeField: Field value not set for field '%d'", fieldId.getId()); + packer.AddEmpty(); + } + } else { + LOG(warning, "writeSlimeField: Cannot handle this command"); + packer.AddEmpty(); + } +} + +void DocsumFilter::writeFlattenField(const DocsumFieldSpec & fieldSpec, const Document & docsum, ResultPacker & packer) @@ -436,15 +475,16 @@ DocsumFilter::getMappedDocsum(uint32_t id, bool useSlimeInsideFields) return DocsumStoreValue(NULL, 0); } - const Document & doc = _docsumCache->getDocSum(id); + const Document & doc = _docsumCache->getDocSum(id); + + LOG(spam, "getMappedDocsum %u [useSlimeInsideFields=%s]", id, useSlimeInsideFields ? "true" : "false"); _packer.Init(resClass->GetClassID()); for (FieldSpecList::iterator it(_fields.begin()), end = _fields.end(); it != end; ++it) { ResType type = it->getResultType(); if (type == RES_JSONSTRING || type == RES_XMLSTRING) { if (useSlimeInsideFields) { - // XXX no support for slime serialized data here yet - writeEmpty(type, _packer); + writeSlimeField(*it, doc, _packer); } else { writeJSONField(*it, doc, _packer); } @@ -457,6 +497,9 @@ DocsumFilter::getMappedDocsum(uint32_t id, bool useSlimeInsideFields) } else { writeEmpty(type, _packer); // void input } + } else if (it->getInputFields().size() == 0 && it->getCommand() == VsmsummaryConfig::Fieldmap::NONE) { + LOG(spam, "0 inputfields for output field %u", it->getOutputField().getId()); + writeEmpty(type, _packer); // no input } else { writeFlattenField(*it, doc, _packer); } diff --git a/vsm/src/vespa/vsm/vsm/docsumfilter.h b/vsm/src/vespa/vsm/vsm/docsumfilter.h index 858c2e3f4d3..370843a3789 100644 --- a/vsm/src/vespa/vsm/vsm/docsumfilter.h +++ b/vsm/src/vespa/vsm/vsm/docsumfilter.h @@ -53,6 +53,7 @@ private: const Document & docsum, bool & modified); void writeField(const document::FieldValue & fv, const FieldPath & path, ResType type, ResultPacker & packer); void writeJSONField(const DocsumFieldSpec & fieldSpec, const Document & docsum, ResultPacker & packer); + void writeSlimeField(const DocsumFieldSpec & fieldSpec, const Document & docsum, ResultPacker & packer); void writeFlattenField(const DocsumFieldSpec & fieldSpec, const Document & docsum, ResultPacker & packer); void writeEmpty(ResType type, ResultPacker & packer); |