summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-02-07 12:35:23 +0100
committerGitHub <noreply@github.com>2019-02-07 12:35:23 +0100
commit25f2a75d6ac8a0f1fbee8bf7f6fb5af9e5c4b288 (patch)
treefe5af0deb366e9dc73d9922486dad8909e38651d
parente65f658045f276fa506a7d8e2e49bc8ccd908276 (diff)
parent3fd70f1a3e5f26cf260dfbe6fa7672e1df9b2602 (diff)
Merge pull request #8409 from vespa-engine/geirst/tensor-add-update-serialization
Geirst/tensor add update serialization
-rw-r--r--document/abi-spec.json14
-rw-r--r--document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java24
-rw-r--r--document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java2
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java2
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java8
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java12
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java8
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java8
-rw-r--r--document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializerHead.java6
-rw-r--r--document/src/main/java/com/yahoo/document/update/TensorAddUpdate.java3
-rw-r--r--document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java143
-rw-r--r--document/src/test/java/com/yahoo/document/update/SerializationTestCase.java3
12 files changed, 188 insertions, 45 deletions
diff --git a/document/abi-spec.json b/document/abi-spec.json
index 7d7aad64bca..449a2663c0b 100644
--- a/document/abi-spec.json
+++ b/document/abi-spec.json
@@ -4493,7 +4493,8 @@
"public abstract void write(com.yahoo.document.update.AssignValueUpdate, com.yahoo.document.DataType)",
"public abstract void write(com.yahoo.document.update.RemoveValueUpdate, com.yahoo.document.DataType)",
"public abstract void write(com.yahoo.document.update.ClearValueUpdate, com.yahoo.document.DataType)",
- "public abstract void write(com.yahoo.document.update.TensorModifyUpdate)"
+ "public abstract void write(com.yahoo.document.update.TensorModifyUpdate)",
+ "public abstract void write(com.yahoo.document.update.TensorAddUpdate)"
],
"fields": []
},
@@ -4747,7 +4748,8 @@
"public void read(com.yahoo.document.annotation.Span)",
"public void read(com.yahoo.document.annotation.SpanList)",
"public void read(com.yahoo.document.annotation.AlternateSpanList)",
- "protected com.yahoo.document.update.ValueUpdate readTensorModifyUpdate(com.yahoo.document.DataType)"
+ "protected com.yahoo.document.update.ValueUpdate readTensorModifyUpdate(com.yahoo.document.DataType)",
+ "protected com.yahoo.document.update.ValueUpdate readTensorAddUpdate(com.yahoo.document.DataType)"
],
"fields": []
},
@@ -4759,7 +4761,8 @@
],
"methods": [
"public void <init>(com.yahoo.document.DocumentTypeManager, com.yahoo.io.GrowableByteBuffer)",
- "protected com.yahoo.document.update.ValueUpdate readTensorModifyUpdate(com.yahoo.document.DataType)"
+ "protected com.yahoo.document.update.ValueUpdate readTensorModifyUpdate(com.yahoo.document.DataType)",
+ "protected com.yahoo.document.update.ValueUpdate readTensorAddUpdate(com.yahoo.document.DataType)"
],
"fields": []
},
@@ -4810,6 +4813,7 @@
"public void write(com.yahoo.document.update.RemoveValueUpdate, com.yahoo.document.DataType)",
"public void write(com.yahoo.document.update.ClearValueUpdate, com.yahoo.document.DataType)",
"public void write(com.yahoo.document.update.TensorModifyUpdate)",
+ "public void write(com.yahoo.document.update.TensorAddUpdate)",
"public static long getSerializedSize(com.yahoo.document.Document)"
],
"fields": []
@@ -4864,6 +4868,7 @@
"public void write(com.yahoo.document.update.RemoveValueUpdate, com.yahoo.document.DataType)",
"public void write(com.yahoo.document.update.ClearValueUpdate, com.yahoo.document.DataType)",
"public void write(com.yahoo.document.update.TensorModifyUpdate)",
+ "public void write(com.yahoo.document.update.TensorAddUpdate)",
"public static long getSerializedSize(com.yahoo.document.Document)"
],
"fields": []
@@ -4876,7 +4881,8 @@
],
"methods": [
"public void <init>(com.yahoo.io.GrowableByteBuffer)",
- "public void write(com.yahoo.document.update.TensorModifyUpdate)"
+ "public void write(com.yahoo.document.update.TensorModifyUpdate)",
+ "public void write(com.yahoo.document.update.TensorAddUpdate)"
],
"fields": []
},
diff --git a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
index d3247614de4..e9b5a136cf9 100644
--- a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
+++ b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java
@@ -40,6 +40,7 @@ import com.yahoo.document.update.ClearValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.MapValueUpdate;
import com.yahoo.document.update.RemoveValueUpdate;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
import com.yahoo.document.update.ValueUpdate;
import com.yahoo.vespa.objects.FieldBase;
@@ -103,7 +104,7 @@ public class DocumentUpdateJsonSerializer
}
Optional<Boolean> createIfNotExistent = update.getOptionalCreateIfNonExistent();
- if (createIfNotExistent.isPresent()) {
+ if (createIfNotExistent.isPresent() && createIfNotExistent.get()) {
generator.writeBooleanField("create", createIfNotExistent.get());
}
@@ -263,7 +264,26 @@ public class DocumentUpdateJsonSerializer
@Override
public void write(TensorModifyUpdate update) {
- throw new JsonSerializationException("Serialization of tensor modify update is not yet implemented");
+ wrapIOException(() -> {
+ generator.writeObjectFieldStart("modify");
+ generator.writeFieldName("operation");
+ generator.writeString(update.getOperation().name);
+ if (update.getValue().getTensor().isPresent()) {
+ serializeTensorCells(generator, update.getValue().getTensor().get());
+ }
+ generator.writeEndObject();
+ });
+ }
+
+ @Override
+ public void write(TensorAddUpdate update) {
+ wrapIOException(() -> {
+ generator.writeObjectFieldStart("add");
+ if (update.getValue().getTensor().isPresent()) {
+ serializeTensorCells(generator, update.getValue().getTensor().get());
+ }
+ generator.writeEndObject();
+ });
}
@Override
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 55e7dc3c1b3..1053c5ff44d 100644
--- a/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java
+++ b/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java
@@ -91,7 +91,7 @@ public class JsonSerializationHelper {
generator.writeEndArray();
}
- private static void serializeTensorCells(JsonGenerator generator, Tensor tensor) throws IOException {
+ static void serializeTensorCells(JsonGenerator generator, Tensor tensor) throws IOException {
generator.writeArrayFieldStart(TensorReader.TENSOR_CELLS);
for (Map.Entry<TensorAddress, Double> cell : tensor.cells().entrySet()) {
generator.writeStartObject();
diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
index b4635070262..22b13d57aea 100644
--- a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
+++ b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java
@@ -10,6 +10,7 @@ import com.yahoo.document.update.ClearValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.MapValueUpdate;
import com.yahoo.document.update.RemoveValueUpdate;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
/**
@@ -28,4 +29,5 @@ public interface DocumentUpdateWriter {
public void write(RemoveValueUpdate update, DataType superType);
public void write(ClearValueUpdate clearValueUpdate, DataType superType);
public void write(TensorModifyUpdate update);
+ public void write(TensorAddUpdate update);
}
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java
index 6241bc66588..2943f6a8b22 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer6.java
@@ -655,6 +655,8 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu
return new RemoveValueUpdate(fval);
case TENSORMODIFY:
return readTensorModifyUpdate(superType);
+ case TENSORADD:
+ return readTensorAddUpdate(superType);
default:
throw new DeserializationException(
"Could not deserialize ValueUpdate, unknown valueUpdateClassID type " + vuTypeId);
@@ -880,7 +882,11 @@ public class VespaDocumentDeserializer6 extends BufferSerializer implements Docu
}
protected ValueUpdate readTensorModifyUpdate(DataType type) {
- throw new DeserializationException("Cannot deserialize tensor modify update, not implemented for Vespa 6");
+ throw new DeserializationException("Cannot deserialize TensorModifyUpdate, not implemented for Vespa 6");
+ }
+
+ protected ValueUpdate readTensorAddUpdate(DataType type) {
+ throw new DeserializationException("Cannot deserialize TensorAddUpdate, not implemented for Vespa 6");
}
}
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java
index 40f4c39cd26..0f19937db41 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializerHead.java
@@ -6,6 +6,7 @@ import com.yahoo.document.DocumentTypeManager;
import com.yahoo.document.TensorDataType;
import com.yahoo.document.datatypes.FieldValue;
import com.yahoo.document.datatypes.TensorFieldValue;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
import com.yahoo.document.update.ValueUpdate;
import com.yahoo.io.GrowableByteBuffer;
@@ -37,4 +38,15 @@ public class VespaDocumentDeserializerHead extends VespaDocumentDeserializer6 {
tensor.deserialize(this);
return new TensorModifyUpdate(operation, tensor);
}
+
+ @Override
+ protected ValueUpdate readTensorAddUpdate(DataType type) {
+ if (!(type instanceof TensorDataType)) {
+ throw new DeserializationException("Expected tensor data type, got " + type);
+ }
+ TensorDataType tensorDataType = (TensorDataType)type;
+ TensorFieldValue tensor = new TensorFieldValue(tensorDataType.getTensorType());
+ tensor.deserialize(this);
+ return new TensorAddUpdate(tensor);
+ }
}
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java
index 124cc94bb41..28ae1c3db90 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java
@@ -45,6 +45,7 @@ import com.yahoo.document.update.ClearValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.MapValueUpdate;
import com.yahoo.document.update.RemoveValueUpdate;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
import com.yahoo.document.update.ValueUpdate;
import com.yahoo.io.GrowableByteBuffer;
@@ -647,7 +648,12 @@ public class VespaDocumentSerializer42 extends BufferSerializer implements Docum
@Override
public void write(TensorModifyUpdate update) {
- throw new IllegalArgumentException("Write of TensorModifyUpdate not yet implemeneted");
+ throw new IllegalArgumentException("Write of TensorModifyUpdate not implemeneted for Vespa 4.2");
+ }
+
+ @Override
+ public void write(TensorAddUpdate update) {
+ throw new IllegalArgumentException("Write of TensorAddUpdate not implemeneted for Vespa 4.2");
}
/**
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java
index b610f3a19e7..22f71bb3f65 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer6.java
@@ -48,6 +48,7 @@ import com.yahoo.document.update.ClearValueUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.update.MapValueUpdate;
import com.yahoo.document.update.RemoveValueUpdate;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
import com.yahoo.document.update.ValueUpdate;
import com.yahoo.io.GrowableByteBuffer;
@@ -685,7 +686,12 @@ public class VespaDocumentSerializer6 extends BufferSerializer implements Docume
@Override
public void write(TensorModifyUpdate update) {
- throw new IllegalArgumentException("Write of TensorModifyUpdate not yet implemeneted");
+ throw new IllegalArgumentException("Write of TensorModifyUpdate not implemeneted for Vespa 6");
+ }
+
+ @Override
+ public void write(TensorAddUpdate update) {
+ throw new IllegalArgumentException("Write of TensorAddUpdate not implemeneted for Vespa 6");
}
/**
diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializerHead.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializerHead.java
index 753e2fb0986..144d3f768ab 100644
--- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializerHead.java
+++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializerHead.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.document.serialization;
+import com.yahoo.document.update.TensorAddUpdate;
import com.yahoo.document.update.TensorModifyUpdate;
import com.yahoo.io.GrowableByteBuffer;
@@ -21,4 +22,9 @@ public class VespaDocumentSerializerHead extends VespaDocumentSerializer6 {
update.getValue().serialize(this);
}
+ @Override
+ public void write(TensorAddUpdate update) {
+ update.getValue().serialize(this);
+ }
+
}
diff --git a/document/src/main/java/com/yahoo/document/update/TensorAddUpdate.java b/document/src/main/java/com/yahoo/document/update/TensorAddUpdate.java
index 3703ffc17a2..3a67e2e9de8 100644
--- a/document/src/main/java/com/yahoo/document/update/TensorAddUpdate.java
+++ b/document/src/main/java/com/yahoo/document/update/TensorAddUpdate.java
@@ -32,8 +32,7 @@ public class TensorAddUpdate extends ValueUpdate<TensorFieldValue> {
@Override
public void serialize(DocumentUpdateWriter data, DataType superType) {
- // TODO: implement
- throw new UnsupportedOperationException("Not implemented yet");
+ data.write(this);
}
@Override
diff --git a/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java b/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
index 9235c9b908a..5f486e9a670 100644
--- a/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
+++ b/document/src/test/java/com/yahoo/document/json/DocumentUpdateJsonSerializerTest.java
@@ -15,6 +15,10 @@ import com.yahoo.document.StructDataType;
import com.yahoo.document.TensorDataType;
import com.yahoo.document.WeightedSetDataType;
import com.yahoo.document.json.document.DocumentParser;
+import com.yahoo.document.serialization.DocumentDeserializerFactory;
+import com.yahoo.document.serialization.DocumentSerializer;
+import com.yahoo.document.serialization.DocumentSerializerFactory;
+import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.tensor.TensorType;
import com.yahoo.text.Utf8;
import org.junit.Test;
@@ -28,11 +32,14 @@ import static com.yahoo.test.json.JsonTestHelper.assertJsonEquals;
import static com.yahoo.test.json.JsonTestHelper.inputJson;
/**
+ * Tests roundtrip serialization (JSON -> DocumentUpdate -> Buffer -> DocumentUpdate -> JSON) of document updates.
+ *
* @author Vegard Sjonfjell
*/
public class DocumentUpdateJsonSerializerTest {
- final static TensorType tensorType = new TensorType.Builder().mapped("x").mapped("y").build();
+ final static TensorType sparseTensorType = new TensorType.Builder().mapped("x").mapped("y").build();
+ final static TensorType denseTensorType = new TensorType.Builder().indexed("x", 2).indexed("y", 3).build();
final static DocumentTypeManager types = new DocumentTypeManager();
final static JsonFactory parserFactory = new JsonFactory();
final static DocumentType docType = new DocumentType("doctype");
@@ -51,7 +58,8 @@ public class DocumentUpdateJsonSerializerTest {
docType.addField(new Field("float_field", DataType.FLOAT));
docType.addField(new Field("double_field", DataType.DOUBLE));
docType.addField(new Field("byte_field", DataType.BYTE));
- docType.addField(new Field("tensor_field", new TensorDataType(tensorType)));
+ docType.addField(new Field("sparse_tensor", new TensorDataType(sparseTensorType)));
+ docType.addField(new Field("dense_tensor", new TensorDataType(denseTensorType)));
docType.addField(new Field("reference_field", new ReferenceDataType(refTargetDocType, 777)));
docType.addField(new Field("predicate_field", DataType.PREDICATE));
docType.addField(new Field("raw_field", DataType.RAW));
@@ -68,13 +76,29 @@ public class DocumentUpdateJsonSerializerTest {
types.registerDocumentType(docType);
}
- private static DocumentUpdate deSerializeDocumentUpdate(String jsonDoc, String docId) {
+ private static GrowableByteBuffer serializeDocumentUpdate(DocumentUpdate update) {
+ DocumentSerializer serializer = DocumentSerializerFactory.createHead(new GrowableByteBuffer());
+ update.serialize(serializer);
+ serializer.getBuf().rewind();
+ return serializer.getBuf();
+ }
+
+ private static DocumentUpdate deserializeDocumentUpdate(GrowableByteBuffer buffer) {
+ return new DocumentUpdate(DocumentDeserializerFactory.createHead(types, buffer));
+ }
+
+ private static DocumentUpdate roundtripSerialize(DocumentUpdate update) {
+ GrowableByteBuffer buffer = serializeDocumentUpdate(update);
+ return deserializeDocumentUpdate(buffer);
+ }
+
+ private static DocumentUpdate jsonToDocumentUpdate(String jsonDoc, String docId) {
final InputStream rawDoc = new ByteArrayInputStream(Utf8.toBytes(jsonDoc));
JsonReader reader = new JsonReader(types, rawDoc, parserFactory);
return (DocumentUpdate) reader.readSingleDocument(DocumentParser.SupportedOperation.UPDATE, docId);
}
- private static String serializeDocumentUpdate(DocumentUpdate update) {
+ private static String documentUpdateToJson(DocumentUpdate update) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DocumentUpdateJsonSerializer serializer = new DocumentUpdateJsonSerializer(outputStream);
serializer.serialize(update);
@@ -86,15 +110,21 @@ public class DocumentUpdateJsonSerializerTest {
}
}
- private static void deSerializeAndSerializeJsonAndMatch(String jsonDoc) {
+ private static void roundtripSerializeJsonAndMatch(String jsonDoc, String expectedJsonDoc) {
jsonDoc = jsonDoc.replaceFirst("DOCUMENT_ID", DEFAULT_DOCUMENT_ID);
- DocumentUpdate update = deSerializeDocumentUpdate(jsonDoc, DEFAULT_DOCUMENT_ID);
- assertJsonEquals(serializeDocumentUpdate(update), jsonDoc);
+ expectedJsonDoc = expectedJsonDoc.replaceFirst("DOCUMENT_ID", DEFAULT_DOCUMENT_ID);
+ DocumentUpdate update = jsonToDocumentUpdate(jsonDoc, DEFAULT_DOCUMENT_ID);
+ DocumentUpdate roundtripUpdate = roundtripSerialize(update);
+ assertJsonEquals(expectedJsonDoc, documentUpdateToJson(roundtripUpdate));
+ }
+
+ private static void roundtripSerializeJsonAndMatch(String jsonDoc) {
+ roundtripSerializeJsonAndMatch(jsonDoc, jsonDoc);
}
@Test
public void testArithmeticUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -117,7 +147,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignSimpleTypes() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -143,7 +173,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignWeightedSet() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -166,7 +196,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAddUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -191,7 +221,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testRemoveUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -214,7 +244,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testMatchUpdateArithmetic() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -231,7 +261,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testMatchUpdateAssign() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -248,11 +278,11 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignTensor() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
- " 'tensor_field': {",
+ " 'sparse_tensor': {",
" 'assign': {",
" 'cells': [",
" { 'address': { 'x': 'a', 'y': 'b' }, 'value': 2.0 },",
@@ -266,8 +296,47 @@ public class DocumentUpdateJsonSerializerTest {
}
@Test
+ public void test_tensor_modify_update() {
+ roundtripSerializeJsonAndMatch(inputJson(
+ "{",
+ " 'update': 'DOCUMENT_ID',",
+ " 'fields': {",
+ " 'dense_tensor': {",
+ " 'modify': {",
+ " 'operation': 'replace',",
+ " 'cells': [",
+ " { 'address': { 'x': '0', 'y': '0' }, 'value': 2.0 },",
+ " { 'address': { 'x': '1', 'y': '2' }, 'value': 3.0 }",
+ " ]",
+ " }",
+ " }",
+ " }",
+ "}"
+ ));
+ }
+
+ @Test
+ public void test_tensor_add_update() {
+ roundtripSerializeJsonAndMatch(inputJson(
+ "{",
+ " 'update': 'DOCUMENT_ID',",
+ " 'fields': {",
+ " 'sparse_tensor': {",
+ " 'add': {",
+ " 'cells': [",
+ " { 'address': { 'x': '0', 'y': '0' }, 'value': 2.0 },",
+ " { 'address': { 'x': '1', 'y': '2' }, 'value': 3.0 }",
+ " ]",
+ " }",
+ " }",
+ " }",
+ "}"
+ ));
+ }
+
+ @Test
public void reference_field_id_can_be_update_assigned_non_empty_id() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -281,7 +350,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void reference_field_id_can_be_update_assigned_empty_id() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -295,7 +364,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignPredicate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -309,7 +378,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignRaw() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -323,7 +392,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignMap() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -341,7 +410,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testSimultaneousFieldsAndFieldPathsUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -361,7 +430,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignFieldPathUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -387,7 +456,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testRemoveFieldPathUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -401,7 +470,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAddFieldPathUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -415,7 +484,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testArithmeticFieldPathUpdate() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -432,7 +501,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testMultipleOperationsOnSingleFieldPath() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -449,7 +518,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignSinglePos() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -463,7 +532,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testAssignMultiPos() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -477,7 +546,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testClearField() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'fields': {",
@@ -494,7 +563,7 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testCreateIfNotExistTrue() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'create': true,",
@@ -509,7 +578,8 @@ public class DocumentUpdateJsonSerializerTest {
@Test
public void testCreateIfNotExistFalse() {
- deSerializeAndSerializeJsonAndMatch(inputJson(
+ // NOTE: DocumentUpdateJsonSerializer only writes 'create' when true.
+ roundtripSerializeJsonAndMatch(inputJson(
"{",
" 'update': 'DOCUMENT_ID',",
" 'create': false,",
@@ -519,6 +589,13 @@ public class DocumentUpdateJsonSerializerTest {
" }",
" }",
"}"
- ));
+ ), inputJson("{",
+ " 'update': 'DOCUMENT_ID',",
+ " 'fields': {",
+ " 'int_field': {",
+ " 'assign': 42",
+ " }",
+ " }",
+ "}"));
}
}
diff --git a/document/src/test/java/com/yahoo/document/update/SerializationTestCase.java b/document/src/test/java/com/yahoo/document/update/SerializationTestCase.java
index d9e14a86585..104c77ea923 100644
--- a/document/src/test/java/com/yahoo/document/update/SerializationTestCase.java
+++ b/document/src/test/java/com/yahoo/document/update/SerializationTestCase.java
@@ -17,6 +17,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
/**
+ * NOTE: Roundtrip serialization (JSON -> DocumentUpdate -> ByteBuffer -> DocumentUpdate -> JSON) of updates is tested in DocumentUpdateJsonSerializerTest.
+ * Consider adding new test cases to that test class instead.
+ *
* @author bratseth
*/
public class SerializationTestCase {