From b4e3917d746fcf4be76d353be7c3b4ae9b229973 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Fri, 14 Dec 2018 11:28:18 +0100 Subject: Support for configuring and feeding float16 and bool field types --- .../src/main/java/com/yahoo/document/DataType.java | 7 +- .../java/com/yahoo/document/NumericDataType.java | 4 +- .../yahoo/document/datatypes/BoolFieldValue.java | 120 +++++++++++++++++ .../yahoo/document/datatypes/ByteFieldValue.java | 12 +- .../document/datatypes/CollectionFieldValue.java | 5 +- .../document/datatypes/CompositeFieldValue.java | 2 + .../yahoo/document/datatypes/DoubleFieldValue.java | 6 +- .../datatypes/FieldPathIteratorHandler.java | 4 +- .../com/yahoo/document/datatypes/FieldValue.java | 1 + .../document/datatypes/Float16FieldValue.java | 137 +++++++++++++++++++ .../yahoo/document/datatypes/FloatFieldValue.java | 11 +- .../document/datatypes/IntegerFieldValue.java | 4 +- .../yahoo/document/datatypes/LongFieldValue.java | 6 +- .../java/com/yahoo/document/datatypes/Raw.java | 2 +- .../document/datatypes/ReferenceFieldValue.java | 13 +- .../java/com/yahoo/document/datatypes/Struct.java | 4 +- .../yahoo/document/datatypes/UriFieldValue.java | 7 +- .../serialization/XmlSerializationHelper.java | 9 +- .../yahoo/document/datatypes/StringTestCase.java | 118 +---------------- .../yahoo/document/json/JsonReaderTestCase.java | 145 ++++++++++++--------- 20 files changed, 405 insertions(+), 212 deletions(-) create mode 100644 document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java create mode 100644 document/src/main/java/com/yahoo/document/datatypes/Float16FieldValue.java (limited to 'document') diff --git a/document/src/main/java/com/yahoo/document/DataType.java b/document/src/main/java/com/yahoo/document/DataType.java index dfe55f5229c..fa5dffd042a 100644 --- a/document/src/main/java/com/yahoo/document/DataType.java +++ b/document/src/main/java/com/yahoo/document/DataType.java @@ -3,6 +3,7 @@ package com.yahoo.document; import com.yahoo.collections.Pair; import com.yahoo.concurrent.CopyOnWriteHashMap; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.ByteFieldValue; import com.yahoo.document.datatypes.DoubleFieldValue; import com.yahoo.document.datatypes.FieldValue; @@ -11,8 +12,8 @@ import com.yahoo.document.datatypes.IntegerFieldValue; import com.yahoo.document.datatypes.LongFieldValue; import com.yahoo.document.datatypes.PredicateFieldValue; import com.yahoo.document.datatypes.Raw; +import com.yahoo.document.datatypes.Float16FieldValue; import com.yahoo.document.datatypes.StringFieldValue; -import com.yahoo.document.datatypes.TensorFieldValue; import com.yahoo.document.datatypes.UriFieldValue; import com.yahoo.tensor.TensorType; import com.yahoo.vespa.objects.Identifiable; @@ -39,7 +40,6 @@ public abstract class DataType extends Identifiable implements Serializable, Com // NOTE: These types are also defined in // document/src/vespa/document/datatype/datatype.h // Changes here must also be done there - public final static NumericDataType NONE = new NumericDataType("none", -1, IntegerFieldValue.class, IntegerFieldValue.getFactory()); public final static NumericDataType INT = new NumericDataType("int", 0, IntegerFieldValue.class, IntegerFieldValue.getFactory()); public final static NumericDataType FLOAT = new NumericDataType("float", 1, FloatFieldValue.class, FloatFieldValue.getFactory()); @@ -47,6 +47,8 @@ public abstract class DataType extends Identifiable implements Serializable, Com public final static PrimitiveDataType RAW = new PrimitiveDataType("raw", 3, Raw.class, Raw.getFactory()); public final static NumericDataType LONG = new NumericDataType("long", 4, LongFieldValue.class, LongFieldValue.getFactory()); public final static NumericDataType DOUBLE = new NumericDataType("double", 5, DoubleFieldValue.class, DoubleFieldValue.getFactory()); + public final static PrimitiveDataType BOOL = new PrimitiveDataType("bool", 6, BoolFieldValue.class, BoolFieldValue.getFactory()); + public final static NumericDataType FLOAT16 = new NumericDataType("float16", 7, Float16FieldValue.class, Float16FieldValue.getFactory()); public final static DocumentType DOCUMENT = new DocumentType("document"); public final static PrimitiveDataType URI = new PrimitiveDataType("uri", 10, UriFieldValue.class, new UriFieldValue.Factory()); public final static NumericDataType BYTE = new NumericDataType("byte", 16, ByteFieldValue.class, ByteFieldValue.getFactory()); @@ -82,7 +84,6 @@ public abstract class DataType extends Identifiable implements Serializable, Com this.dataTypeId = dataTypeId; } - @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException") public DataType clone() { return (DataType)super.clone(); } diff --git a/document/src/main/java/com/yahoo/document/NumericDataType.java b/document/src/main/java/com/yahoo/document/NumericDataType.java index f4a92eca5a1..26da90a709c 100644 --- a/document/src/main/java/com/yahoo/document/NumericDataType.java +++ b/document/src/main/java/com/yahoo/document/NumericDataType.java @@ -4,9 +4,10 @@ package com.yahoo.document; import com.yahoo.vespa.objects.Ids; /** - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public class NumericDataType extends PrimitiveDataType { + // The global class identifier shared with C++. public static int classId = registerClass(Ids.document + 52, NumericDataType.class); /** @@ -24,4 +25,5 @@ public class NumericDataType extends PrimitiveDataType { public NumericDataType clone() { return (NumericDataType) super.clone(); } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java new file mode 100644 index 00000000000..2a48b550658 --- /dev/null +++ b/document/src/main/java/com/yahoo/document/datatypes/BoolFieldValue.java @@ -0,0 +1,120 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.document.datatypes; + +import com.yahoo.document.DataType; +import com.yahoo.document.Field; +import com.yahoo.document.PrimitiveDataType; +import com.yahoo.document.serialization.FieldReader; +import com.yahoo.document.serialization.FieldWriter; +import com.yahoo.document.serialization.XmlSerializationHelper; +import com.yahoo.document.serialization.XmlStream; +import com.yahoo.vespa.objects.Ids; + +/** + * A boolean field value + * + * @author bratseth + */ +public class BoolFieldValue extends FieldValue { + + private static class Factory extends PrimitiveDataType.Factory { + public FieldValue create() { + return new BoolFieldValue(); + } + } + + public static PrimitiveDataType.Factory getFactory() { return new Factory(); } + public static final int classId = registerClass(Ids.document + 17, BoolFieldValue.class); + private boolean value; + + public BoolFieldValue() { + this(false); + } + + public BoolFieldValue(boolean value) { + this.value = value; + } + + public BoolFieldValue(String s) { value = Boolean.parseBoolean(s); } + + @Override + public BoolFieldValue clone() { + return (BoolFieldValue)super.clone(); + } + + @Override + public void clear() { + value = false; + } + + @Override + public void assign(Object o) { + if ( ! checkAssign(o)) return; + if (o instanceof String || o instanceof StringFieldValue) { + value = Boolean.parseBoolean(o.toString()); + } else { + throw new IllegalArgumentException("Class " + o.getClass() + " not applicable to an " + this.getClass() + " instance."); + } + } + + public boolean getBoolean() { + return value; + } + + @Override + public Object getWrappedValue() { + return value; + } + + @Override + public DataType getDataType() { + return DataType.BOOL; + } + + @Override + public void printXml(XmlStream xml) { + XmlSerializationHelper.printBoolXml(this, xml); + } + + @Override + public String toString() { + return "" + value; + } + + @Override + public int hashCode() { + return super.hashCode() + ( value ? 3 : 0); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if ( ! (o instanceof BoolFieldValue)) return false; + if ( ! super.equals(o)) return false; + + BoolFieldValue that = (BoolFieldValue) o; + if (value != that.value) return false; + return true; + } + + @Override + public void serialize(Field field, FieldWriter writer) { + writer.write(field, this); + } + + /* (non-Javadoc) + * @see com.yahoo.document.datatypes.FieldValue#deserialize(com.yahoo.document.Field, com.yahoo.document.serialization.FieldReader) + */ + @Override + public void deserialize(Field field, FieldReader reader) { + reader.read(field, this); + } + + @Override + public int compareTo(FieldValue other) { + int comp = super.compareTo(other); + if (comp != 0) return comp; + return Boolean.compare(value, ((BoolFieldValue)other).value); + } + +} diff --git a/document/src/main/java/com/yahoo/document/datatypes/ByteFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/ByteFieldValue.java index 4aa4c29db48..2f8cb96219c 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/ByteFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/ByteFieldValue.java @@ -11,16 +11,18 @@ import com.yahoo.document.serialization.XmlStream; import com.yahoo.vespa.objects.Ids; /** - * FieldValue which encapsulates a byte. + * A byte field value * - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public class ByteFieldValue extends NumericFieldValue { + private static class Factory extends PrimitiveDataType.Factory { public FieldValue create() { return new ByteFieldValue(); } } + public static PrimitiveDataType.Factory getFactory() { return new Factory(); } public static final int classId = registerClass(Ids.document + 10, ByteFieldValue.class); private byte value; @@ -125,9 +127,8 @@ public class ByteFieldValue extends NumericFieldValue { } /* (non-Javadoc) - * @see com.yahoo.document.datatypes.FieldValue#deserialize(com.yahoo.document.Field, com.yahoo.document.serialization.FieldReader) - */ - + * @see com.yahoo.document.datatypes.FieldValue#deserialize(com.yahoo.document.Field, com.yahoo.document.serialization.FieldReader) + */ @Override public void deserialize(Field field, FieldReader reader) { reader.read(field, this); @@ -151,4 +152,5 @@ public class ByteFieldValue extends NumericFieldValue { return 0; } } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/CollectionFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/CollectionFieldValue.java index fe135ccfd05..ad6d329cbae 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/CollectionFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/CollectionFieldValue.java @@ -7,9 +7,9 @@ import java.util.Collection; import java.util.Iterator; /** - * Date: Apr 16, 2008 + * Superclass of multivalue field values * - * @author Håkon Humberset + * @author Håkon Humberset */ public abstract class CollectionFieldValue extends CompositeFieldValue { @@ -79,4 +79,5 @@ public abstract class CollectionFieldValue extends Composi } public abstract int size(); + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/CompositeFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/CompositeFieldValue.java index 3202c6b40af..6efd5a86f75 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/CompositeFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/CompositeFieldValue.java @@ -4,6 +4,7 @@ package com.yahoo.document.datatypes; import com.yahoo.document.DataType; public abstract class CompositeFieldValue extends FieldValue { + private DataType dataType; public CompositeFieldValue(DataType dataType) { @@ -36,4 +37,5 @@ public abstract class CompositeFieldValue extends FieldValue { result = 31 * result + (dataType != null ? dataType.hashCode() : 0); return result; } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/DoubleFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/DoubleFieldValue.java index 0f1fe50818b..99bac017b78 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/DoubleFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/DoubleFieldValue.java @@ -11,16 +11,18 @@ import com.yahoo.document.serialization.XmlStream; import com.yahoo.vespa.objects.Ids; /** - * FieldValue which encapsulates a double. + * A 64-bit float field value * - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public final class DoubleFieldValue extends NumericFieldValue { + private static class Factory extends PrimitiveDataType.Factory { public FieldValue create() { return new DoubleFieldValue(); } } + public static PrimitiveDataType.Factory getFactory() { return new Factory(); } public static final int classId = registerClass(Ids.document + 14, DoubleFieldValue.class); private double value; diff --git a/document/src/main/java/com/yahoo/document/datatypes/FieldPathIteratorHandler.java b/document/src/main/java/com/yahoo/document/datatypes/FieldPathIteratorHandler.java index de645aff297..9189a97dbf6 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/FieldPathIteratorHandler.java +++ b/document/src/main/java/com/yahoo/document/datatypes/FieldPathIteratorHandler.java @@ -1,12 +1,11 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document.datatypes; -import java.util.HashMap; import java.util.Map; import java.util.TreeMap; /** - * @author Thomas Gundersen + * @author Thomas Gundersen */ public abstract class FieldPathIteratorHandler { @@ -110,4 +109,5 @@ public abstract class FieldPathIteratorHandler { public VariableMap getVariables() { return variables; } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/FieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/FieldValue.java index 0460e303426..dc3fd36b367 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/FieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/FieldValue.java @@ -31,6 +31,7 @@ public abstract class FieldValue extends Identifiable implements ComparableEinar M R Rosenvinge + * @author Einar M R Rosenvinge */ public final class FloatFieldValue extends NumericFieldValue { + private static class Factory extends PrimitiveDataType.Factory { public FieldValue create() { return new FloatFieldValue(); } } + public static PrimitiveDataType.Factory getFactory() { return new Factory(); } public static final int classId = registerClass(Ids.document + 13, FloatFieldValue.class); private float value; @@ -120,9 +122,8 @@ public final class FloatFieldValue extends NumericFieldValue { } /* (non-Javadoc) - * @see com.yahoo.document.datatypes.FieldValue#deserialize(com.yahoo.document.Field, com.yahoo.document.serialization.FieldReader) - */ - + * @see com.yahoo.document.datatypes.FieldValue#deserialize(com.yahoo.document.Field, com.yahoo.document.serialization.FieldReader) + */ @Override public void deserialize(Field field, FieldReader reader) { reader.read(field, this); diff --git a/document/src/main/java/com/yahoo/document/datatypes/IntegerFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/IntegerFieldValue.java index 19f34acde9a..62090bab8cb 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/IntegerFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/IntegerFieldValue.java @@ -11,9 +11,9 @@ import com.yahoo.document.serialization.XmlStream; import com.yahoo.vespa.objects.Ids; /** - * FieldValue which encapsulates an int. + * A 32-bit integer field value * - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public final class IntegerFieldValue extends NumericFieldValue { diff --git a/document/src/main/java/com/yahoo/document/datatypes/LongFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/LongFieldValue.java index 2d3797f6735..45d044bcb9a 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/LongFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/LongFieldValue.java @@ -11,11 +11,12 @@ import com.yahoo.document.serialization.XmlStream; import com.yahoo.vespa.objects.Ids; /** - * FieldValue which encapsulates a long. + * A 64-bit integer field value * - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public final class LongFieldValue extends NumericFieldValue { + private static class Factory extends PrimitiveDataType.Factory { public FieldValue create() { return new LongFieldValue(); @@ -148,4 +149,5 @@ public final class LongFieldValue extends NumericFieldValue { return 0; } } + } diff --git a/document/src/main/java/com/yahoo/document/datatypes/Raw.java b/document/src/main/java/com/yahoo/document/datatypes/Raw.java index 23ed0cee23e..7900615aa93 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/Raw.java +++ b/document/src/main/java/com/yahoo/document/datatypes/Raw.java @@ -15,7 +15,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; /** - * FieldValue which encapsulates a Raw value + * A field value which is an array of byte data * * @author Einar M R Rosenvinge */ diff --git a/document/src/main/java/com/yahoo/document/datatypes/ReferenceFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/ReferenceFieldValue.java index 0097e5c93d0..034167b1121 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/ReferenceFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/ReferenceFieldValue.java @@ -14,21 +14,20 @@ import java.util.Objects; import java.util.Optional; /** - * A reference field value allows search queries to access fields in other document instances + *

A reference field value allows search queries to access fields in other document instances * as if they were fields natively stored within the searched document. This allows modelling * one-to-many relations such as a parent document with many children containing references - * back to the parent. + * back to the parent.

* - * Each ReferenceFieldValue may contain a single document ID which specifies the + *

Each ReferenceFieldValue may contain a single document ID which specifies the * instance the field should refer to. This document ID must have a type matching that of the - * reference data type of the field itself. + * reference data type of the field itself.

* - * Note that references are not polymorphic. This means that if you have a document type + *

Note that references are not polymorphic. This means that if you have a document type * "foo" inheriting "bar", you cannot have a reference<bar> field containing - * a document ID for a "foo" document. + * a document ID for a "foo" document.

* * @author vekterli - * @since 6.65 */ public class ReferenceFieldValue extends FieldValue { diff --git a/document/src/main/java/com/yahoo/document/datatypes/Struct.java b/document/src/main/java/com/yahoo/document/datatypes/Struct.java index 7d4e615b27b..fc75870bb94 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/Struct.java +++ b/document/src/main/java/com/yahoo/document/datatypes/Struct.java @@ -12,9 +12,7 @@ import com.yahoo.vespa.objects.Ids; import java.util.*; /** - * Date: Apr 15, 2008 - * - * @author humbe + * @author Håkon Humberset */ public class Struct extends StructuredFieldValue { diff --git a/document/src/main/java/com/yahoo/document/datatypes/UriFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/UriFieldValue.java index 13688c8e311..1b51d6625e2 100644 --- a/document/src/main/java/com/yahoo/document/datatypes/UriFieldValue.java +++ b/document/src/main/java/com/yahoo/document/datatypes/UriFieldValue.java @@ -10,12 +10,10 @@ import com.yahoo.net.Url; import java.net.URI; /** - * Created with IntelliJ IDEA. - * User: magnarn - * Date: 11/2/12 - * Time: 2:37 PM + * @author Magnar Nedland */ public class UriFieldValue extends StringFieldValue { + public static class Factory extends PrimitiveDataType.Factory { public FieldValue create() { return new UriFieldValue(); @@ -46,4 +44,5 @@ public class UriFieldValue extends StringFieldValue { super.deserialize(field, reader); Url.fromString(toString()); // Throws if value is invalid. } + } diff --git a/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java b/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java index 941dbc8d406..a0e7f81ea73 100644 --- a/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java +++ b/document/src/main/java/com/yahoo/document/serialization/XmlSerializationHelper.java @@ -7,7 +7,6 @@ import com.yahoo.document.datatypes.*; import com.yahoo.text.Utf8; import org.apache.commons.codec.binary.Base64; -import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -67,6 +66,14 @@ public class XmlSerializationHelper { xml.addContent(f.toString()); } + public static void printShortfloatXml(Float16FieldValue f, XmlStream xml) { + xml.addContent(f.toString()); + } + + public static void printBoolXml(BoolFieldValue f, XmlStream xml) { + xml.addContent(f.toString()); + } + public static void printIntegerXml(IntegerFieldValue f, XmlStream xml) { xml.addContent(f.toString()); } diff --git a/document/src/test/java/com/yahoo/document/datatypes/StringTestCase.java b/document/src/test/java/com/yahoo/document/datatypes/StringTestCase.java index ffc372d4851..e9fce35ed01 100644 --- a/document/src/test/java/com/yahoo/document/datatypes/StringTestCase.java +++ b/document/src/test/java/com/yahoo/document/datatypes/StringTestCase.java @@ -20,9 +20,6 @@ import com.yahoo.io.GrowableByteBuffer; import com.yahoo.vespa.objects.BufferSerializer; import org.junit.Test; -import java.util.Collection; -import java.util.Iterator; -import java.util.ListIterator; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -31,12 +28,12 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** - * @author Einar M R Rosenvinge + * @author Einar M R Rosenvinge */ public class StringTestCase extends AbstractTypesTest { @Test - public void testDeserialize() throws Exception { + public void testDeserialize() { byte[] buf = new byte[1500]; GrowableByteBuffer data = GrowableByteBuffer.wrap(buf); //short string @@ -122,17 +119,8 @@ public class StringTestCase extends AbstractTypesTest { assertTrue(blah.equals(blah2)); } -/* public void testSpanTree() { - StringFieldValue annotatedText = new StringFieldValue("banana airlines"); - SpanList lingTree = new SpanList(); - annotatedText.setSpanTree("linguistics", lingTree); - for (Annotation anAnnotation : annotatedText.getSpanTree("linguistics")) { - System.err.println(anAnnotation); - } - }*/ - @Test - public void testSerializeDeserialize() throws Exception { + public void testSerializeDeserialize() { java.lang.String test = "Hello hello"; BufferSerializer data = new BufferSerializer(new GrowableByteBuffer(100, 2.0f)); StringFieldValue value = new StringFieldValue(test); @@ -171,7 +159,7 @@ public class StringTestCase extends AbstractTypesTest { } @Test - public void testNestedSpanTreeBug4187377() { + public void testNestedSpanTree() { AnnotationType type = new AnnotationType("ann", DataType.STRING); StringFieldValue outerString = new StringFieldValue("Ballooo"); @@ -224,8 +212,6 @@ public class StringTestCase extends AbstractTypesTest { doc = annotate(doc, manager); doc = serializeAndDeserialize(doc, manager); - doc = consume(doc, manager); - System.err.println(doc); } private Document serializeAndDeserialize(Document doc, DocumentTypeManager manager) { @@ -247,11 +233,6 @@ public class StringTestCase extends AbstractTypesTest { AnnotationType location = registry.getType("location"); Map m = registry.getTypes(); - for (String key : m.keySet()) { - System.out.println("Key: " + key); - AnnotationType val = m.get(key); - parseAnnotationType(val); - } SpanTree tree = new SpanTree("testannotations"); SpanList root = (SpanList)tree.getRoot(); @@ -335,7 +316,7 @@ public class StringTestCase extends AbstractTypesTest { root.remove(branch); tree.cleanup(); - System.out.println("No. Of Annotations: " + tree.numAnnotations()); + assertEquals(5, tree.numAnnotations()); body.setSpanTree(tree); document.setFieldValue(document.getField("body"), body); @@ -343,93 +324,4 @@ public class StringTestCase extends AbstractTypesTest { return document; } - @SuppressWarnings("deprecation") - public Document consume(Document document, DocumentTypeManager docTypeMgr) { - DocumentType type = docTypeMgr.getDocumentType("blog"); - Collection fc = type.getFields(); - for (Field f : fc) { - System.out.println("\n\nField Name: " + f.getName()); - System.out.println("DataType: " + f.getDataType()); - System.out.println("isHeader? " + f.isHeader()); - - FieldValue val = document.getFieldValue(f); - if (val instanceof StringFieldValue) { - StringFieldValue sfv = (StringFieldValue)val; - System.out.println(f.getName() + " is a StringField. Field Value: " + sfv.getString()); - Collection c = sfv.getSpanTrees(); - for (SpanTree tree : c) { - System.out.println(f.getName() + " has annotations"); - consumeAnnotations(tree, (SpanList)tree.getRoot()); - } - } - } - - return document; - } - - public void consumeAnnotations(SpanTree tree, SpanList root) { - System.out.println("\n\nSpanList: " + root + " num Children: " + root.numChildren()); - System.out.println("-------------------"); - Iterator childIterator = root.childIterator(); - while (childIterator.hasNext()) { - SpanNode node = childIterator.next(); - System.out.println("Span Node: " + node); // + " Span Text: " + node.getText(fieldValStr)); - if (node instanceof SpanList) { - System.out.println("Encountered another span list"); - SpanList spl = (SpanList)node; - ListIterator lli = spl.childIterator(); - while (lli.hasNext()) { - System.out.print(" " + lli.next() + " "); - } - consumeAnnotations(tree, (SpanList)node); - } else { - System.out.println("\nGetting annotations for this span node: " + node); - getAnnotationsForNode(tree, node); - } - } - System.out.println("\nGetting annotations for the SpanList itself : " + root); - getAnnotationsForNode(tree, root); - } - - public void getAnnotationsForNode(SpanTree tree, SpanNode node) { - Iterator iter = tree.iterator(node); - boolean annotationPresent = false; - while (iter.hasNext()) { - annotationPresent = true; - Annotation xx = iter.next(); - Struct fValue = (Struct)xx.getFieldValue(); - System.out.println("Annotation: " + xx); - if (fValue == null) { - System.out.println("Field Value is null"); - return; - } - Iterator fieldIter = fValue.iterator(); - while (fieldIter.hasNext()) { - Map.Entry m = (Map.Entry)fieldIter.next(); - Field f = (Field)m.getKey(); - FieldValue val = (FieldValue)m.getValue(); - System.out.println("Field : " + f + " Value: " + val); - } - } - if (!annotationPresent) { - System.out.println("****No annotations found for the span node: " + node); - } - } - - public void parseAnnotationType(AnnotationType t) { - System.out.println("Type Name: " + t.getName()); - System.out.println("Type ID: " + t.getId()); - DataType dt = t.getDataType(); - String dataTypeStr; - if (dt == DataType.STRING) { - dataTypeStr = "String"; - } else if (dt == DataType.INT) { - dataTypeStr = "Integer"; - } else if (dt == DataType.URI) { - dataTypeStr = "URL"; - } else { - dataTypeStr = "UNKNOWN"; - } - System.out.println("Type DataType: " + dataTypeStr); - } } diff --git a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java index 32f63e6c0b3..b3d502ea56f 100644 --- a/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java +++ b/document/src/test/java/com/yahoo/document/json/JsonReaderTestCase.java @@ -22,6 +22,7 @@ import com.yahoo.document.StructDataType; import com.yahoo.document.TensorDataType; import com.yahoo.document.WeightedSetDataType; import com.yahoo.document.datatypes.Array; +import com.yahoo.document.datatypes.BoolFieldValue; import com.yahoo.document.datatypes.FieldValue; import com.yahoo.document.datatypes.IntegerFieldValue; import com.yahoo.document.datatypes.MapFieldValue; @@ -97,6 +98,7 @@ public class JsonReaderTestCase { x.addField(new Field("something", DataType.STRING)); x.addField(new Field("nalle", DataType.STRING)); x.addField(new Field("int1", DataType.INT)); + x.addField(new Field("flag", DataType.BOOL)); types.registerDocumentType(x); } { @@ -172,13 +174,20 @@ public class JsonReaderTestCase { } @Test - public final void readSingleDocumentPut() { - InputStream rawDoc = new ByteArrayInputStream( - Utf8.toBytes("{\"put\": \"id:unittest:smoke::whee\"," - + " \"fields\": { \"something\": \"smoketest\"," - + " \"nalle\": \"bamse\"}}")); + public void readSingleDocumentPut() { + String doc = + "{ \"put\": \"id:unittest:smoke::doc1\"," + + " \"fields\": { " + + " \"something\": \"smoketest\"," + + " \"flag\": true," + + " \"nalle\": \"bamse\"" + + " } " + + "}"; + + InputStream rawDoc = new ByteArrayInputStream(Utf8.toBytes(doc)); JsonReader r = new JsonReader(types, rawDoc, parserFactory); - DocumentPut put = (DocumentPut) r.readSingleDocument(DocumentParser.SupportedOperation.PUT, "id:unittest:smoke::whee"); + DocumentPut put = (DocumentPut) r.readSingleDocument(DocumentParser.SupportedOperation.PUT, + "id:unittest:smoke::doc1"); smokeTestDoc(put.getDocument()); } @@ -196,7 +205,7 @@ public class JsonReaderTestCase { } @Test - public final void readClearField() { + public void readClearField() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"update\": \"id:unittest:smoke::whee\"," + " \"fields\": { \"int1\": {" @@ -211,11 +220,17 @@ public class JsonReaderTestCase { @Test - public final void smokeTest() throws IOException { - InputStream rawDoc = new ByteArrayInputStream( - Utf8.toBytes("{\"put\": \"id:unittest:smoke::whee\"," - + " \"fields\": { \"something\": \"smoketest\"," - + " \"nalle\": \"bamse\"}}")); + public void smokeTest() throws IOException { + String doc = + "{ \"put\": \"id:unittest:smoke::doc1\"," + + " \"fields\": { " + + " \"something\": \"smoketest\"," + + " \"flag\": true," + + " \"nalle\": \"bamse\"" + + " } " + + "}"; + + InputStream rawDoc = new ByteArrayInputStream(Utf8.toBytes(doc)); JsonReader r = new JsonReader(types, rawDoc, parserFactory); DocumentParseInfo parseInfo = r.parseDocument().get(); DocumentType docType = r.readDocumentType(parseInfo.documentId); @@ -225,13 +240,18 @@ public class JsonReaderTestCase { } @Test - public final void docIdLookaheadTest() throws IOException { - InputStream rawDoc = new ByteArrayInputStream( - Utf8.toBytes("{" - + " \"fields\": { \"something\": \"smoketest\"," - + " \"nalle\": \"bamse\"}," - + "\"put\": \"id:unittest:smoke::whee\"" - + "}")); + public void docIdLookaheadTest() throws IOException { + String doc = + "{ \"fields\": { " + + " \"something\": \"smoketest\"," + + " \"flag\": true," + + " \"nalle\": \"bamse\"" + + " }," + + " \"put\": \"id:unittest:smoke::doc1\"" + + " } " + + "}"; + + InputStream rawDoc = new ByteArrayInputStream(Utf8.toBytes(doc)); JsonReader r = new JsonReader(types, rawDoc, parserFactory); DocumentParseInfo parseInfo = r.parseDocument().get(); DocumentType docType = r.readDocumentType(parseInfo.documentId); @@ -242,10 +262,10 @@ public class JsonReaderTestCase { @Test - public final void emptyDocTest() throws IOException { + public void emptyDocTest() throws IOException { InputStream rawDoc = new ByteArrayInputStream( - Utf8.toBytes("{\"put\": \"id:unittest:smoke::whee\"," - + " \"fields\": {}}")); + Utf8.toBytes("{\"put\": \"id:unittest:smoke::whee\"," + + " \"fields\": {}}")); JsonReader r = new JsonReader(types, rawDoc, parserFactory); DocumentParseInfo parseInfo = r.parseDocument().get(); DocumentType docType = r.readDocumentType(parseInfo.documentId); @@ -255,7 +275,7 @@ public class JsonReaderTestCase { } @Test - public final void testStruct() throws IOException { + public void testStruct() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:mirrors::whee\"," + " \"fields\": { " @@ -285,7 +305,7 @@ public class JsonReaderTestCase { } @Test - public final void testStructUpdate() throws IOException { + public void testStructUpdate() throws IOException { DocumentUpdate put = parseUpdate("{\"update\": \"id:unittest:mirrors:g=test:whee\"," + "\"create\": true," + " \"fields\": { " @@ -331,7 +351,7 @@ public class JsonReaderTestCase { } @Test - public final void testUpdateArray() throws IOException { + public void testUpdateArray() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testarray::whee\"," + " \"fields\": { " + "\"actualarray\": {" + " \"add\": [" @@ -341,7 +361,7 @@ public class JsonReaderTestCase { } @Test - public final void testUpdateWeighted() throws IOException { + public void testUpdateWeighted() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testset::whee\"," + " \"fields\": { " + "\"actualset\": {" + " \"add\": {" @@ -365,7 +385,7 @@ public class JsonReaderTestCase { } @Test - public final void testUpdateMatch() throws IOException { + public void testUpdateMatch() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testset::whee\"," + " \"fields\": { " + "\"actualset\": {" + " \"match\": {" @@ -391,7 +411,7 @@ public class JsonReaderTestCase { @SuppressWarnings({ "cast", "unchecked", "rawtypes" }) @Test - public final void testArithmeticOperators() throws IOException { + public void testArithmeticOperators() throws IOException { Tuple2[] operations = new Tuple2[] { new Tuple2(UPDATE_DECREMENT, ArithmeticValueUpdate.Operator.SUB), @@ -428,7 +448,7 @@ public class JsonReaderTestCase { @SuppressWarnings("rawtypes") @Test - public final void testArrayIndexing() throws IOException { + public void testArrayIndexing() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testarray::whee\"," + " \"fields\": { " + "\"actualarray\": {" + " \"match\": {" @@ -451,7 +471,7 @@ public class JsonReaderTestCase { } @Test - public final void testDocumentRemove() { + public void testDocumentRemove() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"remove\": \"id:unittest:smoke::whee\"" + " }}")); @@ -461,7 +481,7 @@ public class JsonReaderTestCase { } @Test - public final void testWeightedSet() throws IOException { + public void testWeightedSet() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testset::whee\"," + " \"fields\": { \"actualset\": {" @@ -482,7 +502,7 @@ public class JsonReaderTestCase { } @Test - public final void testArray() throws IOException { + public void testArray() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testarray::whee\"," + " \"fields\": { \"actualarray\": [" @@ -503,7 +523,7 @@ public class JsonReaderTestCase { } @Test - public final void testMap() throws IOException { + public void testMap() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testmap::whee\"," + " \"fields\": { \"actualmap\": {" @@ -523,7 +543,7 @@ public class JsonReaderTestCase { } @Test - public final void testOldMap() throws IOException { + public void testOldMap() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testmap::whee\"," + " \"fields\": { \"actualmap\": [" @@ -544,7 +564,7 @@ public class JsonReaderTestCase { } @Test - public final void testPositionPositive() throws IOException { + public void testPositionPositive() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testsinglepos::bamf\"," + " \"fields\": { \"singlepos\": \"N63.429722;E10.393333\" }}")); @@ -561,7 +581,7 @@ public class JsonReaderTestCase { } @Test - public final void testPositionNegative() throws IOException { + public void testPositionNegative() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testsinglepos::bamf\"," + " \"fields\": { \"singlepos\": \"W46.63;S23.55\" }}")); @@ -578,7 +598,7 @@ public class JsonReaderTestCase { } @Test - public final void testRaw() throws IOException { + public void testRaw() throws IOException { String stuff = new String(new JsonStringEncoder().quoteAsString(new Base64().encodeToString(Utf8.toBytes("smoketest")))); InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testraw::whee\"," @@ -600,7 +620,7 @@ public class JsonReaderTestCase { } @Test - public final void testMapStringToArrayOfInt() throws IOException { + public void testMapStringToArrayOfInt() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testMapStringToArrayOfInt::whee\"," + " \"fields\": { \"actualMapStringToArrayOfInt\": { \"bamse\": [1, 2, 3] }}}")); @@ -621,7 +641,7 @@ public class JsonReaderTestCase { } @Test - public final void testOldMapStringToArrayOfInt() throws IOException { + public void testOldMapStringToArrayOfInt() throws IOException { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("{\"put\": \"id:unittest:testMapStringToArrayOfInt::whee\"," + " \"fields\": { \"actualMapStringToArrayOfInt\": [" @@ -644,7 +664,7 @@ public class JsonReaderTestCase { } @Test - public final void testAssignToString() throws IOException { + public void testAssignToString() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:smoke::whee\"," + " \"fields\": { \"something\": {" + " \"assign\": \"orOther\" }}" + " }"); @@ -655,7 +675,7 @@ public class JsonReaderTestCase { } @Test - public final void testAssignToArray() throws IOException { + public void testAssignToArray() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testMapStringToArrayOfInt::whee\"," + " \"fields\": { \"actualMapStringToArrayOfInt\": {" + " \"assign\": { \"bamse\": [1, 2, 3] }}}}"); @@ -671,7 +691,7 @@ public class JsonReaderTestCase { } @Test - public final void testOldAssignToArray() throws IOException { + public void testOldAssignToArray() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testMapStringToArrayOfInt::whee\"," + " \"fields\": { \"actualMapStringToArrayOfInt\": {" + " \"assign\": [" @@ -689,7 +709,7 @@ public class JsonReaderTestCase { } @Test - public final void testAssignToWeightedSet() throws IOException { + public void testAssignToWeightedSet() throws IOException { DocumentUpdate doc = parseUpdate("{\"update\": \"id:unittest:testset::whee\"," + " \"fields\": { " + "\"actualset\": {" + " \"assign\": {" @@ -706,10 +726,11 @@ public class JsonReaderTestCase { @Test - public final void testCompleteFeed() { + public void testCompleteFeed() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[{\"put\": \"id:unittest:smoke::whee\"," + " \"fields\": { \"something\": \"smoketest\"," + + " \"flag\": true," + " \"nalle\": \"bamse\"}}" + ", " + "{\"update\": \"id:unittest:testarray::whee\"," + " \"fields\": { " + "\"actualarray\": {" @@ -722,10 +743,11 @@ public class JsonReaderTestCase { } @Test - public final void testCompleteFeedWithCreateAndCondition() { + public void testCompleteFeedWithCreateAndCondition() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[{\"put\": \"id:unittest:smoke::whee\"," + " \"fields\": { \"something\": \"smoketest\"," + + " \"flag\": true," + " \"nalle\": \"bamse\"}}" + ", " + "{" + "\"condition\":\"bla\"," @@ -755,14 +777,14 @@ public class JsonReaderTestCase { } @Test - public final void testUpdateWithConditionAndCreateInDifferentOrdering() { - final int documentsCreated = 106; + public void testUpdateWithConditionAndCreateInDifferentOrdering() { + int documentsCreated = 106; List parts = Arrays.asList( "\"condition\":\"bla\"", "\"update\": \"id:unittest:testarray::whee\"", " \"fields\": { " + "\"actualarray\": { \"add\": [" + " \"person\",\"another person\"]}}", " \"create\":true"); - final Random random = new Random(42); + Random random = new Random(42); StringBuilder documents = new StringBuilder("["); for (int x = 0; x < documentsCreated; x++) { Collections.shuffle(parts, random); @@ -790,7 +812,7 @@ public class JsonReaderTestCase { @Test(expected=RuntimeException.class) - public final void testCreateIfNonExistentInPut() { + public void testCreateIfNonExistentInPut() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[{" + " \"create\":true," @@ -803,10 +825,11 @@ public class JsonReaderTestCase { } @Test - public final void testCompleteFeedWithIdAfterFields() { + public void testCompleteFeedWithIdAfterFields() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[{" + " \"fields\": { \"something\": \"smoketest\"," + + " \"flag\": true," + " \"nalle\": \"bamse\"}," + "\"put\": \"id:unittest:smoke::whee\"" + "}" + ", " @@ -840,7 +863,7 @@ public class JsonReaderTestCase { @Test - public final void testCompleteFeedWithEmptyDoc() { + public void testCompleteFeedWithEmptyDoc() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[{\"put\": \"id:unittest:smoke::whee\"," + " \"fields\": {}}" + ", " @@ -879,10 +902,13 @@ public class JsonReaderTestCase { } private void smokeTestDoc(Document doc) { - FieldValue f = doc.getFieldValue(doc.getField("nalle")); - assertSame(StringFieldValue.class, f.getClass()); - StringFieldValue s = (StringFieldValue) f; - assertEquals("bamse", s.getString()); + FieldValue boolField = doc.getFieldValue(doc.getField("flag")); + assertSame(BoolFieldValue.class, boolField.getClass()); + assertTrue((Boolean)boolField.getWrappedValue()); + + FieldValue stringField = doc.getFieldValue(doc.getField("nalle")); + assertSame(StringFieldValue.class, stringField.getClass()); + assertEquals("bamse", ((StringFieldValue) stringField).getString()); } @Test @@ -901,7 +927,7 @@ public class JsonReaderTestCase { } @Test - public final void feedWithBasicErrorTest() { + public void feedWithBasicErrorTest() { InputStream rawDoc = new ByteArrayInputStream( Utf8.toBytes("[" + " { \"put\": \"id:test:smoke::0\", \"fields\": { \"something\": \"foo\" } }," @@ -915,10 +941,11 @@ public class JsonReaderTestCase { } @Test - public final void idAsAliasForPutTest() throws IOException{ + public void idAsAliasForPutTest() throws IOException{ InputStream rawDoc = new ByteArrayInputStream( - Utf8.toBytes("{\"id\": \"id:unittest:smoke::whee\"," + Utf8.toBytes("{\"id\": \"id:unittest:smoke::doc1\"," + " \"fields\": { \"something\": \"smoketest\"," + + " \"flag\": true," + " \"nalle\": \"bamse\"}}")); JsonReader r = new JsonReader(types, rawDoc, parserFactory); DocumentParseInfo parseInfo = r.parseDocument().get(); @@ -948,7 +975,7 @@ public class JsonReaderTestCase { } @Test - public final void testFeedWithTestAndSetConditionOrderingOne() { + public void testFeedWithTestAndSetConditionOrderingOne() { testFeedWithTestAndSetCondition( inputJson("[", " {", -- cgit v1.2.3