feat: elasticsearch, influxdb.
This commit is contained in:
96
database/influxdb/mapper.go
Normal file
96
database/influxdb/mapper.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package influxdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/InfluxCommunity/influxdb3-go/v2/influxdb3"
|
||||
)
|
||||
|
||||
// Mapper 数据转换的接口
|
||||
type Mapper[T any] interface {
|
||||
// ToPoint 将数据转换为InfluxDB的Point格式
|
||||
ToPoint(data *T) *influxdb3.Point
|
||||
|
||||
// ToData 将InfluxDB的Point转换为原始数据
|
||||
ToData(point *influxdb3.Point) *T
|
||||
}
|
||||
|
||||
// Insert 插入数据
|
||||
func Insert[T any](ctx context.Context, c *Client, data *T, mapper Mapper[T]) error {
|
||||
if c.cli == nil {
|
||||
return ErrClientNotConnected
|
||||
}
|
||||
|
||||
if data == nil {
|
||||
return ErrEmptyData
|
||||
}
|
||||
|
||||
point := mapper.ToPoint(data)
|
||||
if point == nil {
|
||||
return ErrInvalidPoint
|
||||
}
|
||||
|
||||
err := c.Insert(ctx, point)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// BatchInsert 批量插入数据
|
||||
func BatchInsert[T any](ctx context.Context, c *Client, data []*T, mapper Mapper[T]) error {
|
||||
if c.cli == nil {
|
||||
return ErrClientNotConnected
|
||||
}
|
||||
|
||||
if len(data) == 0 {
|
||||
return ErrEmptyData
|
||||
}
|
||||
|
||||
points := make([]*influxdb3.Point, len(data))
|
||||
for i, d := range data {
|
||||
point := mapper.ToPoint(d)
|
||||
if point == nil {
|
||||
return ErrInvalidPoint
|
||||
}
|
||||
points[i] = point
|
||||
}
|
||||
|
||||
err := c.BatchInsert(ctx, points)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Query 查询数据
|
||||
func Query[T any](ctx context.Context, c *Client, query string, mapper Mapper[T]) ([]*T, error) {
|
||||
if c.cli == nil {
|
||||
return nil, ErrClientNotConnected
|
||||
}
|
||||
|
||||
iterator, err := c.Query(ctx, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var dataset []*T
|
||||
|
||||
for iterator.Next() {
|
||||
point, _ := iterator.AsPoints().AsPoint()
|
||||
if point == nil {
|
||||
return nil, ErrInvalidPoint
|
||||
}
|
||||
|
||||
data := mapper.ToData(point)
|
||||
dataset = append(dataset, data)
|
||||
}
|
||||
|
||||
if iterator.Err() != nil {
|
||||
return nil, iterator.Err()
|
||||
}
|
||||
|
||||
return dataset, nil
|
||||
}
|
||||
Reference in New Issue
Block a user