diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-10 13:38:22 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-10 13:38:22 +0100 |
commit | 2e8e8f37a6fcc7ca194310a05ff079c3ad61127f (patch) | |
tree | 5111c810002a69efb6e5f4dfc6a59a5723fab32a /document | |
parent | c194ae3b6f72538b0709dd4a51cb08306c33e836 (diff) |
Add serialization for bool fields.
Diffstat (limited to 'document')
15 files changed, 112 insertions, 16 deletions
diff --git a/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java index 2a48b550658..189c275809a 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java @@ -60,6 +60,7 @@ public class BoolFieldValue extends FieldValue { public boolean getBoolean() { return value; } + public void setBoolean(boolean value) { this.value = value; } @Override public Object getWrappedValue() { 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 6adae27cadc..e4ca20a8e32 100644 --- a/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java +++ b/document/src/main/java/com/yahoo/document/json/DocumentUpdateJsonSerializer.java @@ -9,6 +9,7 @@ import com.yahoo.document.DocumentUpdate; import com.yahoo.document.FieldPath; import com.yahoo.document.annotation.AnnotationReference; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -285,6 +286,11 @@ public class DocumentUpdateJsonSerializer } @Override + public void write(FieldBase field, BoolFieldValue value) { + serializeBoolField(generator, field, value); + } + + @Override public <T extends FieldValue> void write(FieldBase field, CollectionFieldValue<T> value) { serializeCollectionField(this, generator, field, value); } 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 afe14cf1e6a..55e7dc3c1b3 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java +++ b/document/src/main/java/com/yahoo/document/json/JsonSerializationHelper.java @@ -8,6 +8,7 @@ import com.yahoo.document.Field; import com.yahoo.document.PositionDataType; import com.yahoo.document.PrimitiveDataType; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -234,6 +235,10 @@ public class JsonSerializationHelper { serializeByte(generator, field, value.getByte()); } + public static void serializeBoolField(JsonGenerator generator, FieldBase field, BoolFieldValue value) { + serializeBool(generator, field, value.getBoolean()); + } + public static void serializePredicateField(JsonGenerator generator, FieldBase field, PredicateFieldValue value){ serializeString(generator, field, value.toString()); } @@ -252,6 +257,11 @@ public class JsonSerializationHelper { wrapIOException(() -> generator.writeNumber(value)); } + public static void serializeBool(JsonGenerator generator, FieldBase field, boolean value) { + fieldNameIfNotNull(generator, field); + wrapIOException(() -> generator.writeBoolean(value)); + } + public static void serializeShort(JsonGenerator generator, FieldBase field, short value) { fieldNameIfNotNull(generator, field); wrapIOException(() -> generator.writeNumber(value)); 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 ecec34c5d3f..ab0884a54a3 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonWriter.java +++ b/document/src/main/java/com/yahoo/document/json/JsonWriter.java @@ -9,6 +9,7 @@ import com.yahoo.document.DocumentType; import com.yahoo.document.Field; import com.yahoo.document.annotation.AnnotationReference; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -140,6 +141,11 @@ public class JsonWriter implements DocumentWriter { } @Override + public void write(FieldBase field, BoolFieldValue value) { + serializeBoolField(generator, field, value); + } + + @Override public <T extends FieldValue> void write(FieldBase field, CollectionFieldValue<T> value) { serializeCollectionField(this, generator, field, value); } diff --git a/document/src/main/java/com/yahoo/document/serialization/FieldReader.java b/document/src/main/java/com/yahoo/document/serialization/FieldReader.java index 11fc0c314af..0b1500ed6ba 100644 --- a/document/src/main/java/com/yahoo/document/serialization/FieldReader.java +++ b/document/src/main/java/com/yahoo/document/serialization/FieldReader.java @@ -6,7 +6,24 @@ package com.yahoo.document.serialization; import com.yahoo.document.Document; import com.yahoo.document.annotation.AnnotationReference; -import com.yahoo.document.datatypes.*; +import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; +import com.yahoo.document.datatypes.ByteFieldValue; +import com.yahoo.document.datatypes.CollectionFieldValue; +import com.yahoo.document.datatypes.DoubleFieldValue; +import com.yahoo.document.datatypes.FieldValue; +import com.yahoo.document.datatypes.FloatFieldValue; +import com.yahoo.document.datatypes.IntegerFieldValue; +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; +import com.yahoo.document.datatypes.TensorFieldValue; +import com.yahoo.document.datatypes.WeightedSet; import com.yahoo.vespa.objects.Deserializer; import com.yahoo.vespa.objects.FieldBase; @@ -54,6 +71,14 @@ public interface FieldReader extends Deserializer { void read(FieldBase field, ByteFieldValue value); /** + * Read in the value of byte field + * + * @param field - field description (name and data type) + * @param value - field value + */ + void read(FieldBase field, BoolFieldValue value); + + /** * Read in the value of collection field * * @param field - field description (name and data type) diff --git a/document/src/main/java/com/yahoo/document/serialization/FieldWriter.java b/document/src/main/java/com/yahoo/document/serialization/FieldWriter.java index 243d25c3950..63a6d997b04 100644 --- a/document/src/main/java/com/yahoo/document/serialization/FieldWriter.java +++ b/document/src/main/java/com/yahoo/document/serialization/FieldWriter.java @@ -4,6 +4,7 @@ package com.yahoo.document.serialization; import com.yahoo.document.Document; import com.yahoo.document.annotation.AnnotationReference; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -78,6 +79,16 @@ public interface FieldWriter extends Serializer { void write(FieldBase field, ByteFieldValue value); /** + * Write out the value of byte field + * + * @param field + * field description (name and data type) + * @param value + * field value + */ + void write(FieldBase field, BoolFieldValue value); + + /** * Write out the value of collection field * * @param field diff --git a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java index 6ec7a1e2b21..7ff5729ca39 100644 --- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java +++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentDeserializer42.java @@ -27,6 +27,7 @@ import com.yahoo.document.annotation.SpanNode; import com.yahoo.document.annotation.SpanNodeParent; import com.yahoo.document.annotation.SpanTree; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -111,6 +112,7 @@ public class VespaDocumentDeserializer42 extends VespaDocumentSerializer42 imple public void read(Document document) { read(null, document); } + public void read(FieldBase field, Document doc) { // Verify that we have correct version @@ -219,6 +221,10 @@ public class VespaDocumentDeserializer42 extends VespaDocumentSerializer42 imple public <T extends FieldValue> void read(FieldBase field, CollectionFieldValue<T> value) { throw new IllegalArgumentException("read not implemented yet."); } + @Override + public void read(FieldBase field, BoolFieldValue value) { + value.setBoolean((getByte(null) != 0)); + } public void read(FieldBase field, ByteFieldValue value) { value.assign(getByte(null)); } public void read(FieldBase field, DoubleFieldValue value) { value.assign(getDouble(null)); } public void read(FieldBase field, FloatFieldValue value) { value.assign(getFloat(null)); } 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 6a07e04a621..581c7df8aee 100644 --- a/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java +++ b/document/src/main/java/com/yahoo/document/serialization/VespaDocumentSerializer42.java @@ -20,6 +20,7 @@ import com.yahoo.document.annotation.SpanList; import com.yahoo.document.annotation.SpanNode; import com.yahoo.document.annotation.SpanTree; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -57,7 +58,6 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.logging.Logger; import static com.yahoo.text.Utf8.calculateBytePositions; @@ -168,16 +168,17 @@ public class VespaDocumentSerializer42 extends BufferSerializer implements Docum } } - /** - * Write out the value of byte field - * - * @param field - field description (name and data type) - * @param value - field value - */ + @Override public void write(FieldBase field, ByteFieldValue value) { buf.put(value.getByte()); } + @Override + public void write(FieldBase field, BoolFieldValue value) { + byte v = value.getBoolean() ? (byte)1 : (byte)0; + buf.put(v); + } + /** * Write out the value of collection field * diff --git a/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java b/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java index 768ec879ce1..0d6b0cae926 100644 --- a/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java +++ b/document/src/main/java/com/yahoo/document/serialization/XmlDocumentWriter.java @@ -7,6 +7,7 @@ import com.yahoo.document.DocumentType; import com.yahoo.document.Field; import com.yahoo.document.annotation.AnnotationReference; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.CollectionFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; @@ -137,6 +138,11 @@ public final class XmlDocumentWriter implements DocumentWriter { } @Override + public void write(FieldBase field, BoolFieldValue value) { + singleValueTag(field, value); + } + + @Override public <T extends FieldValue> void write(FieldBase field, CollectionFieldValue<T> value) { buffer.beginTag(field.getName()); diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFieldReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFieldReader.java index 8aa34ae9bba..737371f2375 100644 --- a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFieldReader.java +++ b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFieldReader.java @@ -298,6 +298,19 @@ public class VespaXMLFieldReader extends VespaXMLReader implements FieldReader { } } + public void read(FieldBase field, BoolFieldValue value) { + try { + String dataParsed = reader.getElementText(); + try { + value.assign(dataParsed); + } catch (Exception e) { + throw newDeserializeException(field, e.getMessage()); + } + } catch (XMLStreamException e) { + throw newException(field, e); + } + } + public void read(FieldBase field, DoubleFieldValue value) { try { String dataParsed = reader.getElementText(); diff --git a/document/src/test/java/com/yahoo/document/DocumentSerializationTestCase.java b/document/src/test/java/com/yahoo/document/DocumentSerializationTestCase.java index e45da62353d..7d1992225e4 100644 --- a/document/src/test/java/com/yahoo/document/DocumentSerializationTestCase.java +++ b/document/src/test/java/com/yahoo/document/DocumentSerializationTestCase.java @@ -4,6 +4,7 @@ package com.yahoo.document; import com.yahoo.compress.CompressionType; import com.yahoo.document.annotation.AbstractTypesTest; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; import com.yahoo.document.datatypes.FloatFieldValue; @@ -72,6 +73,7 @@ public class DocumentSerializationTestCase extends AbstractTypesTest { docType.addField(new Field("rawfield", DataType.RAW, false)); docType.addField(new Field("doublefield", DataType.DOUBLE, false)); docType.addField(new Field("bytefield", DataType.BYTE, false)); + docType.addField(new Field("boolfield", DataType.BOOL, false)); DataType arrayOfFloatDataType = new ArrayDataType(DataType.FLOAT); docType.addField(new Field("arrayoffloatfield", arrayOfFloatDataType, false)); DataType arrayOfArrayOfFloatDataType = new ArrayDataType(arrayOfFloatDataType); @@ -94,6 +96,7 @@ public class DocumentSerializationTestCase extends AbstractTypesTest { doc.setFieldValue("longfield", new LongFieldValue(398420092938472983l)); doc.setFieldValue("doublefield", new DoubleFieldValue(98374532.398820)); doc.setFieldValue("bytefield", new ByteFieldValue(254)); + doc.setFieldValue("boolfield", new BoolFieldValue(true)); byte[] rawData = "RAW DATA".getBytes(); assertEquals(8, rawData.length); doc.setFieldValue(docType.getField("rawfield"),new Raw(ByteBuffer.wrap("RAW DATA".getBytes()))); @@ -176,12 +179,12 @@ public class DocumentSerializationTestCase extends AbstractTypesTest { assertEquals(new StringFieldValue("This is a string."), doc.getFieldValue("stringfield")); assertEquals(new LongFieldValue(398420092938472983l), doc.getFieldValue("longfield")); assertEquals(98374532.398820, ((DoubleFieldValue)doc.getFieldValue("doublefield")).getDouble(), 1E-6); - assertEquals(new ByteFieldValue((byte)254), - doc.getFieldValue("bytefield")); + assertEquals(new ByteFieldValue((byte)254), doc.getFieldValue("bytefield")); + // Todo add cpp serialization + // assertEquals(new BoolFieldValue(true), doc.getFieldValue("boolfield")); ByteBuffer bbuffer = ((Raw)doc.getFieldValue("rawfield")).getByteBuffer(); if (!Arrays.equals("RAW DATA".getBytes(), bbuffer.array())) { - System.err.println("Expected 'RAW DATA' but got '" - + new String(bbuffer.array()) + "'."); + System.err.println("Expected 'RAW DATA' but got '" + new String(bbuffer.array()) + "'."); assertTrue(false); } if (test.version > 6) { diff --git a/document/src/test/java/com/yahoo/document/DocumentTestCase.java b/document/src/test/java/com/yahoo/document/DocumentTestCase.java index 6a2147d6f15..3eebc4396e8 100644 --- a/document/src/test/java/com/yahoo/document/DocumentTestCase.java +++ b/document/src/test/java/com/yahoo/document/DocumentTestCase.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.yahoo.compress.CompressionType; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; import com.yahoo.document.datatypes.FieldPathIteratorHandler; @@ -89,6 +90,7 @@ public class DocumentTestCase extends DocumentTestCaseBase { " </item>\n" + " </mapfield>\n" + SERTEST_DOC_AS_XML_SUNNYVALE + + " <myboolfield>true</myboolfield>\n" + "</document>\n"; static DocumentTypeManager setUpCppDocType() { @@ -124,6 +126,7 @@ public class DocumentTestCase extends DocumentTestCaseBase { sertestDocType.addField(new Field("docindoc", 882, docInDocType, false)); sertestDocType.addField(new Field("mapfield", 883, new MapDataType(DataType.STRING, DataType.STRING), false)); sertestDocType.addField(new Field("myposfield", 884, PositionDataType.INSTANCE, false)); + sertestDocType.addField(new Field("myboolfield", 885, DataType.BOOL, false)); docMan.registerDocumentType(sertestDocType); } @@ -165,6 +168,7 @@ public class DocumentTestCase extends DocumentTestCaseBase { map.put(new StringFieldValue("foo1"), new StringFieldValue("bar1")); map.put(new StringFieldValue("foo2"), new StringFieldValue("bar2")); doc.setFieldValue("mapfield", map); + doc.setFieldValue("myboolfield", new BoolFieldValue(true)); return doc; } @@ -776,12 +780,12 @@ public class DocumentTestCase extends DocumentTestCaseBase { doc.setFieldValue("wsfield", wset); MapFieldValue<StringFieldValue, StringFieldValue> map = - new MapFieldValue<>( - (MapDataType)doc.getDataType().getField("mapfield").getDataType()); + new MapFieldValue<>((MapDataType)doc.getDataType().getField("mapfield").getDataType()); map.put(new StringFieldValue("foo1"), new StringFieldValue("bar1")); map.put(new StringFieldValue("foo2"), new StringFieldValue("bar2")); doc.setFieldValue("mapfield", map); + doc.setFieldValue("boolfield", new BoolFieldValue(true)); doc.setFieldValue("bytefield", new ByteFieldValue((byte)254)); doc.setFieldValue("rawfield", new Raw(ByteBuffer.wrap("RAW DATA".getBytes()))); doc.setFieldValue("intfield", new IntegerFieldValue(5)); @@ -841,6 +845,7 @@ public class DocumentTestCase extends DocumentTestCaseBase { Document doc2 = docMan.createDocument(data); + assertEquals(doc.getFieldValue("myboolfield"), doc2.getFieldValue("myboolfield")); assertEquals(doc.getFieldValue("mailid"), doc2.getFieldValue("mailid")); assertEquals(doc.getFieldValue("date"), doc2.getFieldValue("date")); assertEquals(doc.getFieldValue("from"), doc2.getFieldValue("from")); @@ -1229,7 +1234,7 @@ public class DocumentTestCase extends DocumentTestCaseBase { assertEquals(fields.get("date"), -2013512400); assertThat(fields.get("docindoc"), instanceOf(Map.class)); assertThat(fields.keySet(), - containsInAnyOrder("mailid", "date", "attachmentcount", "rawfield", "weightedfield", "docindoc", "mapfield")); + containsInAnyOrder("mailid", "date", "attachmentcount", "rawfield", "weightedfield", "docindoc", "mapfield", "myboolfield")); } } diff --git a/document/src/tests/data/crossplatform-java-cpp-document.cfg b/document/src/tests/data/crossplatform-java-cpp-document.cfg index f12dae77fc0..134d31b1831 100644 --- a/document/src/tests/data/crossplatform-java-cpp-document.cfg +++ b/document/src/tests/data/crossplatform-java-cpp-document.cfg @@ -83,7 +83,7 @@ datatype[8].weightedsettype[0] datatype[8].structtype[1] datatype[8].structtype[0].name serializetest.body datatype[8].structtype[0].version 0 -datatype[8].structtype[0].field[10] +datatype[8].structtype[0].field[11] datatype[8].structtype[0].field[0].name intfield datatype[8].structtype[0].field[0].id[0] datatype[8].structtype[0].field[0].datatype 0 @@ -114,6 +114,9 @@ datatype[8].structtype[0].field[8].datatype 437829 datatype[8].structtype[0].field[9].name mapfield datatype[8].structtype[0].field[9].id[0] datatype[8].structtype[0].field[9].datatype 9999 +datatype[8].structtype[0].field[10].name boolfield +datatype[8].structtype[0].field[10].id[0] +datatype[8].structtype[0].field[10].datatype 6 datatype[8].documenttype[0] datatype[9].id 1306012852 datatype[9].arraytype[0] diff --git a/document/src/tests/data/serializejava-compressed.dat b/document/src/tests/data/serializejava-compressed.dat Binary files differindex 453abef81f1..0f6cb55ff85 100644 --- a/document/src/tests/data/serializejava-compressed.dat +++ b/document/src/tests/data/serializejava-compressed.dat diff --git a/document/src/tests/data/serializejava.dat b/document/src/tests/data/serializejava.dat Binary files differindex 3dd9f8fcd52..53ef6a8fbc2 100644 --- a/document/src/tests/data/serializejava.dat +++ b/document/src/tests/data/serializejava.dat |