(dt arrow.DataType, arr arrow.Array)
| 95 | } |
| 96 | |
| 97 | func reverseTransformArray(dt arrow.DataType, arr arrow.Array) arrow.Array { |
| 98 | if arrow.TypeEqual(dt, arr.DataType()) { |
| 99 | return arr |
| 100 | } |
| 101 | |
| 102 | switch dt := dt.(type) { |
| 103 | case *types.UUIDType: |
| 104 | return array.NewExtensionArrayWithStorage(dt, arr.(*array.FixedSizeBinary)) |
| 105 | case *types.InetType, *types.MACType: |
| 106 | return reverseTransformFromString(dt, arr.(*array.String)) |
| 107 | case *arrow.Uint16Type: |
| 108 | return reverseTransformUint16(arr.(*array.Uint32)) |
| 109 | case *arrow.Uint8Type: |
| 110 | return reverseTransformUint8(arr.(*array.Uint32)) |
| 111 | case *arrow.TimestampType: |
| 112 | return transformTimestamp(dt, arr.(*array.Timestamp)) |
| 113 | case *arrow.Date32Type: |
| 114 | // We save date types as Timestamp |
| 115 | return reverseTransformDate32(arr.(*array.Timestamp)) |
| 116 | case *arrow.Date64Type: |
| 117 | // We save date types as Timestamp |
| 118 | return reverseTransformDate64(arr.(*array.Timestamp)) |
| 119 | case *arrow.StructType: |
| 120 | if sarr, ok := arr.(*array.Binary); ok { |
| 121 | return reverseTransformStruct(dt, sarr) |
| 122 | } |
| 123 | |
| 124 | arr := arr.(*array.Struct) |
| 125 | children := make([]arrow.ArrayData, arr.NumField()) |
| 126 | for i := range children { |
| 127 | // struct fields can be odd when read from parquet, but the data is intact |
| 128 | child := array.MakeFromData(arr.Data().Children()[i]) |
| 129 | children[i] = reverseTransformArray(dt.Field(i).Type, child).Data() |
| 130 | } |
| 131 | |
| 132 | return array.NewStructData(array.NewData( |
| 133 | dt, arr.Len(), |
| 134 | arr.Data().Buffers(), |
| 135 | children, |
| 136 | arr.NullN(), |
| 137 | 0, // we use 0 as offset for struct arrays, as the child arrays would already be sliced properly |
| 138 | )) |
| 139 | case arrow.ListLikeType: // also handles maps |
| 140 | // Key list columns are stored as varchar, so they come back as strings. |
| 141 | if sarr, ok := arr.(*array.String); ok { |
| 142 | return reverseTransformFromString(dt, sarr) |
| 143 | } |
| 144 | if mapdt, ok := dt.(*arrow.MapType); ok { |
| 145 | if sarr, ok := arr.(*array.Binary); ok { |
| 146 | return reverseTransformMap(mapdt, sarr) |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | return array.MakeFromData(array.NewData( |
| 151 | dt, arr.Len(), |
| 152 | arr.Data().Buffers(), |
| 153 | []arrow.ArrayData{reverseTransformArray(dt.Elem(), arr.(array.ListLike).ListValues()).Data()}, |
| 154 | arr.NullN(), |
no test coverage detected