diff --git a/java/vector/src/main/codegen/templates/ArrowType.java b/java/vector/src/main/codegen/templates/ArrowType.java index 6dfaf216ad0..f2fef15d870 100644 --- a/java/vector/src/main/codegen/templates/ArrowType.java +++ b/java/vector/src/main/codegen/templates/ArrowType.java @@ -70,9 +70,16 @@ public byte getTypeType() { @Override public int getType(FlatBufferBuilder builder) { + <#list type.fields as field> + <#if field.type == "String"> + int ${field.name} = builder.createString(this.${field.name}); + <#else> + ${field.type} ${field.name} = this.${field.name}; + + org.apache.arrow.flatbuf.${type.name}.start${type.name}(builder); <#list type.fields as field> - org.apache.arrow.flatbuf.${type.name}.add${field.name?cap_first}(builder, <#if field.type == "String">builder.createString(${field.name})<#else>${field.name}); + org.apache.arrow.flatbuf.${type.name}.add${field.name?cap_first}(builder, ${field.name}); return org.apache.arrow.flatbuf.${type.name}.end${type.name}(builder); } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java b/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java index c34882a8fb1..ba328151e45 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java @@ -115,8 +115,8 @@ public class Types { public enum MinorType { NULL(Null.INSTANCE) { @Override - public Field getField() { - return NULL_FIELD; + public Field getField(String name) { + return NULL_FIELD.newFieldWithName(name); } @Override @@ -131,7 +131,7 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, MAP(Tuple.INSTANCE) { @Override - public Field getField() { + public Field getField(String name) { throw new UnsupportedOperationException("Cannot get simple field for Map type"); } @@ -148,8 +148,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { TINYINT(new Int(8, true)) { @Override - public Field getField() { - return TINYINT_FIELD; + public Field getField(String name) { + return TINYINT_FIELD.newFieldWithName(name); } @Override @@ -164,8 +164,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // single byte signed integer SMALLINT(new Int(16, true)) { @Override - public Field getField() { - return SMALLINT_FIELD; + public Field getField(String name) { + return SMALLINT_FIELD.newFieldWithName(name); } @Override @@ -180,8 +180,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // two byte signed integer INT(new Int(32, true)) { @Override - public Field getField() { - return INT_FIELD; + public Field getField(String name) { + return INT_FIELD.newFieldWithName(name); } @Override @@ -196,8 +196,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // four byte signed integer BIGINT(new Int(64, true)) { @Override - public Field getField() { - return BIGINT_FIELD; + public Field getField(String name) { + return BIGINT_FIELD.newFieldWithName(name); } @Override @@ -212,8 +212,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // eight byte signed integer DATE(Date.INSTANCE) { @Override - public Field getField() { - return DATE_FIELD; + public Field getField(String name) { + return DATE_FIELD.newFieldWithName(name); } @Override @@ -228,8 +228,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // days since 4713bc TIME(Time.INSTANCE) { @Override - public Field getField() { - return TIME_FIELD; + public Field getField(String name) { + return TIME_FIELD.newFieldWithName(name); } @Override @@ -244,8 +244,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // time in micros before or after 2000/1/1 TIMESTAMP(new Timestamp("")) { @Override - public Field getField() { - return TIMESTAMP_FIELD; + public Field getField(String name) { + return TIMESTAMP_FIELD.newFieldWithName(name); } @Override @@ -260,8 +260,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, INTERVALDAY(IntervalDay.INSTANCE) { @Override - public Field getField() { - return INTERVALDAY_FIELD; + public Field getField(String name) { + return INTERVALDAY_FIELD.newFieldWithName(name); } @Override @@ -276,8 +276,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, INTERVALYEAR(IntervalYear.INSTANCE) { @Override - public Field getField() { - return INTERVALYEAR_FIELD; + public Field getField(String name) { + return INTERVALYEAR_FIELD.newFieldWithName(name); } @Override @@ -292,8 +292,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, FLOAT4(new FloatingPoint(0)) { @Override - public Field getField() { - return FLOAT4_FIELD; + public Field getField(String name) { + return FLOAT4_FIELD.newFieldWithName(name); } @Override @@ -308,8 +308,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // 4 byte ieee 754 FLOAT8(new FloatingPoint(1)) { @Override - public Field getField() { - return FLOAT8_FIELD; + public Field getField(String name) { + return FLOAT8_FIELD.newFieldWithName(name); } @Override @@ -324,8 +324,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // 8 byte ieee 754 BIT(Bool.INSTANCE) { @Override - public Field getField() { - return BIT_FIELD; + public Field getField(String name) { + return BIT_FIELD.newFieldWithName(name); } @Override @@ -340,8 +340,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // single bit value (boolean) VARCHAR(Utf8.INSTANCE) { @Override - public Field getField() { - return VARCHAR_FIELD; + public Field getField(String name) { + return VARCHAR_FIELD.newFieldWithName(name); } @Override @@ -356,8 +356,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // utf8 variable length string VARBINARY(Binary.INSTANCE) { @Override - public Field getField() { - return VARBINARY_FIELD; + public Field getField(String name) { + return VARBINARY_FIELD.newFieldWithName(name); } @Override @@ -376,7 +376,7 @@ public ArrowType getType() { throw new UnsupportedOperationException("Cannot get simple type for Decimal type"); } @Override - public Field getField() { + public Field getField(String name) { throw new UnsupportedOperationException("Cannot get simple field for Decimal type"); } @@ -392,8 +392,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // variable length binary UINT1(new Int(8, false)) { @Override - public Field getField() { - return UINT1_FIELD; + public Field getField(String name) { + return UINT1_FIELD.newFieldWithName(name); } @Override @@ -408,8 +408,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // unsigned 1 byte integer UINT2(new Int(16, false)) { @Override - public Field getField() { - return UINT2_FIELD; + public Field getField(String name) { + return UINT2_FIELD.newFieldWithName(name); } @Override @@ -424,8 +424,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // unsigned 2 byte integer UINT4(new Int(32, false)) { @Override - public Field getField() { - return UINT8_FIELD; + public Field getField(String name) { + return UINT8_FIELD.newFieldWithName(name); } @Override @@ -440,8 +440,8 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // unsigned 4 byte integer UINT8(new Int(64, false)) { @Override - public Field getField() { - return UINT8_FIELD; + public Field getField(String name) { + return UINT8_FIELD.newFieldWithName(name); } @Override @@ -456,7 +456,7 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, // unsigned 8 byte integer LIST(List.INSTANCE) { @Override - public Field getField() { + public Field getField(String name) { throw new UnsupportedOperationException("Cannot get simple field for List type"); } @@ -472,7 +472,7 @@ public FieldWriter getNewFieldWriter(ValueVector vector) { }, UNION(Union.INSTANCE) { @Override - public Field getField() { + public Field getField(String name) { throw new UnsupportedOperationException("Cannot get simple field for Union type"); } @@ -497,7 +497,7 @@ public ArrowType getType() { return type; } - public abstract Field getField(); + public abstract Field getField(String name); public abstract ValueVector getNewVector(String name, BufferAllocator allocator, CallBack callBack, int... precisionScale); diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java index 49d0503e470..d11f324c872 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java @@ -102,4 +102,8 @@ public boolean equals(Object obj) { (this.children.size() == 0 && that.children == null)); } + + public Field newFieldWithName(String name) { + return new Field(name, this.nullable, this.type, ImmutableList.copyOf(this.children)); + } } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/pojo/TestConvert.java b/java/vector/src/test/java/org/apache/arrow/vector/pojo/TestConvert.java index 06a1149c0d6..8560245f400 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/pojo/TestConvert.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/pojo/TestConvert.java @@ -18,7 +18,9 @@ package org.apache.arrow.vector.pojo; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.flatbuffers.FlatBufferBuilder; +import org.apache.arrow.vector.types.Types.MinorType; import org.apache.arrow.vector.types.pojo.ArrowType.FloatingPoint; import org.apache.arrow.vector.types.pojo.ArrowType.Int; import org.apache.arrow.vector.types.pojo.ArrowType.Tuple; @@ -28,6 +30,7 @@ import org.junit.Test; import java.util.List; +import java.util.Set; import static org.junit.Assert.assertEquals; @@ -36,10 +39,22 @@ */ public class TestConvert { + private static final Set NO_SIMPLE = ImmutableSet.of( + MinorType.MAP, + MinorType.LIST, + MinorType.UNION, + MinorType.DECIMAL + ); + @Test public void simple() { - Field initialField = new Field("a", true, new Int(32, true), null); - run(initialField); + for (MinorType minorType : MinorType.values()) { + if (NO_SIMPLE.contains(minorType)) { + continue; + } + Field field = minorType.getField(minorType.name()); + run(field); + } } @Test