|
|
package model |
|
|
|
|
|
import ( |
|
|
"encoding/json" |
|
|
"fmt" |
|
|
"strconv" |
|
|
"strings" |
|
|
"time" |
|
|
|
|
|
"go-common/library/log" |
|
|
) |
|
|
|
|
|
// MapData . |
|
|
type MapData map[string]interface{} |
|
|
|
|
|
// StrID . |
|
|
func (m MapData) StrID(attrs *Attrs) (string, bool) { |
|
|
if attrs.Index.IndexID == "UUID" { |
|
|
return "", true |
|
|
} |
|
|
var data []interface{} |
|
|
arr := strings.Split(attrs.Index.IndexID, ",") |
|
|
arrLen := len(arr) |
|
|
if arrLen >= 2 { |
|
|
for _, v := range arr[1:] { |
|
|
if item, ok := m[v].(*interface{}); ok { |
|
|
data = append(data, item) |
|
|
continue |
|
|
} |
|
|
if item, ok := m[v].(interface{}); ok { |
|
|
data = append(data, item) |
|
|
continue |
|
|
} |
|
|
log.Error("model.map_data.StrID err (%v)", v) |
|
|
return "", false |
|
|
} |
|
|
return fmt.Sprintf(arr[0], data...), true |
|
|
} |
|
|
return "", false |
|
|
} |
|
|
|
|
|
// Index . |
|
|
func (m MapData) Index(attrs *Attrs) (indexAliasName, indexEntityName string) { |
|
|
switch attrs.Index.IndexSplit { |
|
|
case "single": |
|
|
indexAliasName = attrs.Index.IndexAliasPrefix |
|
|
indexEntityName = attrs.Index.IndexEntityPrefix |
|
|
case "int": |
|
|
if attrs.DataSQL.DataIndexSuffix != "" { |
|
|
s := strings.Split(attrs.DataSQL.DataIndexSuffix, ";") |
|
|
v := strings.Split(s[1], ":") |
|
|
if id, ok := m[v[0]].(*interface{}); ok { |
|
|
// indexAliasName = fmt.Sprintf("%s%d", attrs.Index.IndexAliasPrefix, (*id).(int64)%100) // mod |
|
|
divisor, _ := strconv.ParseInt(v[2], 10, 64) |
|
|
indexAliasName = fmt.Sprintf("%s"+s[0], attrs.Index.IndexAliasPrefix, (*id).(int64)%divisor) |
|
|
indexEntityName = fmt.Sprintf("%s"+s[0], attrs.Index.IndexEntityPrefix, (*id).(int64)%divisor) |
|
|
} |
|
|
if id, ok := m[v[0]].(interface{}); ok { |
|
|
divisor, _ := strconv.ParseInt(v[2], 10, 64) |
|
|
indexAliasName = fmt.Sprintf("%s"+s[0], attrs.Index.IndexAliasPrefix, id.(int64)%divisor) |
|
|
indexEntityName = fmt.Sprintf("%s"+s[0], attrs.Index.IndexEntityPrefix, id.(int64)%divisor) |
|
|
} |
|
|
} |
|
|
} |
|
|
//fmt.Println("indexname", indexAliasName, indexEntityName) |
|
|
return |
|
|
} |
|
|
|
|
|
// DtbIndex . |
|
|
// func (m MapData) DtbIndex(attrs *Attrs) (indexName string) { |
|
|
// if attrs.Index.IndexZero == "0" { |
|
|
// indexName = attrs.Index.IndexAliasPrefix |
|
|
// return |
|
|
// } |
|
|
// if attrs.DataSQL.DataIndexSuffix != "" { |
|
|
// s := strings.Split(attrs.DataSQL.DataIndexSuffix, ";") |
|
|
// v := strings.Split(s[1], ":") |
|
|
// divisor, _ := strconv.ParseInt(v[2], 10, 64) |
|
|
// indexName = fmt.Sprintf("%s"+s[0], attrs.Index.IndexAliasPrefix, int64(m[v[0]].(float64))%divisor) |
|
|
// } |
|
|
// return |
|
|
// } |
|
|
|
|
|
// PrimaryID . |
|
|
func (m MapData) PrimaryID() int64 { |
|
|
if m["_id"] != nil { |
|
|
if id, ok := m["_id"].(*interface{}); ok { |
|
|
return (*id).(int64) |
|
|
} |
|
|
} |
|
|
return 0 |
|
|
} |
|
|
|
|
|
// StrMTime . |
|
|
func (m MapData) StrMTime() string { |
|
|
if m["_mtime"] != nil { |
|
|
if mtime, ok := m["_mtime"].(*interface{}); ok { |
|
|
return (*mtime).(time.Time).Format("2006-01-02 15:04:05") |
|
|
} else if mtime, ok := m["_mtime"].(string); ok { |
|
|
return mtime |
|
|
} |
|
|
} |
|
|
return "" |
|
|
} |
|
|
|
|
|
// StrCTime . |
|
|
func (m MapData) StrCTime() string { |
|
|
if m["ctime"] != nil { |
|
|
if ctime, ok := m["ctime"].(*interface{}); ok { |
|
|
return (*ctime).(time.Time).Format("2006-01-02") |
|
|
} else if ctime, ok := m["ctime"].(string); ok { |
|
|
return ctime |
|
|
} |
|
|
} |
|
|
return "" |
|
|
} |
|
|
|
|
|
// InetNtoA int64 to string ip. |
|
|
func (m MapData) InetNtoA(ip int64) string { |
|
|
return fmt.Sprintf("%d.%d.%d.%d", |
|
|
byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip)) |
|
|
} |
|
|
|
|
|
// TransData transfer address into value |
|
|
func (m MapData) TransData(attr *Attrs) { |
|
|
for k, v := range m { |
|
|
// transfer automaticlly |
|
|
if v2, ok := v.(*interface{}); ok { |
|
|
switch (*v2).(type) { |
|
|
case time.Time: |
|
|
m[k] = (*v2).(time.Time).Format("2006-01-02 15:04:05") |
|
|
case []uint, []uint8, []uint16, []uint32, []uint64: |
|
|
m[k] = string((*v2).([]byte)) |
|
|
case int, int8, int16, int32, int64: // 一定要,用于extra_data查询 |
|
|
m[k] = (*v2).(int64) |
|
|
case nil: |
|
|
m[k] = int64(0) //给个默认值,当查到为null时 |
|
|
default: |
|
|
// other types |
|
|
} |
|
|
} |
|
|
// transfer again by custom |
|
|
if t, ok := attr.DataSQL.DataIndexFormatFields[k]; ok { |
|
|
if v3, ok := v.(*interface{}); ok { |
|
|
switch t { |
|
|
case "ip": |
|
|
if *v3 == nil { |
|
|
*v3 = int64(0) |
|
|
} |
|
|
ipFormat := m.InetNtoA((*v3).(int64)) |
|
|
m[k+"_format"] = ipFormat |
|
|
case "arr": |
|
|
var arr []int |
|
|
binaryAttributes := strconv.FormatInt((*v3).(int64), 2) |
|
|
for i := len(binaryAttributes) - 1; i >= 0; i-- { |
|
|
b := fmt.Sprintf("%c", binaryAttributes[i]) |
|
|
if b == "1" { |
|
|
arr = append(arr, len(binaryAttributes)-i) |
|
|
} |
|
|
} |
|
|
m[k+"_format"] = arr |
|
|
case "bin": |
|
|
var arr []int |
|
|
binaryAttributes := strconv.FormatInt((*v3).(int64), 2) |
|
|
for i := len(binaryAttributes) - 1; i >= 0; i-- { |
|
|
b := fmt.Sprintf("%c", binaryAttributes[i]) |
|
|
if b == "1" { |
|
|
arr = append(arr, len(binaryAttributes)-i) |
|
|
} |
|
|
} |
|
|
m[k] = arr |
|
|
case "array_json": |
|
|
var arr []int64 |
|
|
arr = []int64{} |
|
|
json.Unmarshal([]byte((*v3).([]uint8)), &arr) //如果不是json就是空数组 |
|
|
// println(len(arr)) |
|
|
m[k] = arr |
|
|
case "day": |
|
|
m[k] = (*v3).(time.Time).Format("2006-01-02") |
|
|
case "workflow": |
|
|
delete(m, k) |
|
|
default: |
|
|
// other types |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
// TransDtb transfer databus fields into es fields |
|
|
func (m MapData) TransDtb(attr *Attrs) { |
|
|
// TODO 注释要打开,不然无法移除不要的dtb字段 |
|
|
// for k := range m { |
|
|
// if _, ok := attr.DataSQL.DataDtbFields[k]; !ok { |
|
|
// if k == "index_name" { |
|
|
// continue |
|
|
// } |
|
|
// delete(m, k) |
|
|
// } |
|
|
// } |
|
|
res := map[string]interface{}{} |
|
|
for k, dv := range attr.DataSQL.DataDtbFields { |
|
|
for _, dk := range dv { |
|
|
if v, ok := m[k]; ok { |
|
|
switch v.(type) { |
|
|
case float64: |
|
|
res[dk] = int64(v.(float64)) |
|
|
default: |
|
|
res[dk] = v |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
for k := range res { |
|
|
m[k] = res[k] |
|
|
} |
|
|
id, okID := attr.DataSQL.DataFieldsV2["_id"] |
|
|
key, okKey := attr.DataSQL.DataDtbFields[id.Field] |
|
|
if len(key) >= 1 && okID && okKey { |
|
|
m["_id"] = m[key[0]] |
|
|
} |
|
|
}
|
|
|
|