From 835ae1359267be688ed1eec97da81a6569ded785 Mon Sep 17 00:00:00 2001
From: David Li
Date: Tue, 30 Jun 2020 13:25:44 -0400
Subject: [PATCH] ARROW-9284: [Java] fix getMinorTypeForArrowType with dense
unions
---
.../org/apache/arrow/vector/types/Types.java | 9 ++++-
.../arrow/vector/TestDenseUnionVector.java | 33 +++++++++++++++++++
2 files changed, 41 insertions(+), 1 deletion(-)
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 40d20842d5d..99ee937a6dc 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
@@ -809,7 +809,14 @@ public MinorType visit(FixedSizeList type) {
@Override
public MinorType visit(Union type) {
- return MinorType.UNION;
+ switch (type.getMode()) {
+ case Sparse:
+ return MinorType.UNION;
+ case Dense:
+ return MinorType.DENSEUNION;
+ default:
+ throw new IllegalArgumentException("Unknown union mode: " + type.getMode());
+ }
}
@Override
diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestDenseUnionVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestDenseUnionVector.java
index dcd60507fa8..eb003aa4334 100644
--- a/java/vector/src/test/java/org/apache/arrow/vector/TestDenseUnionVector.java
+++ b/java/vector/src/test/java/org/apache/arrow/vector/TestDenseUnionVector.java
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -31,6 +32,7 @@
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.vector.complex.DenseUnionVector;
import org.apache.arrow.vector.complex.StructVector;
+import org.apache.arrow.vector.complex.UnionVector;
import org.apache.arrow.vector.holders.NullableBigIntHolder;
import org.apache.arrow.vector.holders.NullableBitHolder;
import org.apache.arrow.vector.holders.NullableFloat4Holder;
@@ -43,6 +45,7 @@
import org.apache.arrow.vector.types.pojo.ArrowType;
import org.apache.arrow.vector.types.pojo.Field;
import org.apache.arrow.vector.types.pojo.FieldType;
+import org.apache.arrow.vector.types.pojo.Schema;
import org.apache.arrow.vector.util.JsonStringHashMap;
import org.apache.arrow.vector.util.Text;
import org.apache.arrow.vector.util.TransferPair;
@@ -613,6 +616,36 @@ public void testChildVectorValueCounts() {
}
}
+ @Test
+ public void testDenseUnionFromMinorType() {
+ final Field denseField = new Field(
+ "union",
+ new FieldType(
+ /* nullable */ false,
+ new ArrowType.Union(UnionMode.Dense, new int[]{0}),
+ /* dictionary */ null),
+ Collections.emptyList());
+ final Field sparseField = new Field(
+ "union",
+ new FieldType(
+ /* nullable */ false,
+ new ArrowType.Union(UnionMode.Sparse, new int[]{0}),
+ /* dictionary */ null),
+ Collections.emptyList());
+ final Schema denseSchema = new Schema(Collections.singletonList(denseField));
+ final Schema sparseSchema = new Schema(Collections.singletonList(sparseField));
+ try (final VectorSchemaRoot root = VectorSchemaRoot.create(sparseSchema, allocator)) {
+ assertTrue(root.getVector("union") instanceof UnionVector);
+ }
+ try (final VectorSchemaRoot root = VectorSchemaRoot.create(denseSchema, allocator)) {
+ assertTrue(root.getVector("union") instanceof DenseUnionVector);
+ }
+ assertEquals(MinorType.DENSEUNION,
+ Types.getMinorTypeForArrowType(new ArrowType.Union(UnionMode.Dense, new int[]{0})));
+ assertEquals(MinorType.UNION,
+ Types.getMinorTypeForArrowType(new ArrowType.Union(UnionMode.Sparse, new int[]{0})));
+ }
+
private static NullableIntHolder newIntHolder(int value) {
final NullableIntHolder holder = new NullableIntHolder();
holder.isSet = 1;