(arr arrow.Array)
| 21 | } |
| 22 | |
| 23 | func transformArray(arr arrow.Array) arrow.Array { |
| 24 | if arrow.TypeEqual(arr.DataType(), transformTypeForWriting(arr.DataType())) { |
| 25 | return arr |
| 26 | } |
| 27 | |
| 28 | switch arr := arr.(type) { |
| 29 | case *types.UUIDArray, *types.InetArray, *types.MACArray, *types.JSONArray: |
| 30 | return transformToStringArray(arr) |
| 31 | case *array.Uint8: |
| 32 | return transformUint8ToUint32Array(arr) |
| 33 | case *array.Uint16: |
| 34 | return transformUint16ToUint32Array(arr) |
| 35 | case *array.Timestamp: |
| 36 | // mismatching unit or tz |
| 37 | return transformTimestamp(duckDBToArrow(arrowToDuckDB(arr.DataType())).(*arrow.TimestampType), arr) |
| 38 | case *array.Struct: |
| 39 | return transformStruct(arr) |
| 40 | case *array.Map: |
| 41 | return transformMap(arr) |
| 42 | case array.ListLike: // this includes maps, too |
| 43 | return array.MakeFromData(array.NewData( |
| 44 | transformTypeForWriting(arr.DataType()), arr.Len(), |
| 45 | arr.Data().Buffers(), |
| 46 | []arrow.ArrayData{transformArray(arr.ListValues()).Data()}, |
| 47 | arr.NullN(), |
| 48 | // we use data offset for list like as the `ListValues` can be a larger array (happens when slicing) |
| 49 | arr.Data().Offset(), |
| 50 | )) |
| 51 | case *array.Date32: |
| 52 | return transformDate32ToTimestamp(arr) |
| 53 | case *array.Date64: |
| 54 | return transformDate64ToTimestamp(arr) |
| 55 | case *array.LargeBinary: |
| 56 | bldr := array.NewBinaryBuilder(memory.DefaultAllocator, arrow.BinaryTypes.Binary) |
| 57 | defer bldr.Release() |
| 58 | for i := 0; i < arr.Len(); i++ { |
| 59 | if arr.IsNull(i) { |
| 60 | bldr.AppendNull() |
| 61 | continue |
| 62 | } |
| 63 | val := arr.Value(i) |
| 64 | bldr.Append(val) |
| 65 | } |
| 66 | return bldr.NewBinaryArray() |
| 67 | case *array.LargeString: |
| 68 | bldr := array.NewStringBuilder(memory.DefaultAllocator) |
| 69 | defer bldr.Release() |
| 70 | for i := 0; i < arr.Len(); i++ { |
| 71 | if arr.IsNull(i) { |
| 72 | bldr.AppendNull() |
| 73 | continue |
| 74 | } |
| 75 | val := arr.Value(i) |
| 76 | bldr.Append(val) |
| 77 | } |
| 78 | return bldr.NewStringArray() |
| 79 | default: |
| 80 | return transformToStringArray(arr) |
no test coverage detected