diff options
author | Lester Solbakken <lesters@users.noreply.github.com> | 2019-02-11 09:23:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-11 09:23:52 +0100 |
commit | 087af5baf3342160a3ae4588688fb9494e1026d2 (patch) | |
tree | d773a3c2bcb11b77aeec922095ca0f93865178b4 | |
parent | b4f8e5bd2b7e6f496b737eab89f60340bc3c29d3 (diff) | |
parent | c920578953fef858fa0937e86860dc7f49c5dffe (diff) |
Merge pull request #8398 from vespa-engine/lesters/dont-render-empty-multivalue-fields
Lesters/dont render empty multivalue fields
4 files changed, 36 insertions, 19 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java b/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java index 1053c5ff44d..418837ca2a0 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java +++ b/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java @@ -152,8 +152,11 @@ public class JsonSerializationHelper { } public static <T extends FieldValue> void serializeWeightedSet(JsonGenerator generator, FieldBase field, WeightedSet<T> value) { + // Hide empty fields + if (value.size() == 0) { + return; + } fieldNameIfNotNull(generator, field); - wrapIOException(() -> { generator.writeStartObject(); @@ -168,8 +171,11 @@ public class JsonSerializationHelper { } public static <T extends FieldValue> void serializeCollectionField(FieldWriter fieldWriter, JsonGenerator generator, FieldBase field, CollectionFieldValue<T> value) { + // Hide empty fields + if (value.size() == 0) { + return; + } fieldNameIfNotNull(generator, field); - wrapIOException(() -> { generator.writeStartArray(); Iterator<T> i = value.iterator(); @@ -184,6 +190,10 @@ public class JsonSerializationHelper { public static <K extends FieldValue, V extends FieldValue> void serializeMapField(FieldWriter fieldWriter, JsonGenerator generator, FieldBase field, MapFieldValue<K, V> map) { + // Hide empty fields + if (map.size() == 0) { + return; + } fieldNameIfNotNull(generator, field); wrapIOException(() -> { generator.writeStartObject(); @@ -203,6 +213,10 @@ public class JsonSerializationHelper { } public static <T extends FieldValue> void serializeArrayField(FieldWriter fieldWriter, JsonGenerator generator, FieldBase field, Array<T> value) { + // Hide empty fields + if (value.size() == 0) { + return; + } wrapIOException(() -> { fieldNameIfNotNull(generator, field); generator.writeStartArray(); diff --git a/searchcore/src/tests/proton/docsummary/docsummary.cpp b/searchcore/src/tests/proton/docsummary/docsummary.cpp index 40c2733d230..fb8674b5255 100644 --- a/searchcore/src/tests/proton/docsummary/docsummary.cpp +++ b/searchcore/src/tests/proton/docsummary/docsummary.cpp @@ -778,12 +778,7 @@ Test::requireThatAttributesAreUsed() "bj", *rep, 0, rclass)); // empty doc - EXPECT_TRUE(assertSlime("{bd:[]," - "be:[]," - "bf:[]," - "bg:[]," - "bh:[]," - "bi:[]}", *rep, 1, false)); + EXPECT_TRUE(assertSlime("{}", *rep, 1, false)); TEST_DO(assertTensor(Tensor::UP(), "bj", *rep, 1, rclass)); proton::IAttributeManager::SP attributeManager = dc._ddb->getReadySubDB()->getAttributeManager(); @@ -807,9 +802,7 @@ Test::requireThatAttributesAreUsed() req3.hits.push_back(DocsumRequest::Hit(gid3)); DocsumReply::UP rep3 = dc._ddb->getDocsums(req3); - EXPECT_TRUE(assertSlime("{bd:[],be:[],bf:[],bg:[]," - "bh:[],bi:[]," - "bj:'0x01020178017901016101624010000000000000'}", + EXPECT_TRUE(assertSlime("{bj:'0x01020178017901016101624010000000000000'}", *rep3, 0, true)); } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp index 19dd096c46c..1ca1a336d2d 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp @@ -149,9 +149,13 @@ MultiAttrDFW::insertField(uint32_t docid, GetDocsumsState *state, ResType, Inser using vespalib::slime::Cursor; using vespalib::Memory; const IAttributeVector & v = vec(*state); - uint32_t entries = v.getValueCount(docid); bool isWeightedSet = v.hasWeightedSetType(); + uint32_t entries = v.getValueCount(docid); + if (entries == 0) { + return; // Don't insert empty fields + } + Cursor &arr = target.insertArray(); BasicType::Type t = v.getBasicType(); switch (t) { diff --git a/searchsummary/src/vespa/searchsummary/docsummary/summaryfieldconverter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/summaryfieldconverter.cpp index 91a7fd45061..72cedb05f7c 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/summaryfieldconverter.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/summaryfieldconverter.cpp @@ -231,10 +231,6 @@ class SummaryFieldValueConverter : protected ConstFieldValueVisitor FieldValue::UP _field_value; FieldValueConverter &_structuredFieldConverter; - void visit(const ArrayFieldValue &value) override { - _field_value = _structuredFieldConverter.convert(value); - } - template <typename T> void visitPrimitive(const T &t) { _field_value.reset(t.clone()); @@ -274,8 +270,16 @@ class SummaryFieldValueConverter : protected ConstFieldValueVisitor visitPrimitive(value); } - void visit(const MapFieldValue & v) override { - _field_value = _structuredFieldConverter.convert(v); + void visit(const ArrayFieldValue &value) override { + if (value.size() > 0) { + _field_value = _structuredFieldConverter.convert(value); + } // else: implicit empty string + } + + void visit(const MapFieldValue & value) override { + if (value.size() > 0) { + _field_value = _structuredFieldConverter.convert(value); + } // else: implicit empty string } void visit(const StructFieldValue &value) override { @@ -292,7 +296,9 @@ class SummaryFieldValueConverter : protected ConstFieldValueVisitor } void visit(const WeightedSetFieldValue &value) override { - _field_value = _structuredFieldConverter.convert(value); + if (value.size() > 0) { + _field_value = _structuredFieldConverter.convert(value); + } // else: implicit empty string } void visit(const TensorFieldValue &value) override { |