feat: elasticsearch, influxdb.
This commit is contained in:
111
database/elasticsearch/utils.go
Normal file
111
database/elasticsearch/utils.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package elasticsearch
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/go-kratos/kratos/v2/encoding"
|
||||
_ "github.com/go-kratos/kratos/v2/encoding/json"
|
||||
"github.com/go-kratos/kratos/v2/log"
|
||||
)
|
||||
|
||||
// ParseErrorMessage 解析 Elasticsearch 错误消息
|
||||
func ParseErrorMessage(body io.ReadCloser) (*ErrorResponse, error) {
|
||||
defer body.Close()
|
||||
|
||||
var errorResponse ErrorResponse
|
||||
if err := json.NewDecoder(body).Decode(&errorResponse); err != nil {
|
||||
return nil, ErrUnmarshalResponse
|
||||
}
|
||||
|
||||
return &errorResponse, nil
|
||||
}
|
||||
|
||||
// MergeOptions 合并 Elasticsearch 索引的映射和设置
|
||||
func MergeOptions(mapping, settings string) (string, error) {
|
||||
codec := encoding.GetCodec("json")
|
||||
|
||||
body := make(map[string]interface{})
|
||||
|
||||
if mapping != "" {
|
||||
var mappingObj map[string]interface{}
|
||||
if err := codec.Unmarshal([]byte(mapping), &mappingObj); err != nil {
|
||||
log.Errorf("failed to unmarshal mapping: %v", err)
|
||||
return "", err
|
||||
}
|
||||
if existingMappings, ok := mappingObj["mappings"]; ok {
|
||||
body["mappings"] = existingMappings
|
||||
} else {
|
||||
body["mappings"] = mappingObj
|
||||
}
|
||||
}
|
||||
|
||||
if settings != "" {
|
||||
var settingsObj map[string]interface{}
|
||||
if err := codec.Unmarshal([]byte(settings), &settingsObj); err != nil {
|
||||
log.Errorf("failed to unmarshal settings: %v", err)
|
||||
return "", err
|
||||
}
|
||||
// 检查 settings 是否包含 settings 字段
|
||||
if existingSettings, ok := settingsObj["settings"]; ok {
|
||||
body["settings"] = existingSettings
|
||||
} else {
|
||||
body["settings"] = settingsObj
|
||||
}
|
||||
}
|
||||
|
||||
bodyBytes, err := codec.Marshal(body)
|
||||
if err != nil {
|
||||
log.Errorf("failed to marshal request body: %v", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(bodyBytes), nil
|
||||
}
|
||||
|
||||
func ParseQueryString(query string) []string {
|
||||
codec := encoding.GetCodec("json")
|
||||
|
||||
var err error
|
||||
queryMap := make(map[string]string)
|
||||
if err = codec.Unmarshal([]byte(query), &queryMap); err == nil {
|
||||
var queries []string
|
||||
for k, v := range queryMap {
|
||||
queries = append(queries, k+":"+v)
|
||||
}
|
||||
return queries
|
||||
}
|
||||
|
||||
var queryMapArray []map[string]string
|
||||
if err = codec.Unmarshal([]byte(query), &queryMapArray); err == nil {
|
||||
var queries []string
|
||||
for _, item := range queryMapArray {
|
||||
for k, v := range item {
|
||||
queries = append(queries, k+":"+v)
|
||||
}
|
||||
}
|
||||
return queries
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func MakeQueryString(andQuery, orQuery string) string {
|
||||
a := ParseQueryString(andQuery)
|
||||
o := ParseQueryString(orQuery)
|
||||
|
||||
if len(a) == 0 && len(o) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
if len(a) > 0 && len(o) == 0 {
|
||||
return strings.Join(a, " AND ")
|
||||
} else if len(a) == 0 && len(o) > 0 {
|
||||
return strings.Join(o, " OR ")
|
||||
} else if len(a) > 0 && len(o) > 0 {
|
||||
return strings.Join(a, " AND ") + " AND (" + strings.Join(o, " OR ") + ")"
|
||||
} else {
|
||||
return strings.Join(a, " AND ") + " AND " + strings.Join(o, " OR ")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user