summaryrefslogtreecommitdiffstats
path: root/vsm
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahoo-inc.com>2017-02-10 22:38:21 +0100
committerArne H Juul <arnej@yahoo-inc.com>2017-02-10 22:38:21 +0100
commitc887a46e0ad58850a299fd4bbc0328b714f0a7c8 (patch)
treedf3ddac015e46a26cbce4d513fd217f207d95610 /vsm
parent77026d390cb95bd203c5a594ecb869a856947751 (diff)
Use SummaryFieldConverter to generate slime
Diffstat (limited to 'vsm')
-rw-r--r--vsm/src/vespa/vsm/vsm/docsumfilter.cpp49
-rw-r--r--vsm/src/vespa/vsm/vsm/docsumfilter.h1
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);