summaryrefslogtreecommitdiffstats
path: root/searchsummary
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-06-29 11:35:57 +0200
committerTor Egge <Tor.Egge@online.no>2022-06-29 11:35:57 +0200
commit99f502a0daad8fc69f1bcd317a58d25756e0c351 (patch)
tree3a9872fbcdb5fcf4f24995ecb9d5d2b54d5b9cd0 /searchsummary
parentc4dc902aa6e301b6f56d526ea9cccc0fc5be7a00 (diff)
Handle struct field in CopyDFW.
Diffstat (limited to 'searchsummary')
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp
index 47d94a716f7..28e20729eee 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumfieldwriter.cpp
@@ -6,6 +6,7 @@
#include <vespa/searchlib/common/documentlocations.h>
#include <vespa/searchlib/common/location.h>
#include <vespa/searchlib/parsequery/stackdumpiterator.h>
+#include <vespa/vespalib/data/slime/slime.h>
#include <vespa/log/log.h>
LOG_SETUP(".searchlib.docsummary.docsumfieldwriter");
@@ -121,7 +122,23 @@ CopyDFW::insertField(uint32_t /*docid*/, GeneralResult *gres, GetDocsumsState *,
target.insertLong(valint64);
break; }
- case RES_JSONSTRING:
+ case RES_JSONSTRING: {
+ uint32_t len;
+ const char *spt;
+ // resolve field
+ entry->_resolve_field(&spt, &len);
+ if (len != 0) {
+ // note: 'JSONSTRING' really means 'structured data'
+ vespalib::Slime input_field_as_slime;
+ size_t d = vespalib::slime::BinaryFormat::decode(vespalib::Memory(spt, len), input_field_as_slime);
+ if (d != len) {
+ LOG(warning, "could not decode %u bytes: %zu bytes decoded", len, d);
+ }
+ if (d != 0) {
+ inject(input_field_as_slime.get(), target);
+ }
+ }
+ break; }
case RES_FEATUREDATA:
case RES_LONG_STRING:
case RES_STRING: {