From 8a61fd4f63cdae9c96e584506295617419ee8395 Mon Sep 17 00:00:00 2001 From: Steven Phillips Date: Fri, 7 Oct 2016 13:12:35 -0700 Subject: [PATCH] ARROW-326: Initialize nested writers in MapWriter based on the underlying MapVector's field --- .../main/codegen/templates/MapWriters.java | 22 +++++++++++++++++++ .../complex/impl/TestPromotableWriter.java | 16 +++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 7f319a9ca34..9fe20df7a1d 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -56,6 +56,28 @@ public class ${mode}MapWriter extends AbstractFieldWriter { } this.container = container; + for (Field child : container.getField().getChildren()) { + switch (Types.getMinorTypeForArrowType(child.getType())) { + case MAP: + map(child.getName()); + break; + case LIST: + list(child.getName()); + break; + case UNION: + UnionWriter writer = new UnionWriter(container.addOrGet(child.getName(), MinorType.UNION, UnionVector.class)); + fields.put(child.getName().toLowerCase(), writer); + break; +<#list vv.types as type><#list type.minor as minor> +<#assign lowerName = minor.class?uncap_first /> +<#if lowerName == "int" ><#assign lowerName = "integer" /> +<#assign upperName = minor.class?upper_case /> + case ${upperName}: + ${lowerName}(child.getName()); + break; + + } + } } @Override diff --git a/java/vector/src/test/java/org/apache/arrow/vector/complex/impl/TestPromotableWriter.java b/java/vector/src/test/java/org/apache/arrow/vector/complex/impl/TestPromotableWriter.java index 689c96fda92..16d42b70f82 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/complex/impl/TestPromotableWriter.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/complex/impl/TestPromotableWriter.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import org.apache.arrow.flatbuf.Type; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.vector.DirtyRootAllocator; import org.apache.arrow.vector.complex.AbstractMapVector; @@ -50,7 +51,7 @@ public void terminate() throws Exception { @Test public void testPromoteToUnion() throws Exception { - try (final AbstractMapVector container = new MapVector(EMPTY_SCHEMA_PATH, allocator, null); + try (final MapVector container = new MapVector(EMPTY_SCHEMA_PATH, allocator, null); final NullableMapVector v = container.addOrGet("test", MinorType.MAP, NullableMapVector.class); final PromotableWriter writer = new PromotableWriter(v, container)) { @@ -92,6 +93,19 @@ public void testPromoteToUnion() throws Exception { assertFalse("4 shouldn't be null", accessor.isNull(4)); assertEquals(100, accessor.getObject(4)); + + container.clear(); + container.allocateNew(); + + ComplexWriterImpl newWriter = new ComplexWriterImpl(EMPTY_SCHEMA_PATH, container); + + writer.start(); + + writer.setPosition(2); + writer.integer("A").writeInt(10); + + assertEquals("Child field should be union type", Type.Union, container.getField().getChildren().get(0).getChildren().get(0).getType().getTypeType()); + } } }