Skip to content

Commit 25f72df

Browse files
committed
GH-810: added support of ExtensionType for UnionVector
1 parent d31d9b0 commit 25f72df

36 files changed

+317
-138
lines changed

vector/src/main/codegen/includes/vv_imports.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import org.apache.arrow.vector.util.JsonStringArrayList;
4343
import java.util.Arrays;
4444
import java.util.Random;
4545
import java.util.List;
46+
import java.util.HashMap;
47+
import java.util.Map;
4648

4749
import java.io.Closeable;
4850
import java.io.InputStream;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void copyAsField(String name, ${name}Writer writer) {
109109

110110
</#list></#list>
111111

112-
public void copyAsValue(StructWriter writer, ExtensionTypeWriterFactory writerFactory) {
112+
public void copyAsValue(StructWriter writer, ExtensionTypeFactory writerFactory) {
113113
fail("CopyAsValue StructWriter");
114114
}
115115

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@ public void endEntry() {
110110
public void write(ExtensionHolder var1) {
111111
this.fail("ExtensionType");
112112
}
113-
public void writeExtension(Object var1) {
113+
public void writeExtension(Object var1, ExtensionType var2) {
114114
this.fail("ExtensionType");
115115
}
116-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory var1) {
116+
public void addExtensionTypeWriterFactory(ExtensionTypeFactory var1, ExtensionType var2) {
117117
this.fail("ExtensionType");
118118
}
119119

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public interface RepeatedStructReader extends StructReader{
4949
boolean next();
5050
int size();
5151
void copyAsValue(StructWriter writer);
52-
void copyAsValue(StructWriter writer, ExtensionTypeWriterFactory writerFactory);
52+
void copyAsValue(StructWriter writer, ExtensionTypeFactory writerFactory);
5353
}
5454

5555
public interface ListReader extends BaseReader{
@@ -60,7 +60,7 @@ public interface RepeatedListReader extends ListReader{
6060
boolean next();
6161
int size();
6262
void copyAsValue(ListWriter writer);
63-
void copyAsValue(ListWriter writer, ExtensionTypeWriterFactory writerFactory);
63+
void copyAsValue(ListWriter writer, ExtensionTypeFactory writerFactory);
6464
}
6565

6666
public interface MapReader extends BaseReader{
@@ -71,7 +71,7 @@ public interface RepeatedMapReader extends MapReader{
7171
boolean next();
7272
int size();
7373
void copyAsValue(MapWriter writer);
74-
void copyAsValue(MapWriter writer, ExtensionTypeWriterFactory writerFactory);
74+
void copyAsValue(MapWriter writer, ExtensionTypeFactory writerFactory);
7575
}
7676

7777
public interface ScalarReader extends

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ public interface ExtensionWriter extends BaseWriter {
122122
*
123123
* @param value the extension type value to write
124124
*/
125-
void writeExtension(Object value);
125+
void writeExtension(Object value, ExtensionType extensionType);
126126

127127
/**
128128
* Adds the given extension type factory. This factory allows configuring writer implementations for specific ExtensionTypeVector.
129129
*
130130
* @param factory the extension type factory to add
131131
*/
132-
void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory);
132+
void addExtensionTypeWriterFactory(ExtensionTypeFactory factory, ExtensionType extensionType);
133133
}
134134

135135
public interface ScalarWriter extends

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.arrow.vector.complex.reader.FieldReader;
2020
import org.apache.arrow.vector.complex.writer.FieldWriter;
2121
import org.apache.arrow.vector.types.Types;
22+
import org.apache.arrow.vector.types.pojo.ArrowType.ExtensionType;
2223

2324
<@pp.dropOutputFile />
2425
<@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/ComplexCopier.java" />
@@ -45,11 +46,11 @@ public static void copy(FieldReader input, FieldWriter output) {
4546
writeValue(input, output, null);
4647
}
4748

48-
public static void copy(FieldReader input, FieldWriter output, ExtensionTypeWriterFactory extensionTypeWriterFactory) {
49+
public static void copy(FieldReader input, FieldWriter output, ExtensionTypeFactory extensionTypeWriterFactory) {
4950
writeValue(input, output, extensionTypeWriterFactory);
5051
}
5152

52-
private static void writeValue(FieldReader reader, FieldWriter writer, ExtensionTypeWriterFactory extensionTypeWriterFactory) {
53+
private static void writeValue(FieldReader reader, FieldWriter writer, ExtensionTypeFactory extensionTypeWriterFactory) {
5354
final MinorType mt = reader.getMinorType();
5455

5556
switch (mt) {
@@ -120,9 +121,10 @@ private static void writeValue(FieldReader reader, FieldWriter writer, Extension
120121
}
121122
if (reader.isSet()) {
122123
Object value = reader.readObject();
124+
ExtensionType extensionType = (ExtensionType) reader.getField().getType();
123125
if (value != null) {
124-
writer.addExtensionTypeWriterFactory(extensionTypeWriterFactory);
125-
writer.writeExtension(value);
126+
writer.addExtensionTypeWriterFactory(extensionTypeWriterFactory, extensionType);
127+
writer.writeExtension(value, extensionType);
126128
}
127129
} else {
128130
writer.writeNull();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void read(int arrayIndex, Nullable${name}Holder holder){
8686
}
8787
</#list></#list>
8888

89-
public void copyAsValue(StructWriter writer, ExtensionTypeWriterFactory writerFactory){}
89+
public void copyAsValue(StructWriter writer, ExtensionTypeFactory writerFactory){}
9090
public void read(ExtensionHolder holder) {
9191
holder.isSet = 0;
9292
}

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
* limitations under the License.
1616
*/
1717

18-
<@pp.dropOutputFile />
18+
import org.apache.arrow.vector.complex.impl.ExtensionTypeFactory;
19+
import org.apache.arrow.vector.types.pojo.ArrowType.ExtensionType;<@pp.dropOutputFile />
1920
<@pp.changeOutputFile name="/org/apache/arrow/vector/complex/impl/PromotableWriter.java" />
2021

2122
<#include "/@includes/license.ftl" />
@@ -541,17 +542,13 @@ public void writeLargeVarChar(String value) {
541542
}
542543

543544
@Override
544-
public void writeExtension(Object value) {
545-
getWriter(MinorType.EXTENSIONTYPE).writeExtension(value);
545+
public void writeExtension(Object value, ExtensionType extensionType) {
546+
getWriter(MinorType.EXTENSIONTYPE, extensionType).writeExtension(value, extensionType);
546547
}
547548

548549
@Override
549-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory) {
550-
getWriter(MinorType.EXTENSIONTYPE).addExtensionTypeWriterFactory(factory);
551-
}
552-
553-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory, ArrowType arrowType) {
554-
getWriter(MinorType.EXTENSIONTYPE, arrowType).addExtensionTypeWriterFactory(factory);
550+
public void addExtensionTypeWriterFactory(ExtensionTypeFactory var1, ExtensionType var2) {
551+
getWriter(MinorType.EXTENSIONTYPE, var2).addExtensionTypeWriterFactory(var1, var2);
555552
}
556553

557554
@Override

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import org.apache.arrow.memory.ArrowBuf;
19+
import org.apache.arrow.vector.complex.impl.ExtensionTypeFactory;
1920
import org.apache.arrow.vector.complex.writer.Decimal256Writer;
2021
import org.apache.arrow.vector.complex.writer.DecimalWriter;
2122
import org.apache.arrow.vector.holders.Decimal256Holder;
@@ -24,6 +25,7 @@
2425

2526
import java.lang.UnsupportedOperationException;
2627
import java.math.BigDecimal;
28+
import org.apache.arrow.vector.types.pojo.ArrowType.ExtensionType;
2729

2830
<@pp.dropOutputFile />
2931
<#list ["List", "ListView", "LargeList", "LargeListView"] as listName>
@@ -336,14 +338,14 @@ public void writeNull() {
336338
}
337339
338340
@Override
339-
public void writeExtension(Object value) {
340-
writer.writeExtension(value);
341+
public void writeExtension(Object value, ExtensionType extensionType) {
342+
writer.writeExtension(value, extensionType);
341343
writer.setPosition(writer.idx() + 1);
342344
}
343345
344346
@Override
345-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory var1) {
346-
writer.addExtensionTypeWriterFactory(var1, extensionType);
347+
public void addExtensionTypeWriterFactory(ExtensionTypeFactory var1, ExtensionType var2) {
348+
writer.addExtensionTypeWriterFactory(var1, var2);
347349
}
348350
349351
public void write(ExtensionHolder var1) {

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717

1818

19+
import java.util.HashMap;
20+
import java.util.Map;
1921
import org.apache.arrow.vector.types.Types.MinorType;
2022
import org.apache.arrow.vector.types.pojo.Field;
2123

@@ -43,9 +45,12 @@ public class UnionReader extends AbstractFieldReader {
4345

4446
private BaseReader[] readers = new BaseReader[NUM_SUPPORTED_TYPES];
4547
public UnionVector data;
46-
48+
private ExtensionTypeFactory extensionTypeFactory;
49+
private Map<ExtensionType, ExtensionReader> extensionTypeReaders = new HashMap<>();
50+
4751
public UnionReader(UnionVector data) {
4852
this.data = data;
53+
this.extensionTypeFactory = data.getExtensionTypeFactory();
4954
}
5055

5156
public MinorType getMinorType() {
@@ -79,6 +84,10 @@ public void read(int index, UnionHolder holder) {
7984
}
8085

8186
private FieldReader getReaderForIndex(int index) {
87+
return getReaderForIndex(index, null);
88+
}
89+
90+
private FieldReader getReaderForIndex(int index, ExtensionType extensionType) {
8291
int typeValue = data.getTypeValue(index);
8392
FieldReader reader = (FieldReader) readers[typeValue];
8493
if (reader != null) {
@@ -95,6 +104,11 @@ private FieldReader getReaderForIndex(int index) {
95104
return (FieldReader) getListView();
96105
case MAP:
97106
return (FieldReader) getMap();
107+
case EXTENSIONTYPE:
108+
if(extensionType == null) {
109+
throw new IllegalStateException("Cannot read extension type without extensionType");
110+
}
111+
return (FieldReader) getExtension(extensionType);
98112
<#list vv.types as type>
99113
<#list type.minor as minor>
100114
<#assign name = minor.class?cap_first />
@@ -214,6 +228,20 @@ public void copyAsValue(${name}Writer writer){
214228
</#list>
215229
</#list>
216230

231+
public void read(ExtensionHolder holder){
232+
getReaderForIndex(idx(), extensionTypeFactory.getExtensionTypeByHolder(holder)).read(holder);
233+
}
234+
235+
private ExtensionReader getExtension(ExtensionType arrowType) {
236+
ExtensionReader extensionReader = extensionTypeReaders.get(arrowType);
237+
if (extensionReader == null) {
238+
extensionReader = extensionTypeFactory.getReaderImpl(data.getExtensionTypeVector(arrowType));
239+
extensionReader.setPosition(idx());
240+
extensionTypeReaders.put(arrowType, extensionReader);
241+
}
242+
return extensionReader;
243+
}
244+
217245
@Override
218246
public void copyAsValue(ListWriter writer) {
219247
ComplexCopier.copy(this, (FieldWriter) writer);

0 commit comments

Comments
 (0)