go-common/app/job/main/search/model/map_data.go
2019-04-22 18:49:16 +08:00

223 lines
5.7 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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]]
}
}