diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2019-02-07 12:35:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-07 12:35:23 +0100 |
commit | 25f2a75d6ac8a0f1fbee8bf7f6fb5af9e5c4b288 (patch) | |
tree | fe5af0deb366e9dc73d9922486dad8909e38651d | |
parent | e65f658045f276fa506a7d8e2e49bc8ccd908276 (diff) | |
parent | 3fd70f1a3e5f26cf260dfbe6fa7672e1df9b2602 (diff) |
Merge pull request #8409 from vespa-engine/geirst/tensor-add-update-serialization
Geirst/tensor add update serialization
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 { |