-
Notifications
You must be signed in to change notification settings - Fork 2
/
common.go
151 lines (145 loc) · 3.19 KB
/
common.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package gisk
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/util/gconv"
"github.com/pkg/errors"
"regexp"
"strings"
)
// ConvertValueType 转换值数据类型
func ConvertValueType(value interface{}, valueType ValueType) (Value interface{}, err error) {
switch valueType {
case NUMBER:
Value = gconv.Float64(value)
return
case STRING:
Value = gconv.String(value)
return
case ARRAY:
str := gconv.String(value)
Value = strings.Split(str, ",")
return
case MAP:
var v map[string]interface{}
str := gconv.String(value)
err = json.Unmarshal([]byte(str), &v)
if err != nil {
return nil, err
}
Value = v
return
case BOOL:
Value = gconv.Bool(value)
return
default:
return nil, errors.New("value type not support")
}
}
// GetValueByTrait 获取特征数据
func GetValueByTrait(gisk *Gisk, key string) (Value, error) {
key = strings.ReplaceAll(string(key), " ", "") //删除空格字符
keys := strings.Split(string(key), "_")
switch keys[0] {
case string(INPUT): //特征格式 input_1_string
if len(keys) < 3 {
return Value{}, errors.New("input trait error")
}
valueType := keys[len(keys)-1]
value := strings.Join(keys[1:len(keys)-1], "_")
s := &Input{
ValueType: ValueType(valueType),
Value: value,
}
return s.Parse(gisk)
case string(VARIATE): //特征格式 variate_age_1
if len(keys) < 3 {
return Value{}, errors.New("variate trait error")
}
k := strings.Join(keys[1:len(keys)-1], "_")
version := keys[len(keys)-1]
dsl, e := gisk.DslGetter.GetDsl(VARIATE, k, version)
if e != nil {
return Value{}, e
}
var variate Variate
err := gisk.Unmarshal([]byte(dsl), &variate)
if err != nil {
return Value{}, err
}
return variate.Parse(gisk)
case string(FUNC): //特征格式 func_rand(func_sum(input_1_number,input_2_number),input_100_number)函数可以嵌套函数
re := regexp.MustCompile(`^func_(.+?)\((.+)?\)$`)
matches := re.FindStringSubmatch(key)
if len(matches) < 3 {
return Value{}, errors.New("func trait error")
}
funcName := matches[1]
f, ok := getFunc(funcName)
if !ok {
return Value{}, fmt.Errorf("func %s not fond", funcName)
}
str := matches[2]
if str != "" {
var value []Value
parameters := parseFuncParameter(str)
for _, v := range parameters {
d, err := GetValueByTrait(gisk, v)
if err != nil {
return Value{}, err
}
value = append(value, d)
}
return f(value...)
} else {
return f()
}
}
return Value{}, errors.Wrap(errors.New("value trait not support"), "")
}
func parseFuncParameter(str string) []string {
var res []string
//左右括号数量
var lNum int
var rNum int
var temStr string
for _, char := range str {
s := string(char)
if lNum == 0 {
switch s {
case "(":
lNum++
temStr += s
break
case ",":
if temStr != "" {
res = append(res, temStr)
temStr = ""
}
break
default:
temStr += s
}
} else if lNum > 0 {
temStr += s
switch s {
case "(":
lNum++
break
case ")":
rNum++
if lNum == rNum {
res = append(res, temStr)
temStr = ""
lNum = 0
rNum = 0
}
break
}
}
}
if temStr != "" {
res = append(res, temStr)
}
return res
}