summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLester Solbakken <lesters@users.noreply.github.com>2019-02-11 09:23:52 +0100
committerGitHub <noreply@github.com>2019-02-11 09:23:52 +0100
commit087af5baf3342160a3ae4588688fb9494e1026d2 (patch)
treed773a3c2bcb11b77aeec922095ca0f93865178b4
parentb4f8e5bd2b7e6f496b737eab89f60340bc3c29d3 (diff)
parentc920578953fef858fa0937e86860dc7f49c5dffe (diff)
Merge pull request #8398 from vespa-engine/lesters/dont-render-empty-multivalue-fields
Lesters/dont render empty multivalue fields
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java18
-rw-r--r--searchcore/src/tests/proton/docsummary/docsummary.cpp11
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/attributedfw.cpp6
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/summaryfieldconverter.cpp20
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 {