1616 */
1717
1818
19+ import java .util .HashMap ;
20+ import java .util .Map ;
1921import org .apache .arrow .vector .types .Types .MinorType ;
2022import 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