diff --git a/ch/chschema/column.go b/ch/chschema/column.go index 2464c93..6ef23eb 100644 --- a/ch/chschema/column.go +++ b/ch/chschema/column.go @@ -204,8 +204,7 @@ func (c *UUIDColumn) ReadFrom(rd *chproto.Reader, numRow int) error { c.AllocForReading(numRow) for i := range c.Column { - err := rd.UUID(c.Column[i][:]) - if err != nil { + if err := rd.UUID(c.Column[i][:]); err != nil { return err } } @@ -557,3 +556,41 @@ func (c BFloat16HistColumn) WriteTo(wr *chproto.Writer) error { } return nil } + +//------------------------------------------------------------------------------ + +type MapStringStringColumn struct { + ColumnOf[map[string]string] +} + +var _ Columnar = (*MapStringStringColumn)(nil) + +func NewMapStringStringColumn() Columnar { + return new(MapStringStringColumn) +} + +func (c MapStringStringColumn) Type() reflect.Type { + return mapStringStringType +} + +func (c *MapStringStringColumn) ReadFrom(rd *chproto.Reader, numRow int) error { + c.AllocForReading(numRow) + + for i := range c.Column { + // TODO: implement + if err := rd.UUID(c.Column[i][:]); err != nil { + return err + } + } + + return nil +} + +func (c MapStringStringColumn) WriteTo(wr *chproto.Writer) error { + for i := range c.Column { + v := c.Column[i] + // TODO: implement + wr.Write(v) + } + return nil +} diff --git a/ch/chschema/types.go b/ch/chschema/types.go index 48519dd..a0fc33c 100644 --- a/ch/chschema/types.go +++ b/ch/chschema/types.go @@ -36,6 +36,8 @@ var ( sliceUint64Type = reflect.TypeOf((*[]uint64)(nil)).Elem() sliceFloat32Type = reflect.TypeOf((*[]float32)(nil)).Elem() + + mapStringStringType = reflect.TypeOf((*map[string]string)(nil)).Elem() ) var chTypes = [...]string{ @@ -177,6 +179,9 @@ func ColumnFactory(chType string, typ reflect.Type) NewColumnFunc { case "Array(Array(Bool))": return NewArrayArrayStringColumn + case "Map(String, String)": + return NewMapStringStringColumn + case chtype.Any: return nil } diff --git a/ch/db_test.go b/ch/db_test.go index 5f248e8..e9399e7 100644 --- a/ch/db_test.go +++ b/ch/db_test.go @@ -322,6 +322,7 @@ func TestClickhouse(t *testing.T) { tests := []func(ctx context.Context, t *testing.T, db *ch.DB){ testWhereBytes, + testMapStringString, } for _, fn := range tests { t.Run(funcName(fn), func(t *testing.T) { @@ -352,6 +353,10 @@ func testWhereBytes(ctx context.Context, t *testing.T, db *ch.DB) { require.Equal(t, data.Bytes, got.Bytes) } +func testMapStringString(ctx context.Context, t *testing.T, db *ch.DB) { + // TODO: add test +} + type Event struct { ch.CHModel `ch:"goch_events,partition:toYYYYMM(created_at)"`