in arrow/internal/arrjson/arrjson.go [658:945]
func arrayFromJSON(mem memory.Allocator, dt arrow.DataType, arr Array) array.Interface {
switch dt := dt.(type) {
case *arrow.NullType:
return array.NewNull(arr.Count)
case *arrow.BooleanType:
bldr := array.NewBooleanBuilder(mem)
defer bldr.Release()
data := boolsFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Int8Type:
bldr := array.NewInt8Builder(mem)
defer bldr.Release()
data := i8FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Int16Type:
bldr := array.NewInt16Builder(mem)
defer bldr.Release()
data := i16FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Int32Type:
bldr := array.NewInt32Builder(mem)
defer bldr.Release()
data := i32FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Int64Type:
bldr := array.NewInt64Builder(mem)
defer bldr.Release()
data := i64FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Uint8Type:
bldr := array.NewUint8Builder(mem)
defer bldr.Release()
data := u8FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Uint16Type:
bldr := array.NewUint16Builder(mem)
defer bldr.Release()
data := u16FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Uint32Type:
bldr := array.NewUint32Builder(mem)
defer bldr.Release()
data := u32FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Uint64Type:
bldr := array.NewUint64Builder(mem)
defer bldr.Release()
data := u64FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Float16Type:
bldr := array.NewFloat16Builder(mem)
defer bldr.Release()
data := f16FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Float32Type:
bldr := array.NewFloat32Builder(mem)
defer bldr.Release()
data := f32FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Float64Type:
bldr := array.NewFloat64Builder(mem)
defer bldr.Release()
data := f64FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.StringType:
bldr := array.NewStringBuilder(mem)
defer bldr.Release()
data := strFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.BinaryType:
bldr := array.NewBinaryBuilder(mem, dt)
defer bldr.Release()
data := bytesFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.ListType:
valids := validsFromJSON(arr.Valids)
elems := arrayFromJSON(mem, dt.Elem(), arr.Children[0])
defer elems.Release()
bitmap := validsToBitmap(valids, mem)
defer bitmap.Release()
nulls := arr.Count - bitutil.CountSetBits(bitmap.Bytes(), 0, arr.Count)
data := array.NewData(dt, arr.Count, []*memory.Buffer{bitmap,
memory.NewBufferBytes(arrow.Int32Traits.CastToBytes(arr.Offset))},
[]*array.Data{elems.Data()}, nulls, 0)
defer data.Release()
return array.NewListData(data)
case *arrow.FixedSizeListType:
valids := validsFromJSON(arr.Valids)
elems := arrayFromJSON(mem, dt.Elem(), arr.Children[0])
defer elems.Release()
bitmap := validsToBitmap(valids, mem)
defer bitmap.Release()
nulls := arr.Count - bitutil.CountSetBits(bitmap.Bytes(), 0, arr.Count)
data := array.NewData(dt, arr.Count, []*memory.Buffer{bitmap}, []*array.Data{elems.Data()}, nulls, 0)
defer data.Release()
return array.NewFixedSizeListData(data)
case *arrow.StructType:
valids := validsFromJSON(arr.Valids)
bitmap := validsToBitmap(valids, mem)
defer bitmap.Release()
nulls := arr.Count - bitutil.CountSetBits(bitmap.Bytes(), 0, arr.Count)
fields := make([]*array.Data, len(dt.Fields()))
for i := range fields {
child := arrayFromJSON(mem, dt.Field(i).Type, arr.Children[i])
defer child.Release()
fields[i] = child.Data()
}
data := array.NewData(dt, arr.Count, []*memory.Buffer{bitmap}, fields, nulls, 0)
defer data.Release()
return array.NewStructData(data)
case *arrow.FixedSizeBinaryType:
bldr := array.NewFixedSizeBinaryBuilder(mem, dt)
defer bldr.Release()
strdata := strFromJSON(arr.Data)
data := make([][]byte, len(strdata))
for i, v := range strdata {
if len(v) != 2*dt.ByteWidth {
panic(xerrors.Errorf("arrjson: invalid hex-string length (got=%d, want=%d)", len(v), 2*dt.ByteWidth))
}
vv, err := hex.DecodeString(v)
if err != nil {
panic(err)
}
data[i] = vv
}
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.MapType:
valids := validsFromJSON(arr.Valids)
elems := arrayFromJSON(mem, dt.ValueType(), arr.Children[0])
defer elems.Release()
bitmap := validsToBitmap(valids, mem)
defer bitmap.Release()
nulls := arr.Count - bitutil.CountSetBits(bitmap.Bytes(), 0, arr.Count)
data := array.NewData(dt, arr.Count, []*memory.Buffer{bitmap,
memory.NewBufferBytes(arrow.Int32Traits.CastToBytes(arr.Offset))},
[]*array.Data{elems.Data()}, nulls, 0)
defer data.Release()
return array.NewMapData(data)
case *arrow.Date32Type:
bldr := array.NewDate32Builder(mem)
defer bldr.Release()
data := date32FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Date64Type:
bldr := array.NewDate64Builder(mem)
defer bldr.Release()
data := date64FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Time32Type:
bldr := array.NewTime32Builder(mem, dt)
defer bldr.Release()
data := time32FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Time64Type:
bldr := array.NewTime64Builder(mem, dt)
defer bldr.Release()
data := time64FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.TimestampType:
bldr := array.NewTimestampBuilder(mem, dt)
defer bldr.Release()
data := timestampFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.MonthIntervalType:
bldr := array.NewMonthIntervalBuilder(mem)
defer bldr.Release()
data := monthintervalFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.DayTimeIntervalType:
bldr := array.NewDayTimeIntervalBuilder(mem)
defer bldr.Release()
data := daytimeintervalFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.MonthDayNanoIntervalType:
bldr := array.NewMonthDayNanoIntervalBuilder(mem)
defer bldr.Release()
data := monthDayNanointervalFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.DurationType:
bldr := array.NewDurationBuilder(mem, dt)
defer bldr.Release()
data := durationFromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case *arrow.Decimal128Type:
bldr := array.NewDecimal128Builder(mem, dt)
defer bldr.Release()
data := decimal128FromJSON(arr.Data)
valids := validsFromJSON(arr.Valids)
bldr.AppendValues(data, valids)
return bldr.NewArray()
case arrow.ExtensionType:
storage := arrayFromJSON(mem, dt.StorageType(), arr)
defer storage.Release()
return array.NewExtensionArrayWithStorage(dt, storage)
default:
panic(xerrors.Errorf("unknown data type %v %T", dt, dt))
}
panic("impossible")
}