Skip to content

Commit caa843b

Browse files
committed
ARROW-333: Make writers update their internal schema even when no data is written
Make PromotableWriter predefine writers when asked Author: Julien Le Dem <julien@dremio.com> Closes #170 from julienledem/promotable_writer_preset and squashes the following commits: 972eb9c [Julien Le Dem] ARROW-333: Make writers update their internal schema even when no data is written Make PromotableWriter predefine writers when asked
1 parent 994aa5a commit caa843b

4 files changed

Lines changed: 76 additions & 9 deletions

File tree

java/vector/src/main/codegen/templates/MapWriters.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ public MapWriter map(String name) {
112112
}
113113
writer.setPosition(idx());
114114
fields.put(name.toLowerCase(), writer);
115+
} else {
116+
if (writer instanceof PromotableWriter) {
117+
// ensure writers are initialized
118+
((PromotableWriter)writer).getWriter(MinorType.MAP);
119+
}
115120
}
116121
return writer;
117122
}
@@ -149,6 +154,11 @@ public ListWriter list(String name) {
149154
}
150155
writer.setPosition(idx());
151156
fields.put(name.toLowerCase(), writer);
157+
} else {
158+
if (writer instanceof PromotableWriter) {
159+
// ensure writers are initialized
160+
((PromotableWriter)writer).getWriter(MinorType.LIST);
161+
}
152162
}
153163
return writer;
154164
}
@@ -210,6 +220,11 @@ public void end() {
210220
}
211221
writer.setPosition(idx());
212222
fields.put(name.toLowerCase(), writer);
223+
} else {
224+
if (writer instanceof PromotableWriter) {
225+
// ensure writers are initialized
226+
((PromotableWriter)writer).getWriter(MinorType.${upperName});
227+
}
213228
}
214229
return writer;
215230
}

java/vector/src/main/codegen/templates/UnionWriter.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
package org.apache.arrow.vector.complex.impl;
2626

2727
<#include "/@includes/vv_imports.ftl" />
28+
import org.apache.arrow.vector.complex.writer.BaseWriter;
29+
import org.apache.arrow.vector.types.Types.MinorType;
2830

2931
/*
3032
* This class is generated using freemarker and the ${.template_name} template.
@@ -100,6 +102,28 @@ public ListWriter asList() {
100102
return getListWriter();
101103
}
102104

105+
BaseWriter getWriter(MinorType minorType) {
106+
switch (minorType) {
107+
case MAP:
108+
return getMapWriter();
109+
case LIST:
110+
return getListWriter();
111+
<#list vv.types as type>
112+
<#list type.minor as minor>
113+
<#assign name = minor.class?cap_first />
114+
<#assign fields = minor.fields!type.fields />
115+
<#assign uncappedName = name?uncap_first/>
116+
<#if !minor.class?starts_with("Decimal")>
117+
case ${name?upper_case}:
118+
return get${name}Writer();
119+
</#if>
120+
</#list>
121+
</#list>
122+
default:
123+
throw new UnsupportedOperationException("Unknown type: " + minorType);
124+
}
125+
}
126+
103127
<#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first />
104128
<#assign fields = minor.fields!type.fields />
105129
<#assign uncappedName = name?uncap_first/>

java/vector/src/main/java/org/apache/arrow/vector/complex/impl/PromotableWriter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,19 @@ public void setPosition(int index) {
9494

9595
protected FieldWriter getWriter(MinorType type) {
9696
if (state == State.UNION) {
97-
return writer;
98-
}
99-
if (state == State.UNTYPED) {
97+
((UnionWriter)writer).getWriter(type);
98+
} else if (state == State.UNTYPED) {
10099
if (type == null) {
100+
// ???
101101
return null;
102102
}
103103
ValueVector v = listVector.addOrGetVector(type).getVector();
104104
v.allocateNew();
105105
setWriter(v);
106106
writer.setPosition(position);
107-
}
108-
if (type != this.type) {
109-
return promoteToUnion();
107+
} else if (type != this.type) {
108+
promoteToUnion();
109+
((UnionWriter)writer).getWriter(type);
110110
}
111111
return writer;
112112
}
@@ -133,7 +133,7 @@ private FieldWriter promoteToUnion() {
133133
unionVector.addVector((FieldVector)tp.getTo());
134134
writer = new UnionWriter(unionVector);
135135
writer.setPosition(idx());
136-
for (int i = 0; i < idx(); i++) {
136+
for (int i = 0; i <= idx(); i++) {
137137
unionVector.getMutator().setType(i, vector.getMinorType());
138138
}
139139
vector = null;

java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.arrow.vector.types.pojo.ArrowType.Union;
4646
import org.apache.arrow.vector.types.pojo.ArrowType.Utf8;
4747
import org.apache.arrow.vector.types.pojo.Field;
48+
import org.apache.arrow.vector.util.Text;
4849
import org.junit.Assert;
4950
import org.junit.Test;
5051

@@ -362,11 +363,38 @@ public void promotableWriter() {
362363
MapReader rootReader = new SingleMapReaderImpl(parent).reader("root");
363364
for (int i = 0; i < 100; i++) {
364365
rootReader.setPosition(i);
365-
Assert.assertEquals(i, rootReader.reader("a").readLong().intValue());
366+
FieldReader reader = rootReader.reader("a");
367+
Long value = reader.readLong();
368+
Assert.assertNotNull("index: " + i, value);
369+
Assert.assertEquals(i, value.intValue());
366370
}
367371
for (int i = 100; i < 200; i++) {
368372
rootReader.setPosition(i);
369-
Assert.assertEquals(Integer.toString(i), rootReader.reader("a").readText().toString());
373+
FieldReader reader = rootReader.reader("a");
374+
Text value = reader.readText();
375+
Assert.assertEquals(Integer.toString(i), value.toString());
370376
}
371377
}
378+
379+
/**
380+
* Even without writing to the writer, the union schema is created correctly
381+
*/
382+
@Test
383+
public void promotableWriterSchema() {
384+
MapVector parent = new MapVector("parent", allocator, null);
385+
ComplexWriter writer = new ComplexWriterImpl("root", parent);
386+
MapWriter rootWriter = writer.rootAsMap();
387+
BigIntWriter bigIntWriter = rootWriter.bigInt("a");
388+
VarCharWriter varCharWriter = rootWriter.varChar("a");
389+
390+
Field field = parent.getField().getChildren().get(0).getChildren().get(0);
391+
Assert.assertEquals("a", field.getName());
392+
Assert.assertEquals(Union.TYPE_TYPE, field.getType().getTypeType());
393+
394+
Assert.assertEquals(Int.TYPE_TYPE, field.getChildren().get(0).getType().getTypeType());
395+
Int intType = (Int) field.getChildren().get(0).getType();
396+
Assert.assertEquals(64, intType.getBitWidth());
397+
Assert.assertTrue(intType.getIsSigned());
398+
Assert.assertEquals(Utf8.TYPE_TYPE, field.getChildren().get(1).getType().getTypeType());
399+
}
372400
}

0 commit comments

Comments
 (0)