prochac commented on code in PR #830:
URL: https://github.com/apache/arrow-go/pull/830#discussion_r3451524035
##########
arrow/avro/reader_types.go:
##########
@@ -574,126 +539,108 @@ func mapFieldBuilders(b array.Builder, field
arrow.Field, parent *fieldPos) {
}
case *array.Time32Builder:
f.appendFunc = func(data interface{}) error {
- appendTime32Data(bt, data)
- return nil
+ return appendTime32Data(bt, data)
}
case *array.Time64Builder:
f.appendFunc = func(data interface{}) error {
- appendTime64Data(bt, data)
- return nil
+ return appendTime64Data(bt, data)
}
case *array.TimestampBuilder:
f.appendFunc = func(data interface{}) error {
- appendTimestampData(bt, data)
- return nil
+ return appendTimestampData(bt, data)
}
}
}
-func appendBinaryData(b *array.BinaryBuilder, data interface{}) {
+// appendUUIDData accepts the two shapes a UUID may arrive as: a [16]byte
+// (fixed(16)+uuid) or a hex-dash string (string+uuid). Other byte lengths
+// are rejected rather than re-interpreted.
+func appendUUIDData(b *extensions.UUIDBuilder, data any, fieldName string)
error {
switch dt := data.(type) {
case nil:
b.AppendNull()
- case map[string]any:
- switch ct := dt["bytes"].(type) {
- case nil:
- b.AppendNull()
+ case string:
+ return b.AppendValueFromString(dt)
+ case [16]byte:
+ b.AppendBytes(dt)
+ case []byte:
+ switch len(dt) {
+ case 16:
+ b.AppendBytes([16]byte(dt))
+ case 36:
+ return b.AppendValueFromString(string(dt))
default:
- b.Append(ct.([]byte))
+ return fmt.Errorf("avro: %d-byte value cannot be a UUID
for column %q", len(dt), fieldName)
}
default:
- b.Append(fmt.Append([]byte{}, data))
+ return fmt.Errorf("avro: unsupported value of type %T for UUID
column %q", data, fieldName)
}
+ return nil
}
-func appendBinaryDictData(b *array.BinaryDictionaryBuilder, data interface{}) {
+func appendBinaryData(b *array.BinaryBuilder, data interface{}) error {
+ switch dt := data.(type) {
+ case nil:
+ b.AppendNull()
+ case []byte:
+ b.Append(dt)
+ default:
+ return fmt.Errorf("avro: unsupported value of type %T for
Binary column", data)
+ }
+ return nil
+}
+
+func appendBinaryDictData(b *array.BinaryDictionaryBuilder, data interface{})
error {
switch dt := data.(type) {
case nil:
b.AppendNull()
case string:
- b.AppendString(dt)
- case map[string]any:
- switch v := dt["string"].(type) {
- case nil:
- b.AppendNull()
- case string:
- b.AppendString(v)
+ if err := b.AppendString(dt); err != nil {
+ return fmt.Errorf("avro: enum symbol %q is not in the
dictionary (schema/data mismatch?): %w", dt, err)
}
+ default:
+ return fmt.Errorf("avro: unsupported value of type %T for
Dictionary column", data)
}
+ return nil
}
-func appendBoolData(b *array.BooleanBuilder, data interface{}) {
+func appendBoolData(b *array.BooleanBuilder, data interface{}) error {
switch dt := data.(type) {
case nil:
b.AppendNull()
case bool:
b.Append(dt)
- case map[string]any:
- switch v := dt["boolean"].(type) {
- case nil:
- b.AppendNull()
- case bool:
- b.Append(v)
- }
+ default:
+ return fmt.Errorf("avro: unsupported value of type %T for
Boolean column", data)
}
+ return nil
}
-func appendDate32Data(b *array.Date32Builder, data interface{}) {
+func appendDate32Data(b *array.Date32Builder, data interface{}) error {
switch dt := data.(type) {
case nil:
b.AppendNull()
- case int32:
- b.Append(arrow.Date32(dt))
- case map[string]any:
- switch v := dt["int"].(type) {
- case nil:
- b.AppendNull()
- case int32:
- b.Append(arrow.Date32(v))
- }
case time.Time:
b.Append(arrow.Date32FromTime(dt))
+ default:
+ return fmt.Errorf("avro: unsupported value of type %T for
Date32 column", data)
}
+ return nil
}
func appendDecimal128Data(b *array.Decimal128Builder, data interface{}, typ
arrow.DecimalType) error {
switch dt := data.(type) {
case nil:
b.AppendNull()
- case []byte:
- buf := bytes.NewBuffer(dt)
- if len(dt) <= 38 {
- var intData int64
- err := binary.Read(buf, binary.BigEndian, &intData)
- if err != nil {
- return err
- }
- b.Append(decimal128.FromI64(intData))
- } else {
- var bigIntData big.Int
-
b.Append(decimal128.FromBigInt(bigIntData.SetBytes(buf.Bytes())))
- }
- case map[string]any:
Review Comment:
This was possible only if they used the global type registry. The
`map[string]any` shouldn't affect people who were using only the arrow-go API.
But those who used https://pkg.go.dev/github.com/hamba/avro/v2#Register ...
There is no good way to handle that :/
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]