@@ -19,6 +19,7 @@ import org.apache.arrow.vector.DateMilliVector
1919import org.apache.arrow.vector.Decimal256Vector
2020import org.apache.arrow.vector.DecimalVector
2121import org.apache.arrow.vector.DurationVector
22+ import org.apache.arrow.vector.FieldVector
2223import org.apache.arrow.vector.Float4Vector
2324import org.apache.arrow.vector.Float8Vector
2425import org.apache.arrow.vector.IntVector
@@ -293,10 +294,16 @@ private fun List<Nothing?>.withTypeNullable(
293294 return this to nothingType(nullable)
294295}
295296
296- private fun readField (root : VectorSchemaRoot , field : Field , nullability : NullabilityOptions ): AnyBaseCol {
297+ private fun readField (vector : FieldVector , field : Field , nullability : NullabilityOptions ): AnyBaseCol {
297298 try {
298- val range = 0 until root.rowCount
299- val (list, type) = when (val vector = root.getVector(field)) {
299+ val range = 0 until vector.valueCount
300+ if (vector is StructVector ) {
301+ val columns = field.children.map { childField ->
302+ readField(vector.getChild(childField.name), childField, nullability)
303+ }
304+ return DataColumn .createColumnGroup(field.name, columns.toDataFrame())
305+ }
306+ val (list, type) = when (vector) {
300307 is VarCharVector -> vector.values(range).withTypeNullable(field.isNullable, nullability)
301308
302309 is LargeVarCharVector -> vector.values(range).withTypeNullable(field.isNullable, nullability)
@@ -357,8 +364,6 @@ private fun readField(root: VectorSchemaRoot, field: Field, nullability: Nullabi
357364
358365 is TimeStampSecVector -> vector.values(range).withTypeNullable(field.isNullable, nullability)
359366
360- is StructVector -> vector.values(range).withTypeNullable(field.isNullable, nullability)
361-
362367 is NullVector -> vector.values(range).withTypeNullable(field.isNullable, nullability)
363368
364369 else -> {
@@ -371,6 +376,9 @@ private fun readField(root: VectorSchemaRoot, field: Field, nullability: Nullabi
371376 }
372377}
373378
379+ private fun readField (root : VectorSchemaRoot , field : Field , nullability : NullabilityOptions ): AnyBaseCol =
380+ readField(root.getVector(field), field, nullability)
381+
374382/* *
375383 * Read [Arrow interprocess streaming format](https://arrow.apache.org/docs/java/ipc.html#writing-and-reading-streaming-format) data from existing [channel]
376384 */
0 commit comments