Skip to content

Commit df38f9a

Browse files
committed
Refactor extension type factory
1 parent ddfca39 commit df38f9a

30 files changed

+233
-170
lines changed

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,6 @@ public int size() {
140140
return -1;
141141
}
142142

143-
@Override
144-
public ExtensionTypeWriterFactory getExtensionTypeWriterFactory() {
145-
throw new IllegalStateException("The current reader doesn't support reading extension type");
146-
}
147-
148143
private void fail(String name) {
149144
throw new IllegalArgumentException(String.format("You tried to read a [%s] type when you are using a field reader of type [%s].", name, this.getClass().getSimpleName()));
150145
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,14 @@ public void endEntry() {
107107
throw new IllegalStateException(String.format("You tried to end a map entry when you are using a ValueWriter of type %s.", this.getClass().getSimpleName()));
108108
}
109109

110+
@Override
110111
public void write(ExtensionHolder var1) {
111112
this.fail("ExtensionType");
112113
}
114+
@Override
113115
public void writeExtension(Object var1) {
114116
this.fail("ExtensionType");
115117
}
116-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory var1) {
117-
this.fail("ExtensionType");
118-
}
119118

120119
<#list vv.types as type><#list type.minor as minor><#assign name = minor.class?cap_first />
121120
<#assign fields = minor.fields!type.fields />

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727

2828
import org.apache.arrow.flatbuf.Type;
2929
import org.apache.arrow.memory.BufferAllocator;
30+
import org.apache.arrow.vector.complex.writer.FieldWriter;
3031
import org.apache.arrow.vector.types.*;
3132
import org.apache.arrow.vector.FieldVector;
33+
import org.apache.arrow.vector.ValueVector;
3234

3335
import com.fasterxml.jackson.annotation.JsonCreator;
3436
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -331,6 +333,8 @@ public boolean equals(Object obj) {
331333
public <T> T accept(ArrowTypeVisitor<T> visitor) {
332334
return visitor.visit(this);
333335
}
336+
337+
public abstract FieldWriter getNewFieldWriter(ValueVector vector);
334338
}
335339

336340
private static final int defaultDecimalBitWidth = 128;

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,6 @@ public interface ExtensionWriter extends BaseWriter {
123123
* @param value the extension type value to write
124124
*/
125125
void writeExtension(Object value);
126-
127-
/**
128-
* Adds the given extension type factory. This factory allows configuring writer implementations for specific ExtensionTypeVector.
129-
*
130-
* @param factory the extension type factory to add
131-
*/
132-
void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory);
133126
}
134127

135128
public interface ScalarWriter extends

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,6 @@ public static void copy(FieldReader reader, FieldWriter writer) {
111111
if (reader.isSet()) {
112112
Object value = reader.readObject();
113113
if (value != null) {
114-
ExtensionTypeWriterFactory writerFactory = reader.getExtensionTypeWriterFactory();
115-
writer.addExtensionTypeWriterFactory(writerFactory);
116114
writer.writeExtension(value);
117115
}
118116
} else {

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

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

89-
public void copyAsValue(StructWriter writer, ExtensionTypeWriterFactory writerFactory){}
9089
public void read(ExtensionHolder holder) {
9190
holder.isSet = 0;
9291
}

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ protected void setWriter(ValueVector v) {
286286
writer = new UnionWriter((UnionVector) vector, nullableStructWriterFactory);
287287
break;
288288
case EXTENSIONTYPE:
289-
writer = new UnionExtensionWriter((ExtensionTypeVector) vector);
289+
writer = ((ExtensionType) vector.getField().getType()).getNewFieldWriter(vector);
290290
break;
291291
default:
292292
writer = type.getNewFieldWriter(vector);
@@ -325,6 +325,9 @@ protected boolean requiresArrowType(MinorType type) {
325325

326326
@Override
327327
protected FieldWriter getWriter(MinorType type, ArrowType arrowType) {
328+
if(type == MinorType.EXTENSIONTYPE) {
329+
lastExtensionType = arrowType;
330+
}
328331
if (state == State.UNION) {
329332
if (requiresArrowType(type)) {
330333
((UnionWriter) writer).getWriter(type, arrowType);
@@ -540,18 +543,25 @@ public void writeLargeVarChar(String value) {
540543
getWriter(MinorType.LARGEVARCHAR).writeLargeVarChar(value);
541544
}
542545

546+
protected ArrowType lastExtensionType;
547+
543548
@Override
544549
public void writeExtension(Object value) {
545-
getWriter(MinorType.EXTENSIONTYPE).writeExtension(value);
550+
FieldWriter writer = getWriter(MinorType.EXTENSIONTYPE, lastExtensionType);
551+
if(writer instanceof UnionWriter) {
552+
((UnionWriter) writer).writeExtension(value, lastExtensionType);
553+
} else {
554+
writer.writeExtension(value);
555+
}
546556
}
547557

548-
@Override
549-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory) {
550-
getWriter(MinorType.EXTENSIONTYPE).addExtensionTypeWriterFactory(factory);
558+
public void writeExtension(Object value, ArrowType arrowType) {
559+
getWriter(MinorType.EXTENSIONTYPE, arrowType).writeExtension(value);
551560
}
552561

553-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory factory, ArrowType arrowType) {
554-
getWriter(MinorType.EXTENSIONTYPE, arrowType).addExtensionTypeWriterFactory(factory);
562+
@Override
563+
public void write(ExtensionHolder holder) {
564+
getWriter(MinorType.EXTENSIONTYPE, lastExtensionType).write(holder);
555565
}
556566

557567
@Override

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,13 @@ public MapWriter map(String name, boolean keysSorted) {
204204
205205
@Override
206206
public ExtensionWriter extension(ArrowType arrowType) {
207-
this.extensionType = arrowType;
207+
extensionType = arrowType;
208208
return this;
209209
}
210+
210211
@Override
211212
public ExtensionWriter extension(String name, ArrowType arrowType) {
212-
ExtensionWriter extensionWriter = writer.extension(name, arrowType);
213-
return extensionWriter;
213+
return writer.extension(name, arrowType);
214214
}
215215
216216
<#if listName == "LargeList">
@@ -337,15 +337,10 @@ public void writeNull() {
337337
338338
@Override
339339
public void writeExtension(Object value) {
340-
writer.writeExtension(value);
340+
writer.writeExtension(value, extensionType);
341341
writer.setPosition(writer.idx() + 1);
342342
}
343343
344-
@Override
345-
public void addExtensionTypeWriterFactory(ExtensionTypeWriterFactory var1) {
346-
writer.addExtensionTypeWriterFactory(var1, extensionType);
347-
}
348-
349344
public void write(ExtensionHolder var1) {
350345
writer.write(var1);
351346
writer.setPosition(writer.idx() + 1);

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ public void read(int index, UnionHolder holder) {
7979
}
8080

8181
private FieldReader getReaderForIndex(int index) {
82+
return getReaderForIndex(index, null);
83+
}
84+
85+
private FieldReader getReaderForIndex(int index, ArrowType type) {
8286
int typeValue = data.getTypeValue(index);
8387
FieldReader reader = (FieldReader) readers[typeValue];
8488
if (reader != null) {
@@ -105,11 +109,26 @@ private FieldReader getReaderForIndex(int index) {
105109
</#if>
106110
</#list>
107111
</#list>
112+
case EXTENSIONTYPE:
113+
if(type == null) {
114+
throw new RuntimeException("Cannot get Extension reader without an ArrowType");
115+
}
116+
return (FieldReader) getExtension(type);
108117
default:
109118
throw new UnsupportedOperationException("Unsupported type: " + MinorType.values()[typeValue]);
110119
}
111120
}
112121

122+
private ExtensionReader extensionReader;
123+
124+
private ExtensionReader getExtension(ArrowType type) {
125+
if (extensionReader == null) {
126+
extensionReader = data.getExtension(type).getReader();
127+
extensionReader.setPosition(idx());
128+
}
129+
return extensionReader;
130+
}
131+
113132
private SingleStructReaderImpl structReader;
114133

115134
private StructReader getStruct() {
@@ -240,4 +259,8 @@ public FieldReader reader() {
240259
public boolean next() {
241260
return getReaderForIndex(idx()).next();
242261
}
262+
263+
public void read(ExtensionHolder holder){
264+
getReaderForIndex(idx(), holder.type()).read(holder);
265+
}
243266
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,22 @@ public MapVector getMap(String name, ArrowType arrowType) {
379379
return mapVector;
380380
}
381381
382+
private ExtensionTypeVector extensionVector;
383+
384+
public ExtensionTypeVector getExtension(ArrowType arrowType) {
385+
if (extensionVector == null) {
386+
int vectorCount = internalStruct.size();
387+
extensionVector = addOrGet(null, MinorType.EXTENSIONTYPE, arrowType, ExtensionTypeVector.class);
388+
if (internalStruct.size() > vectorCount) {
389+
extensionVector.allocateNew();
390+
if (callBack != null) {
391+
callBack.doWork();
392+
}
393+
}
394+
}
395+
return extensionVector;
396+
}
397+
382398
public int getTypeValue(int index) {
383399
return typeBuffer.getByte(index * TYPE_WIDTH);
384400
}
@@ -725,6 +741,8 @@ public ValueVector getVectorByType(int typeId, ArrowType arrowType) {
725741
return getListView();
726742
case MAP:
727743
return getMap(name, arrowType);
744+
case EXTENSIONTYPE:
745+
return getExtension(arrowType);
728746
default:
729747
throw new UnsupportedOperationException("Cannot support type: " + MinorType.values()[typeId]);
730748
}

0 commit comments

Comments
 (0)