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