
package clickhouse_api

import (
	"context"
	"fmt"
	"time"
)

func ScanStruct() error {
	conn, err := GetNativeConnection(nil, nil, nil)
	if err != nil {
		return err
	}

	const ddl = `
	CREATE TABLE example (
		  Col1 Int64
		, Col2 FixedString(2)
		, Col3 Map(String, Int64)
		, Col4 Array(Int64)
		, Col5 DateTime64(3)
	) Engine Memory
	`
	defer func() {
		conn.Exec(context.Background(), "DROP TABLE example")
	}()
	if err := conn.Exec(context.Background(), "DROP TABLE IF EXISTS example"); err != nil {
		return err
	}
	if err := conn.Exec(context.Background(), ddl); err != nil {
		return err
	}
	batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example")
	if err != nil {
		return err
	}
	for i := int64(0); i < 1000; i++ {
		err := batch.Append(
			i%10,
			"CH",
			map[string]int64{
				"key": i,
			},
			[]int64{i, i + 1, i + 2},
			time.Now(),
		)
		if err != nil {
			return err
		}
	}
	if err := batch.Send(); err != nil {
		return err
	}

	var result struct {
		Col1  int64
		Count uint64 `ch:"count"`
	}
	if err := conn.QueryRow(context.Background(), "SELECT Col1, COUNT() AS count FROM example WHERE Col1 = 5 GROUP BY Col1").ScanStruct(&result); err != nil {
		return err
	}
	fmt.Println("result", result)
	return nil
}
