1
0
mirror of https://github.com/uptrace/go-clickhouse.git synced 2025-06-08 23:26:11 +02:00
go-clickhouse/ch/model_map.go
2022-03-21 08:58:25 +02:00

47 lines
787 B
Go

package ch
import (
"reflect"
"github.com/uptrace/go-clickhouse/ch/chschema"
)
type mapModel struct {
m map[string]any
columnar bool
}
var _ Model = (*mapModel)(nil)
func newMapModel(v reflect.Value) *mapModel {
if v.IsNil() {
v.Set(reflect.MakeMap(mapType))
}
return &mapModel{
m: v.Interface().(map[string]any),
}
}
func (m *mapModel) SetColumnar(on bool) {
m.columnar = on
}
func (m *mapModel) ScanBlock(block *chschema.Block) error {
if m.columnar {
for _, col := range block.Columns {
set(m.m, col.Name, col.Value())
}
return nil
}
for _, col := range block.Columns {
if col.Len() > 0 {
set(m.m, col.Name, col.Index(0))
} else {
zero := reflect.Zero(col.Columnar.Type()).Interface()
set(m.m, col.Name, zero)
}
}
return nil
}