diff options
author | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-01-23 11:14:22 +0100 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-01-23 11:18:58 +0100 |
commit | 221524523637b8ae4b2798c43da3284265389106 (patch) | |
tree | 0de8acc94edcc5753a11415e779aa953bdf5f4fa /document/src/main/java/com/yahoo | |
parent | 12c42638b7374bfd2f6ce379bf9b8f3986cfe2a2 (diff) |
Add JSON serialization of non-empty reference fields
Diffstat (limited to 'document/src/main/java/com/yahoo')
5 files changed, 37 insertions, 6 deletions
diff --git a/document/src/main/java/com/yahoo/document/ReferenceDataType.java b/document/src/main/java/com/yahoo/document/ReferenceDataType.java index 0c8d8fcc2d8..89249c4a8e4 100644 --- a/document/src/main/java/com/yahoo/document/ReferenceDataType.java +++ b/document/src/main/java/com/yahoo/document/ReferenceDataType.java @@ -9,11 +9,26 @@ public class ReferenceDataType extends DataType { private final DocumentType targetType; public ReferenceDataType(DocumentType targetType, int id) { - super("Reference<" + targetType.getName() + ">", id); + super(buildTypeName(targetType), id); this.targetType = targetType; } - public DataType getTargetType() { return targetType; } + private ReferenceDataType(DocumentType targetType) { + super(buildTypeName(targetType), 0); + setId(getName().hashCode()); + this.targetType = targetType; + } + + private static String buildTypeName(DocumentType targetType) { + return "Reference<" + targetType.getName() + ">"; + } + + // Creates a new type where the numeric ID is based no the hash of targetType + public static ReferenceDataType createWithInferredId(DocumentType targetType) { + return new ReferenceDataType(targetType); + } + + public DocumentType getTargetType() { return targetType; } @Override public ReferenceFieldValue createFieldValue() { 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 af156f9dea0..a6aeb5c3bb5 100644 --- a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java +++ b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java @@ -273,7 +273,7 @@ public class DocumentUpdateJsonSerializer @Override public void write(FieldBase field, ReferenceFieldValue value) { - // TODO! + serializeReferenceField(generator, field, value); } @Override diff --git a/document/src/main/java/com/yahoo/document/json/JsonReader.java b/document/src/main/java/com/yahoo/document/json/JsonReader.java index e0740338aae..2315adc5f0f 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonReader.java +++ b/document/src/main/java/com/yahoo/document/json/JsonReader.java @@ -21,6 +21,7 @@ import com.yahoo.document.DocumentUpdate; import com.yahoo.document.Field; import com.yahoo.document.MapDataType; import com.yahoo.document.PositionDataType; +import com.yahoo.document.ReferenceDataType; import com.yahoo.document.TestAndSetCondition; import com.yahoo.document.WeightedSetDataType; import com.yahoo.document.datatypes.CollectionFieldValue; @@ -49,7 +50,7 @@ import java.util.Optional; * Initialize Vespa documents/updates/removes from an InputStream containing a * valid JSON representation of a feed. * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen * @since 5.1.25 */ @Beta @@ -646,6 +647,11 @@ public class JsonReader { return expectedType.createFieldValue(new Base64().decode(buffer.currentText())); } else if (expectedType.equals(PositionDataType.INSTANCE)) { return PositionDataType.fromString(buffer.currentText()); + } else if (expectedType instanceof ReferenceDataType) { + // TODO wrappu wrappu + FieldValue value = expectedType.createFieldValue(); + value.assign(new DocumentId(buffer.currentText())); + return value; } else { return expectedType.createFieldValue(buffer.currentText()); } 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 8c6ee898c0e..dcd49479767 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java +++ b/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java @@ -14,6 +14,7 @@ import com.yahoo.document.datatypes.LongFieldValue; import com.yahoo.document.datatypes.MapFieldValue; import com.yahoo.document.datatypes.PredicateFieldValue; import com.yahoo.document.datatypes.Raw; +import com.yahoo.document.datatypes.ReferenceFieldValue; import com.yahoo.document.datatypes.StringFieldValue; import com.yahoo.document.datatypes.Struct; import com.yahoo.document.datatypes.StructuredFieldValue; @@ -104,6 +105,15 @@ public class JsonSerializationHelper { generator.writeEndObject(); } + public static void serializeReferenceField(JsonGenerator generator, FieldBase field, ReferenceFieldValue value) { + wrapIOException(() -> { + fieldNameIfNotNull(generator, field); + // TODO need testing of empty reference! + if (value.getDocumentId().isPresent()) { + generator.writeString(value.getDocumentId().get().toString()); + } + }); + } public static void serializeStringField(JsonGenerator generator, FieldBase field, StringFieldValue value) { // Hide empty strings diff --git a/document/src/main/java/com/yahoo/document/json/JsonWriter.java b/document/src/main/java/com/yahoo/document/json/JsonWriter.java index 734b16253fb..6ad526a2aaa 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonWriter.java +++ b/document/src/main/java/com/yahoo/document/json/JsonWriter.java @@ -42,7 +42,7 @@ import static com.yahoo.document.json.JsonSerializationHelper.*; /** * Serialize Document and other FieldValue instances as JSON. * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen */ public class JsonWriter implements DocumentWriter { @@ -184,7 +184,7 @@ public class JsonWriter implements DocumentWriter { @Override public void write(FieldBase field, ReferenceFieldValue value) { - // TODO! + serializeReferenceField(generator, field, value); } @Override |