From 51da2a1af37627e081623a00575efdb512759849 Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Thu, 29 Dec 2016 14:34:14 -0500 Subject: [PATCH 1/6] Arrow-386: [Java] Respect case of struct / map field names --- .../main/codegen/templates/MapWriters.java | 16 ++++++------- .../main/codegen/templates/UnionVector.java | 3 ++- .../vector/complex/AbstractMapVector.java | 6 ++--- .../complex/writer/TestComplexWriter.java | 23 +++++++++++++++++++ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index f41b60072c8..30354d520d1 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -66,7 +66,7 @@ public class ${mode}MapWriter extends AbstractFieldWriter { break; case UNION: UnionWriter writer = new UnionWriter(container.addOrGet(child.getName(), MinorType.UNION, UnionVector.class)); - fields.put(child.getName().toLowerCase(), writer); + fields.put(child.getName(), writer); break; <#list vv.types as type><#list type.minor as minor> <#assign lowerName = minor.class?uncap_first /> @@ -102,7 +102,7 @@ public Field getField() { @Override public MapWriter map(String name) { - FieldWriter writer = fields.get(name.toLowerCase()); + FieldWriter writer = fields.get(name); if(writer == null){ int vectorCount=container.size(); NullableMapVector vector = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); @@ -111,7 +111,7 @@ public MapWriter map(String name) { writer.allocate(); } writer.setPosition(idx()); - fields.put(name.toLowerCase(), writer); + fields.put(name, writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -145,7 +145,7 @@ public void clear() { @Override public ListWriter list(String name) { - FieldWriter writer = fields.get(name.toLowerCase()); + FieldWriter writer = fields.get(name); int vectorCount = container.size(); if(writer == null) { writer = new PromotableWriter(container.addOrGet(name, MinorType.LIST, ListVector.class), container); @@ -153,7 +153,7 @@ public ListWriter list(String name) { writer.allocate(); } writer.setPosition(idx()); - fields.put(name.toLowerCase(), writer); + fields.put(name, writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -199,7 +199,7 @@ public void end() { <#if minor.class?starts_with("Decimal") > public ${minor.class}Writer ${lowerName}(String name) { // returns existing writer - final FieldWriter writer = fields.get(name.toLowerCase()); + final FieldWriter writer = fields.get(name); assert writer != null; return writer; } @@ -209,7 +209,7 @@ public void end() { @Override public ${minor.class}Writer ${lowerName}(String name) { - FieldWriter writer = fields.get(name.toLowerCase()); + FieldWriter writer = fields.get(name); if(writer == null) { ValueVector vector; ValueVector currentVector = container.getChild(name); @@ -220,7 +220,7 @@ public void end() { vector.allocateNewSafe(); } writer.setPosition(idx()); - fields.put(name.toLowerCase(), writer); + fields.put(name, writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized diff --git a/java/vector/src/main/codegen/templates/UnionVector.java b/java/vector/src/main/codegen/templates/UnionVector.java index 18acdf4a551..1a6908df2c4 100644 --- a/java/vector/src/main/codegen/templates/UnionVector.java +++ b/java/vector/src/main/codegen/templates/UnionVector.java @@ -136,6 +136,7 @@ public NullableMapVector getMap() { <#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first /> <#assign fields = minor.fields!type.fields /> <#assign uncappedName = name?uncap_first/> + <#assign lowerCaseName = name?lower_case/> <#if !minor.class?starts_with("Decimal")> private Nullable${name}Vector ${uncappedName}Vector; @@ -143,7 +144,7 @@ public NullableMapVector getMap() { public Nullable${name}Vector get${name}Vector() { if (${uncappedName}Vector == null) { int vectorCount = internalMap.size(); - ${uncappedName}Vector = internalMap.addOrGet("${uncappedName}", MinorType.${name?upper_case}, Nullable${name}Vector.class); + ${uncappedName}Vector = internalMap.addOrGet("${lowerCaseName}", MinorType.${name?upper_case}, Nullable${name}Vector.class); if (internalMap.size() > vectorCount) { ${uncappedName}Vector.allocateNew(); if (callBack != null) { diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/AbstractMapVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/AbstractMapVector.java index 23b4997f4f5..f030d166ade 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/AbstractMapVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/AbstractMapVector.java @@ -155,7 +155,7 @@ public ValueVector getChildByOrdinal(int id) { */ @Override public T getChild(String name, Class clazz) { - final ValueVector v = vectors.get(name.toLowerCase()); + final ValueVector v = vectors.get(name); if (v == null) { return null; } @@ -191,7 +191,7 @@ protected void putChild(String name, FieldVector vector) { */ protected void putVector(String name, FieldVector vector) { final ValueVector old = vectors.put( - Preconditions.checkNotNull(name, "field name cannot be null").toLowerCase(), + Preconditions.checkNotNull(name, "field name cannot be null"), Preconditions.checkNotNull(vector, "vector cannot be null") ); if (old != null && old != vector) { @@ -254,7 +254,7 @@ public List getPrimitiveVectors() { */ @Override public VectorWithOrdinal getChildVectorWithOrdinal(String name) { - final int ordinal = vectors.getOrdinal(name.toLowerCase()); + final int ordinal = vectors.getOrdinal(name); if (ordinal < 0) { return null; } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java index caa438aff47..2b62029664e 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java @@ -23,7 +23,9 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; @@ -485,4 +487,25 @@ public void promotableWriterSchema() { Assert.assertTrue(intType.getIsSigned()); Assert.assertEquals(ArrowTypeID.Utf8, field.getChildren().get(1).getType().getTypeID()); } + + @Test + public void mapWriterMixedCaseFieldNames() { + MapVector parent = new MapVector("parent", allocator, null); + ComplexWriter writer = new ComplexWriterImpl("root", parent); + MapWriter rootWriter = writer.rootAsMap(); + rootWriter.bigInt("int_field"); + rootWriter.bigInt("Int_Field"); + rootWriter.float4("float_field"); + rootWriter.float4("Float_Field"); + + List fields = parent.getField().getChildren().get(0).getChildren(); + Set fieldNames = new HashSet<>(); + for (Field field: fields) { + fieldNames.add(field.getName()); + } + Assert.assertTrue(fieldNames.contains("int_field")); + Assert.assertTrue(fieldNames.contains("Int_Field")); + Assert.assertTrue(fieldNames.contains("float_field")); + Assert.assertTrue(fieldNames.contains("Float_Field")); + } } \ No newline at end of file From cba60d126f4a9b6a2b91f4dd3fe1443ad1fd2955 Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Tue, 10 Jan 2017 14:53:58 -0500 Subject: [PATCH 2/6] Add option to MapWriters to configure the case sensitivity (defaulted as case-insensitive) --- .../main/codegen/templates/BaseWriter.java | 1 + .../main/codegen/templates/MapWriters.java | 32 +++++++---- .../complex/impl/ComplexWriterImpl.java | 14 ++++- .../complex/writer/TestComplexWriter.java | 53 ++++++++++++++----- 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/java/vector/src/main/codegen/templates/BaseWriter.java b/java/vector/src/main/codegen/templates/BaseWriter.java index 08bd39eae23..681bd3c2ad2 100644 --- a/java/vector/src/main/codegen/templates/BaseWriter.java +++ b/java/vector/src/main/codegen/templates/BaseWriter.java @@ -90,6 +90,7 @@ public interface ComplexWriter { void clear(); void copyReader(FieldReader reader); MapWriter rootAsMap(); + MapWriter rootAsMap(Boolean caseSensitive); ListWriter rootAsList(); void setPosition(int index); diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 30354d520d1..44795d72135 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -48,14 +48,16 @@ public class ${mode}MapWriter extends AbstractFieldWriter { protected final ${containerClass} container; private final Map fields = Maps.newHashMap(); + private final boolean caseSensitive; - public ${mode}MapWriter(${containerClass} container) { + public ${mode}MapWriter(${containerClass} container, boolean caseSensitive) { <#if mode == "Single"> if (container instanceof NullableMapVector) { throw new IllegalArgumentException("Invalid container: " + container); } this.container = container; + this.caseSensitive = caseSensitive; for (Field child : container.getField().getChildren()) { switch (Types.getMinorTypeForArrowType(child.getType())) { case MAP: @@ -66,7 +68,7 @@ public class ${mode}MapWriter extends AbstractFieldWriter { break; case UNION: UnionWriter writer = new UnionWriter(container.addOrGet(child.getName(), MinorType.UNION, UnionVector.class)); - fields.put(child.getName(), writer); + fields.put(handleCase(child.getName()), writer); break; <#list vv.types as type><#list type.minor as minor> <#assign lowerName = minor.class?uncap_first /> @@ -85,6 +87,18 @@ public class ${mode}MapWriter extends AbstractFieldWriter { } } + public ${mode}MapWriter(${containerClass} container) { + this(container, false); + } + + private String handleCase(final String input) { + return this.caseSensitive? input : input.toLowerCase(); + } + + public boolean getCaseSensitivity() { + return this.caseSensitive; + } + @Override public int getValueCapacity() { return container.getValueCapacity(); @@ -102,7 +116,7 @@ public Field getField() { @Override public MapWriter map(String name) { - FieldWriter writer = fields.get(name); + FieldWriter writer = fields.get(handleCase(name)); if(writer == null){ int vectorCount=container.size(); NullableMapVector vector = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); @@ -111,7 +125,7 @@ public MapWriter map(String name) { writer.allocate(); } writer.setPosition(idx()); - fields.put(name, writer); + fields.put(handleCase(name), writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -145,7 +159,7 @@ public void clear() { @Override public ListWriter list(String name) { - FieldWriter writer = fields.get(name); + FieldWriter writer = fields.get(handleCase(name)); int vectorCount = container.size(); if(writer == null) { writer = new PromotableWriter(container.addOrGet(name, MinorType.LIST, ListVector.class), container); @@ -153,7 +167,7 @@ public ListWriter list(String name) { writer.allocate(); } writer.setPosition(idx()); - fields.put(name, writer); + fields.put(handleCase(name), writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -199,7 +213,7 @@ public void end() { <#if minor.class?starts_with("Decimal") > public ${minor.class}Writer ${lowerName}(String name) { // returns existing writer - final FieldWriter writer = fields.get(name); + final FieldWriter writer = fields.get(handleCase(name)); assert writer != null; return writer; } @@ -209,7 +223,7 @@ public void end() { @Override public ${minor.class}Writer ${lowerName}(String name) { - FieldWriter writer = fields.get(name); + FieldWriter writer = fields.get(handleCase(name)); if(writer == null) { ValueVector vector; ValueVector currentVector = container.getChild(name); @@ -220,7 +234,7 @@ public void end() { vector.allocateNewSafe(); } writer.setPosition(idx()); - fields.put(name, writer); + fields.put(handleCase(name), writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java index 761b1b43c08..0ff3c30eb36 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java @@ -139,17 +139,22 @@ public MapWriter directMap(){ } @Override - public MapWriter rootAsMap() { + public MapWriter rootAsMap(Boolean caseSensitive) { switch(mode){ case INIT: NullableMapVector map = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); - mapRoot = new NullableMapWriter(map); + boolean caseSensitivityPrimitive = caseSensitive == null? false : caseSensitive; + mapRoot = new NullableMapWriter(map, caseSensitivityPrimitive); mapRoot.setPosition(idx()); mode = Mode.MAP; break; case MAP: + if (caseSensitive != null && caseSensitive != mapRoot.getCaseSensitivity()) { + throw new IllegalArgumentException("Writer has been initialized with case sensitivity of \"" + + String.valueOf(mapRoot.getCaseSensitivity()) + "\""); + } break; default: @@ -159,6 +164,11 @@ public MapWriter rootAsMap() { return mapRoot; } + @Override + public MapWriter rootAsMap() { + return rootAsMap(null); + } + @Override public void allocate() { diff --git a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java index 2b62029664e..be1e9415ac9 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java @@ -490,22 +490,47 @@ public void promotableWriterSchema() { @Test public void mapWriterMixedCaseFieldNames() { + // test case-sensitive MapWriter MapVector parent = new MapVector("parent", allocator, null); ComplexWriter writer = new ComplexWriterImpl("root", parent); - MapWriter rootWriter = writer.rootAsMap(); - rootWriter.bigInt("int_field"); - rootWriter.bigInt("Int_Field"); - rootWriter.float4("float_field"); - rootWriter.float4("Float_Field"); - - List fields = parent.getField().getChildren().get(0).getChildren(); - Set fieldNames = new HashSet<>(); - for (Field field: fields) { - fieldNames.add(field.getName()); + MapWriter rootWriterCaseSensitive = writer.rootAsMap(true); + rootWriterCaseSensitive.bigInt("int_field"); + rootWriterCaseSensitive.bigInt("Int_Field"); + rootWriterCaseSensitive.float4("float_field"); + rootWriterCaseSensitive.float4("Float_Field"); + + List fieldsCaseSensitive = parent.getField().getChildren().get(0).getChildren(); + Set fieldNamesCaseSensitive = new HashSet<>(); + for (Field field: fieldsCaseSensitive) { + fieldNamesCaseSensitive.add(field.getName()); + } + Assert.assertEquals(4, fieldNamesCaseSensitive.size()); + Assert.assertTrue(fieldNamesCaseSensitive.contains("int_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("Int_Field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("float_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("Float_Field")); + + try { + writer.rootAsMap(false); + Assert.fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException ignored) {} + + // test case-insensitive MapWriter + ComplexWriter writerCaseInsensitive = new ComplexWriterImpl("rootCaseInsensitive", parent); + MapWriter rootWriterCaseInsensitive = writerCaseInsensitive.rootAsMap(false); + + rootWriterCaseInsensitive.bigInt("int_field"); + rootWriterCaseInsensitive.bigInt("Int_Field"); + rootWriterCaseInsensitive.float4("float_field"); + rootWriterCaseInsensitive.float4("Float_Field"); + + List fieldsCaseInsensitive = parent.getField().getChildren().get(1).getChildren(); + Set fieldNamesCaseInsensitive = new HashSet<>(); + for (Field field: fieldsCaseInsensitive) { + fieldNamesCaseInsensitive.add(field.getName()); } - Assert.assertTrue(fieldNames.contains("int_field")); - Assert.assertTrue(fieldNames.contains("Int_Field")); - Assert.assertTrue(fieldNames.contains("float_field")); - Assert.assertTrue(fieldNames.contains("Float_Field")); + Assert.assertEquals(2, fieldNamesCaseInsensitive.size()); + Assert.assertTrue(fieldNamesCaseInsensitive.contains("int_field")); + Assert.assertTrue(fieldNamesCaseInsensitive.contains("float_field")); } } \ No newline at end of file From d269e2146bc7c05fefd1a3a37ca80c73e87343da Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Thu, 12 Jan 2017 10:27:48 -0500 Subject: [PATCH 3/6] Configure case sensitivity when constructing ComplexWriterImpl --- .../main/codegen/templates/BaseWriter.java | 1 - .../main/codegen/templates/MapWriters.java | 2 +- .../complex/impl/ComplexWriterImpl.java | 23 ++++++++----------- .../complex/writer/TestComplexWriter.java | 13 ++++------- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/java/vector/src/main/codegen/templates/BaseWriter.java b/java/vector/src/main/codegen/templates/BaseWriter.java index 681bd3c2ad2..08bd39eae23 100644 --- a/java/vector/src/main/codegen/templates/BaseWriter.java +++ b/java/vector/src/main/codegen/templates/BaseWriter.java @@ -90,7 +90,6 @@ public interface ComplexWriter { void clear(); void copyReader(FieldReader reader); MapWriter rootAsMap(); - MapWriter rootAsMap(Boolean caseSensitive); ListWriter rootAsList(); void setPosition(int index); diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 44795d72135..862ef5042eb 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -95,7 +95,7 @@ private String handleCase(final String input) { return this.caseSensitive? input : input.toLowerCase(); } - public boolean getCaseSensitivity() { + public boolean isCaseSensitive() { return this.caseSensitive; } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java index 0ff3c30eb36..0d035161275 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java @@ -37,13 +37,19 @@ public class ComplexWriterImpl extends AbstractFieldWriter implements ComplexWri Mode mode = Mode.INIT; private final String name; private final boolean unionEnabled; + private final boolean caseSensitive; private enum Mode { INIT, MAP, LIST }; - public ComplexWriterImpl(String name, MapVector container, boolean unionEnabled){ + public ComplexWriterImpl(String name, MapVector container, boolean unionEnabled, boolean caseSensitive){ this.name = name; this.container = container; this.unionEnabled = unionEnabled; + this.caseSensitive = caseSensitive; + } + + public ComplexWriterImpl(String name, MapVector container, boolean unionEnabled) { + this(name, container, unionEnabled, false); } public ComplexWriterImpl(String name, MapVector container){ @@ -139,22 +145,17 @@ public MapWriter directMap(){ } @Override - public MapWriter rootAsMap(Boolean caseSensitive) { + public MapWriter rootAsMap() { switch(mode){ case INIT: NullableMapVector map = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); - boolean caseSensitivityPrimitive = caseSensitive == null? false : caseSensitive; - mapRoot = new NullableMapWriter(map, caseSensitivityPrimitive); + mapRoot = new NullableMapWriter(map, this.caseSensitive); mapRoot.setPosition(idx()); mode = Mode.MAP; break; case MAP: - if (caseSensitive != null && caseSensitive != mapRoot.getCaseSensitivity()) { - throw new IllegalArgumentException("Writer has been initialized with case sensitivity of \"" + - String.valueOf(mapRoot.getCaseSensitivity()) + "\""); - } break; default: @@ -164,12 +165,6 @@ public MapWriter rootAsMap(Boolean caseSensitive) { return mapRoot; } - @Override - public MapWriter rootAsMap() { - return rootAsMap(null); - } - - @Override public void allocate() { if(mapRoot != null) { diff --git a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java index be1e9415ac9..834543438bb 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java @@ -492,8 +492,8 @@ public void promotableWriterSchema() { public void mapWriterMixedCaseFieldNames() { // test case-sensitive MapWriter MapVector parent = new MapVector("parent", allocator, null); - ComplexWriter writer = new ComplexWriterImpl("root", parent); - MapWriter rootWriterCaseSensitive = writer.rootAsMap(true); + ComplexWriter writer = new ComplexWriterImpl("root", parent, false, true); + MapWriter rootWriterCaseSensitive = writer.rootAsMap(); rootWriterCaseSensitive.bigInt("int_field"); rootWriterCaseSensitive.bigInt("Int_Field"); rootWriterCaseSensitive.float4("float_field"); @@ -510,14 +510,9 @@ public void mapWriterMixedCaseFieldNames() { Assert.assertTrue(fieldNamesCaseSensitive.contains("float_field")); Assert.assertTrue(fieldNamesCaseSensitive.contains("Float_Field")); - try { - writer.rootAsMap(false); - Assert.fail("IllegalArgumentException expected"); - } catch (IllegalArgumentException ignored) {} - // test case-insensitive MapWriter - ComplexWriter writerCaseInsensitive = new ComplexWriterImpl("rootCaseInsensitive", parent); - MapWriter rootWriterCaseInsensitive = writerCaseInsensitive.rootAsMap(false); + ComplexWriter writerCaseInsensitive = new ComplexWriterImpl("rootCaseInsensitive", parent, false, false); + MapWriter rootWriterCaseInsensitive = writerCaseInsensitive.rootAsMap(); rootWriterCaseInsensitive.bigInt("int_field"); rootWriterCaseInsensitive.bigInt("Int_Field"); From 2fe7bcf11e6abd311bcd70d1186830ab50ecd550 Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Tue, 17 Jan 2017 16:06:10 -0500 Subject: [PATCH 4/6] Separate MapWriters with CaseSensitiveMapWriters --- .../templates/CaseSensitiveMapWriters.java | 50 +++++++++++++++++++ .../main/codegen/templates/MapWriters.java | 16 ++---- .../complex/impl/ComplexWriterImpl.java | 2 +- 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java diff --git a/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java b/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java new file mode 100644 index 00000000000..1adfbcddb2a --- /dev/null +++ b/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +<@pp.dropOutputFile /> +<#list ["Nullable", "Single"] as mode> +<@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/${mode}CaseSensitiveMapWriter.java" /> +<#assign index = "idx()"> +<#if mode == "Single"> +<#assign containerClass = "MapVector" /> +<#else> +<#assign containerClass = "NullableMapVector" /> + + +<#include "/@includes/license.ftl" /> + +package org.apache.arrow.vector.complex.impl; + +<#include "/@includes/vv_imports.ftl" /> +/* + * This class is generated using FreeMarker and the ${.template_name} template. + */ +@SuppressWarnings("unused") +public class ${mode}CaseSensitiveMapWriter extends ${mode}MapWriter { + + public ${mode}CaseSensitiveMapWriter(${containerClass} container) { + super(container); + } + + @Override + protected String handleCase(final String input){ + return input; + } + +} + diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 862ef5042eb..05b44568350 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -48,16 +48,14 @@ public class ${mode}MapWriter extends AbstractFieldWriter { protected final ${containerClass} container; private final Map fields = Maps.newHashMap(); - private final boolean caseSensitive; - public ${mode}MapWriter(${containerClass} container, boolean caseSensitive) { + public ${mode}MapWriter(${containerClass} container) { <#if mode == "Single"> if (container instanceof NullableMapVector) { throw new IllegalArgumentException("Invalid container: " + container); } this.container = container; - this.caseSensitive = caseSensitive; for (Field child : container.getField().getChildren()) { switch (Types.getMinorTypeForArrowType(child.getType())) { case MAP: @@ -87,16 +85,8 @@ public class ${mode}MapWriter extends AbstractFieldWriter { } } - public ${mode}MapWriter(${containerClass} container) { - this(container, false); - } - - private String handleCase(final String input) { - return this.caseSensitive? input : input.toLowerCase(); - } - - public boolean isCaseSensitive() { - return this.caseSensitive; + protected String handleCase(final String input) { + return input.toLowerCase(); } @Override diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java index 0d035161275..9e384149604 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java @@ -150,7 +150,7 @@ public MapWriter rootAsMap() { case INIT: NullableMapVector map = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); - mapRoot = new NullableMapWriter(map, this.caseSensitive); + mapRoot = this.caseSensitive? new NullableCaseSensitiveMapWriter(map) : new NullableMapWriter(map); mapRoot.setPosition(idx()); mode = Mode.MAP; break; From 7b28bfc5af833b81486f2ae6812f3f40a080f62c Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Wed, 18 Jan 2017 18:15:01 -0500 Subject: [PATCH 5/6] Pass caseSensitive Attribute down to nested MapWriters --- .../templates/CaseSensitiveMapWriters.java | 6 +- .../main/codegen/templates/MapWriters.java | 23 +++++--- .../codegen/templates/UnionListWriter.java | 6 +- .../main/codegen/templates/UnionWriter.java | 12 +++- .../complex/impl/ComplexWriterImpl.java | 12 ++-- .../impl/NullableMapWriterFactory.java | 42 ++++++++++++++ .../vector/complex/impl/PromotableWriter.java | 31 ++++++++++- .../complex/writer/TestComplexWriter.java | 55 +++++++++++++++---- 8 files changed, 154 insertions(+), 33 deletions(-) create mode 100644 java/vector/src/main/java/org/apache/arrow/vector/complex/impl/NullableMapWriterFactory.java diff --git a/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java b/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java index 1adfbcddb2a..5357f9b8a9d 100644 --- a/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java +++ b/java/vector/src/main/codegen/templates/CaseSensitiveMapWriters.java @@ -36,7 +36,6 @@ */ @SuppressWarnings("unused") public class ${mode}CaseSensitiveMapWriter extends ${mode}MapWriter { - public ${mode}CaseSensitiveMapWriter(${containerClass} container) { super(container); } @@ -46,5 +45,10 @@ protected String handleCase(final String input){ return input; } + @Override + protected NullableMapWriterFactory getNullableMapWriterFactory() { + return NullableMapWriterFactory.getNullableCaseSensitiveMapWriterFactoryInstance(); + } + } diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 05b44568350..5dc1550b245 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -48,7 +48,6 @@ public class ${mode}MapWriter extends AbstractFieldWriter { protected final ${containerClass} container; private final Map fields = Maps.newHashMap(); - public ${mode}MapWriter(${containerClass} container) { <#if mode == "Single"> if (container instanceof NullableMapVector) { @@ -65,7 +64,7 @@ public class ${mode}MapWriter extends AbstractFieldWriter { list(child.getName()); break; case UNION: - UnionWriter writer = new UnionWriter(container.addOrGet(child.getName(), MinorType.UNION, UnionVector.class)); + UnionWriter writer = new UnionWriter(container.addOrGet(child.getName(), MinorType.UNION, UnionVector.class), getNullableMapWriterFactory()); fields.put(handleCase(child.getName()), writer); break; <#list vv.types as type><#list type.minor as minor> @@ -89,6 +88,10 @@ protected String handleCase(final String input) { return input.toLowerCase(); } + protected NullableMapWriterFactory getNullableMapWriterFactory() { + return NullableMapWriterFactory.getNullableMapWriterFactoryInstance(); + } + @Override public int getValueCapacity() { return container.getValueCapacity(); @@ -106,16 +109,17 @@ public Field getField() { @Override public MapWriter map(String name) { - FieldWriter writer = fields.get(handleCase(name)); + String finalName = handleCase(name); + FieldWriter writer = fields.get(finalName); if(writer == null){ int vectorCount=container.size(); NullableMapVector vector = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); - writer = new PromotableWriter(vector, container); + writer = new PromotableWriter(vector, container, getNullableMapWriterFactory()); if(vectorCount != container.size()) { writer.allocate(); } writer.setPosition(idx()); - fields.put(handleCase(name), writer); + fields.put(finalName, writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -149,15 +153,16 @@ public void clear() { @Override public ListWriter list(String name) { - FieldWriter writer = fields.get(handleCase(name)); + String finalName = handleCase(name); + FieldWriter writer = fields.get(handleCase(finalName)); int vectorCount = container.size(); if(writer == null) { - writer = new PromotableWriter(container.addOrGet(name, MinorType.LIST, ListVector.class), container); + writer = new PromotableWriter(container.addOrGet(name, MinorType.LIST, ListVector.class), container, getNullableMapWriterFactory()); if (container.size() > vectorCount) { writer.allocate(); } writer.setPosition(idx()); - fields.put(handleCase(name), writer); + fields.put(finalName, writer); } else { if (writer instanceof PromotableWriter) { // ensure writers are initialized @@ -218,7 +223,7 @@ public void end() { ValueVector vector; ValueVector currentVector = container.getChild(name); ${vectName}Vector v = container.addOrGet(name, MinorType.${upperName}, ${vectName}Vector.class<#if minor.class == "Decimal"> , new int[] {precision, scale}); - writer = new PromotableWriter(v, container); + writer = new PromotableWriter(v, container, getNullableMapWriterFactory()); vector = v; if (currentVector == null || currentVector != vector) { vector.allocateNewSafe(); diff --git a/java/vector/src/main/codegen/templates/UnionListWriter.java b/java/vector/src/main/codegen/templates/UnionListWriter.java index bb39fe8d294..d980830923b 100644 --- a/java/vector/src/main/codegen/templates/UnionListWriter.java +++ b/java/vector/src/main/codegen/templates/UnionListWriter.java @@ -43,8 +43,12 @@ public class UnionListWriter extends AbstractFieldWriter { private int lastIndex = 0; public UnionListWriter(ListVector vector) { + this(vector, NullableMapWriterFactory.getNullableMapWriterFactoryInstance()); + } + + public UnionListWriter(ListVector vector, NullableMapWriterFactory nullableMapWriterFactory) { this.vector = vector; - this.writer = new PromotableWriter(vector.getDataVector(), vector); + this.writer = new PromotableWriter(vector.getDataVector(), vector, nullableMapWriterFactory); this.offsets = vector.getOffsetVector(); } diff --git a/java/vector/src/main/codegen/templates/UnionWriter.java b/java/vector/src/main/codegen/templates/UnionWriter.java index efb66f168f5..880f537c029 100644 --- a/java/vector/src/main/codegen/templates/UnionWriter.java +++ b/java/vector/src/main/codegen/templates/UnionWriter.java @@ -16,6 +16,8 @@ * limitations under the License. */ +import org.apache.arrow.vector.complex.impl.NullableMapWriterFactory; + <@pp.dropOutputFile /> <@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/UnionWriter.java" /> @@ -38,9 +40,15 @@ public class UnionWriter extends AbstractFieldWriter implements FieldWriter { private MapWriter mapWriter; private UnionListWriter listWriter; private List writers = Lists.newArrayList(); + private final NullableMapWriterFactory nullableMapWriterFactory; public UnionWriter(UnionVector vector) { + this(vector, NullableMapWriterFactory.getNullableMapWriterFactoryInstance()); + } + + public UnionWriter(UnionVector vector, NullableMapWriterFactory nullableMapWriterFactory) { data = vector; + this.nullableMapWriterFactory = nullableMapWriterFactory; } @Override @@ -76,7 +84,7 @@ public void endList() { private MapWriter getMapWriter() { if (mapWriter == null) { - mapWriter = new NullableMapWriter(data.getMap()); + mapWriter = nullableMapWriterFactory.build(data.getMap()); mapWriter.setPosition(idx()); writers.add(mapWriter); } @@ -90,7 +98,7 @@ public MapWriter asMap() { private ListWriter getListWriter() { if (listWriter == null) { - listWriter = new UnionListWriter(data.getList()); + listWriter = new UnionListWriter(data.getList(), nullableMapWriterFactory); listWriter.setPosition(idx()); writers.add(listWriter); } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java index 9e384149604..dbdd2050d13 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/ComplexWriterImpl.java @@ -37,7 +37,7 @@ public class ComplexWriterImpl extends AbstractFieldWriter implements ComplexWri Mode mode = Mode.INIT; private final String name; private final boolean unionEnabled; - private final boolean caseSensitive; + private final NullableMapWriterFactory nullableMapWriterFactory; private enum Mode { INIT, MAP, LIST }; @@ -45,7 +45,8 @@ public ComplexWriterImpl(String name, MapVector container, boolean unionEnabled, this.name = name; this.container = container; this.unionEnabled = unionEnabled; - this.caseSensitive = caseSensitive; + nullableMapWriterFactory = caseSensitive? NullableMapWriterFactory.getNullableCaseSensitiveMapWriterFactoryInstance() : + NullableMapWriterFactory.getNullableMapWriterFactoryInstance(); } public ComplexWriterImpl(String name, MapVector container, boolean unionEnabled) { @@ -128,8 +129,7 @@ public MapWriter directMap(){ switch(mode){ case INIT: - NullableMapVector map = (NullableMapVector) container; - mapRoot = new NullableMapWriter(map); + mapRoot = nullableMapWriterFactory.build((NullableMapVector) container); mapRoot.setPosition(idx()); mode = Mode.MAP; break; @@ -150,7 +150,7 @@ public MapWriter rootAsMap() { case INIT: NullableMapVector map = container.addOrGet(name, MinorType.MAP, NullableMapVector.class); - mapRoot = this.caseSensitive? new NullableCaseSensitiveMapWriter(map) : new NullableMapWriter(map); + mapRoot = nullableMapWriterFactory.build(map); mapRoot.setPosition(idx()); mode = Mode.MAP; break; @@ -184,7 +184,7 @@ public ListWriter rootAsList() { if (container.size() > vectorCount) { listVector.allocateNew(); } - listRoot = new UnionListWriter(listVector); + listRoot = new UnionListWriter(listVector, nullableMapWriterFactory); listRoot.setPosition(idx()); mode = Mode.LIST; break; diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/NullableMapWriterFactory.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/NullableMapWriterFactory.java new file mode 100644 index 00000000000..d932cfb3e12 --- /dev/null +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/NullableMapWriterFactory.java @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.arrow.vector.complex.impl; + +import org.apache.arrow.vector.complex.NullableMapVector; + +public class NullableMapWriterFactory { + private final boolean caseSensitive; + private static final NullableMapWriterFactory nullableMapWriterFactory = new NullableMapWriterFactory(false); + private static final NullableMapWriterFactory nullableCaseSensitiveWriterFactory = new NullableMapWriterFactory(true); + + public NullableMapWriterFactory(boolean caseSensitive) { + this.caseSensitive = caseSensitive; + } + + public NullableMapWriter build(NullableMapVector container) { + return this.caseSensitive? new NullableCaseSensitiveMapWriter(container) : new NullableMapWriter(container); + } + + public static NullableMapWriterFactory getNullableMapWriterFactoryInstance() { + return nullableMapWriterFactory; + } + + public static NullableMapWriterFactory getNullableCaseSensitiveMapWriterFactoryInstance() { + return nullableCaseSensitiveWriterFactory; + } +} diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/PromotableWriter.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/PromotableWriter.java index 94ff82c04bd..1f7253bca93 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/PromotableWriter.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/impl/PromotableWriter.java @@ -22,6 +22,7 @@ import org.apache.arrow.vector.ZeroVector; import org.apache.arrow.vector.complex.AbstractMapVector; import org.apache.arrow.vector.complex.ListVector; +import org.apache.arrow.vector.complex.NullableMapVector; import org.apache.arrow.vector.complex.UnionVector; import org.apache.arrow.vector.complex.writer.FieldWriter; import org.apache.arrow.vector.types.Types.MinorType; @@ -38,6 +39,7 @@ public class PromotableWriter extends AbstractPromotableFieldWriter { private final AbstractMapVector parentContainer; private final ListVector listVector; + private final NullableMapWriterFactory nullableMapWriterFactory; private int position; private enum State { @@ -51,14 +53,24 @@ private enum State { private FieldWriter writer; public PromotableWriter(ValueVector v, AbstractMapVector parentContainer) { + this(v, parentContainer, NullableMapWriterFactory.getNullableMapWriterFactoryInstance()); + } + + public PromotableWriter(ValueVector v, AbstractMapVector parentContainer, NullableMapWriterFactory nullableMapWriterFactory) { this.parentContainer = parentContainer; this.listVector = null; + this.nullableMapWriterFactory = nullableMapWriterFactory; init(v); } public PromotableWriter(ValueVector v, ListVector listVector) { + this(v, listVector, NullableMapWriterFactory.getNullableMapWriterFactoryInstance()); + } + + public PromotableWriter(ValueVector v, ListVector listVector, NullableMapWriterFactory nullableMapWriterFactory) { this.listVector = listVector; this.parentContainer = null; + this.nullableMapWriterFactory = nullableMapWriterFactory; init(v); } @@ -66,7 +78,7 @@ private void init(ValueVector v) { if (v instanceof UnionVector) { state = State.UNION; unionVector = (UnionVector) v; - writer = new UnionWriter(unionVector); + writer = new UnionWriter(unionVector, nullableMapWriterFactory); } else if (v instanceof ZeroVector) { state = State.UNTYPED; } else { @@ -78,7 +90,20 @@ private void setWriter(ValueVector v) { state = State.SINGLE; vector = v; type = v.getMinorType(); - writer = type.getNewFieldWriter(vector); + switch (type) { + case MAP: + writer = nullableMapWriterFactory.build((NullableMapVector) vector); + break; + case LIST: + writer = new UnionListWriter((ListVector) vector, nullableMapWriterFactory); + break; + case UNION: + writer = new UnionWriter((UnionVector) vector, nullableMapWriterFactory); + break; + default: + writer = type.getNewFieldWriter(vector); + break; + } } @Override @@ -131,7 +156,7 @@ private FieldWriter promoteToUnion() { unionVector = listVector.promoteToUnion(); } unionVector.addVector((FieldVector)tp.getTo()); - writer = new UnionWriter(unionVector); + writer = new UnionWriter(unionVector, nullableMapWriterFactory); writer.setPosition(idx()); for (int i = 0; i <= idx(); i++) { unionVector.getMutator().setType(i, vector.getMinorType()); diff --git a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java index 834543438bb..2c0c85328bd 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java @@ -488,27 +488,51 @@ public void promotableWriterSchema() { Assert.assertEquals(ArrowTypeID.Utf8, field.getChildren().get(1).getType().getTypeID()); } + private Set getFieldNames(List fields) { + Set fieldNames = new HashSet<>(); + for (Field field: fields) { + fieldNames.add(field.getName()); + if (!field.getChildren().isEmpty()) { + for (String name: getFieldNames(field.getChildren())) { + fieldNames.add(field.getName() + "::" + name); + } + } + } + return fieldNames; + } + @Test public void mapWriterMixedCaseFieldNames() { // test case-sensitive MapWriter MapVector parent = new MapVector("parent", allocator, null); - ComplexWriter writer = new ComplexWriterImpl("root", parent, false, true); + ComplexWriter writer = new ComplexWriterImpl("rootCaseSensitive", parent, false, true); MapWriter rootWriterCaseSensitive = writer.rootAsMap(); rootWriterCaseSensitive.bigInt("int_field"); rootWriterCaseSensitive.bigInt("Int_Field"); rootWriterCaseSensitive.float4("float_field"); rootWriterCaseSensitive.float4("Float_Field"); + MapWriter mapFieldWriterCaseSensitive = rootWriterCaseSensitive.map("map_field"); + mapFieldWriterCaseSensitive.varChar("char_field"); + mapFieldWriterCaseSensitive.varChar("Char_Field"); + ListWriter listFieldWriterCaseSensitive = rootWriterCaseSensitive.list("list_field"); + MapWriter listMapFieldWriterCaseSensitive = listFieldWriterCaseSensitive.map(); + listMapFieldWriterCaseSensitive.bit("bit_field"); + listMapFieldWriterCaseSensitive.bit("Bit_Field"); List fieldsCaseSensitive = parent.getField().getChildren().get(0).getChildren(); - Set fieldNamesCaseSensitive = new HashSet<>(); - for (Field field: fieldsCaseSensitive) { - fieldNamesCaseSensitive.add(field.getName()); - } - Assert.assertEquals(4, fieldNamesCaseSensitive.size()); + Set fieldNamesCaseSensitive = getFieldNames(fieldsCaseSensitive); + Assert.assertEquals(11, fieldNamesCaseSensitive.size()); Assert.assertTrue(fieldNamesCaseSensitive.contains("int_field")); Assert.assertTrue(fieldNamesCaseSensitive.contains("Int_Field")); Assert.assertTrue(fieldNamesCaseSensitive.contains("float_field")); Assert.assertTrue(fieldNamesCaseSensitive.contains("Float_Field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("map_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("map_field::char_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("map_field::Char_Field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field::$data$")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field::$data$::bit_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field::$data$::Bit_Field")); // test case-insensitive MapWriter ComplexWriter writerCaseInsensitive = new ComplexWriterImpl("rootCaseInsensitive", parent, false, false); @@ -518,14 +542,23 @@ public void mapWriterMixedCaseFieldNames() { rootWriterCaseInsensitive.bigInt("Int_Field"); rootWriterCaseInsensitive.float4("float_field"); rootWriterCaseInsensitive.float4("Float_Field"); + MapWriter mapFieldWriterCaseInsensitive = rootWriterCaseInsensitive.map("map_field"); + mapFieldWriterCaseInsensitive.varChar("char_field"); + mapFieldWriterCaseInsensitive.varChar("Char_Field"); + ListWriter listFieldWriterCaseInsensitive = rootWriterCaseInsensitive.list("list_field"); + MapWriter listMapFieldWriterCaseInsensitive = listFieldWriterCaseInsensitive.map(); + listMapFieldWriterCaseInsensitive.bit("bit_field"); + listMapFieldWriterCaseInsensitive.bit("Bit_Field"); List fieldsCaseInsensitive = parent.getField().getChildren().get(1).getChildren(); - Set fieldNamesCaseInsensitive = new HashSet<>(); - for (Field field: fieldsCaseInsensitive) { - fieldNamesCaseInsensitive.add(field.getName()); - } - Assert.assertEquals(2, fieldNamesCaseInsensitive.size()); + Set fieldNamesCaseInsensitive = getFieldNames(fieldsCaseInsensitive); + Assert.assertEquals(7, fieldNamesCaseInsensitive.size()); Assert.assertTrue(fieldNamesCaseInsensitive.contains("int_field")); Assert.assertTrue(fieldNamesCaseInsensitive.contains("float_field")); + Assert.assertTrue(fieldNamesCaseInsensitive.contains("map_field")); + Assert.assertTrue(fieldNamesCaseInsensitive.contains("map_field::char_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field::$data$")); + Assert.assertTrue(fieldNamesCaseSensitive.contains("list_field::$data$::bit_field")); } } \ No newline at end of file From cd081459528621bce84166bc881307df290af25d Mon Sep 17 00:00:00 2001 From: Jingyuan Wang Date: Wed, 18 Jan 2017 21:07:36 -0500 Subject: [PATCH 6/6] Remove unnecessary handleCase() call --- java/vector/src/main/codegen/templates/MapWriters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/vector/src/main/codegen/templates/MapWriters.java b/java/vector/src/main/codegen/templates/MapWriters.java index 5dc1550b245..4af6eee91b6 100644 --- a/java/vector/src/main/codegen/templates/MapWriters.java +++ b/java/vector/src/main/codegen/templates/MapWriters.java @@ -154,7 +154,7 @@ public void clear() { @Override public ListWriter list(String name) { String finalName = handleCase(name); - FieldWriter writer = fields.get(handleCase(finalName)); + FieldWriter writer = fields.get(finalName); int vectorCount = container.size(); if(writer == null) { writer = new PromotableWriter(container.addOrGet(name, MinorType.LIST, ListVector.class), container, getNullableMapWriterFactory());