Skip to content

Commit

Permalink
patched complex type marshaling
Browse files Browse the repository at this point in the history
  • Loading branch information
adranwit committed Nov 20, 2024
1 parent ad663cb commit d718d1b
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 617 deletions.
2 changes: 1 addition & 1 deletion dsn.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type Config struct {
url.Values
}

//hasCred returns ture if config has credential configured
// hasCred returns ture if config has credential configured
func (c *Config) hasCred() bool {
return c.CredID != "" || len(c.CredentialJSON) > 0 || c.CredentialsURL != "" || c.CredentialsFile != ""
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/viant/bigquery

go 1.17
go 1.18

require (
github.com/francoispqt/gojay v1.2.13
Expand Down
20 changes: 11 additions & 9 deletions internal/schema/decoder/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,53 @@ import (
"reflect"
)

//Decoder represents value decoder
// Decoder represents value decoder
type Decoder struct {
values []interface{}
newUnmarshalers []newUnmarshaler
unmarshalers []Unmarshaler
}

//SetValues sets values pointer
// SetValues sets values pointer
func (d *Decoder) SetValues(values []interface{}) {

d.values = values
}

//UnmarshalJSONObject unmarshal json object
// UnmarshalJSONObject unmarshal json object
func (d *Decoder) UnmarshalJSONObject(dec *gojay.Decoder, _ string) error {
return dec.Array(d)
}

//NKeys returns expcted max keys for the decoder
// NKeys returns expcted max keys for the decoder
func (d *Decoder) NKeys() int {
return 1
}

//Set sets value
// Set sets value
func (d *Decoder) Set(values []interface{}) {
d.values = values
}

//UnmarshalJSONArray unmarshal JSON array
// UnmarshalJSONArray unmarshal JSON array
func (d *Decoder) UnmarshalJSONArray(dec *gojay.Decoder) error {
for i := range d.values {

ptr := d.values[i]
if d.unmarshalers[i] == nil {
d.unmarshalers[i] = d.newUnmarshalers[i](ptr)
} else {
d.unmarshalers[i].set(ptr)
}
unmarhsler := d.unmarshalers[i]
if err := dec.Object(unmarhsler); err != nil {
unmarhsaler := d.unmarshalers[i]
if err := dec.Object(unmarhsaler); err != nil {
return err
}
}
return nil
}

//New creates a new decoder
// New creates a new decoder
func New(types []reflect.Type, schema *bigquery.TableSchema) (func(values []interface{}) *Decoder, error) {
var newUnmarshalersFn []newUnmarshaler
for i := range types {
Expand Down
37 changes: 21 additions & 16 deletions internal/schema/decoder/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,27 @@ import (
"unsafe"
)

//record represents record unmarshaler
// record represents record unmarshaler
type record struct {
name string
rawPtr interface{}
ptr unsafe.Pointer
fields []*xunsafe.Field
unmarshaler []Unmarshaler
newUnmarshalers []newUnmarshaler
index int
}

//UnmarshalJSONArray unmarshal JSON array
// UnmarshalJSONArray unmarshal JSON array
func (o *record) UnmarshalJSONArray(dec *gojay.Decoder) error {
if o.index >= len(o.fields) {
o.index = 0
}
i := o.index
field := o.fields[i]
if field.IsNil(o.ptr) {
field.Set(o.ptr, reflect.New(field.Type).Elem().Interface())
}
ptr := field.Addr(o.ptr)
if o.unmarshaler[i] == nil {
o.unmarshaler[i] = o.newUnmarshalers[i](ptr)
Expand All @@ -37,9 +42,10 @@ func (o *record) UnmarshalJSONArray(dec *gojay.Decoder) error {

func (o *record) set(ptr interface{}) {
o.ptr = xunsafe.AsPointer(ptr)
o.rawPtr = ptr
}

//UnmarshalJSONObject unmarshal JSON object
// UnmarshalJSONObject unmarshal JSON object
func (o *record) UnmarshalJSONObject(dec *gojay.Decoder, key string) error {
switch key[0] {
case 'v':
Expand All @@ -50,28 +56,35 @@ func (o *record) UnmarshalJSONObject(dec *gojay.Decoder, key string) error {
return fmt.Errorf("unsupported key :%v", key)
}

//NKeys returns max of expected keys
// NKeys returns max of expected keys
func (o *record) NKeys() int {
return 1
}
func (o *record) value() interface{} {
return o.rawPtr
}

var i = 0

func newRecordUnmarshaler(field *bigquery.TableFieldSchema, dest reflect.Type) (func(ptr interface{}) Unmarshaler, error) {
machedFields, err := matchFields(dest, field)
matchedFields, err := matchFields(dest, field)
if err != nil {
return nil, err
}
var fields = make([]*xunsafe.Field, len(field.Fields))
var newUnmarshalers = make([]newUnmarshaler, len(field.Fields))
for i := range machedFields {
fieldUnmarsher, field, err := newFieldUnmarshaler(machedFields[i], field.Fields[i])
for i := range matchedFields {
fieldUnmarshaler, field, err := newFieldUnmarshaler(matchedFields[i], field.Fields[i])
if err != nil {
return nil, err
}
newUnmarshalers[i] = fieldUnmarsher
newUnmarshalers[i] = fieldUnmarshaler
fields[i] = field
}
return func(ptr interface{}) Unmarshaler {
result := &record{
name: field.Name,
rawPtr: ptr,
ptr: xunsafe.AsPointer(ptr),
fields: fields,
newUnmarshalers: newUnmarshalers,
Expand All @@ -84,14 +97,6 @@ func newRecordUnmarshaler(field *bigquery.TableFieldSchema, dest reflect.Type) (
func newFieldUnmarshaler(field *reflect.StructField, schemaField *bigquery.TableFieldSchema) (newUnmarshaler, *xunsafe.Field, error) {
fieldType := field.Type
xField := xunsafe.NewField(*field)
if fieldType.Kind() == reflect.Ptr {
fieldType = fieldType.Elem()
fieldUnmarshaler, err := newJSONUnmarshaler(schemaField, fieldType)
if err != nil {
return nil, nil, err
}
return fieldUnmarshaler, xField, nil
}
fieldUnmarshaler, err := newJSONUnmarshaler(schemaField, fieldType)
if err != nil {
return nil, nil, err
Expand Down
Loading

0 comments on commit d718d1b

Please sign in to comment.