@@ -33,8 +33,18 @@ type Transformer struct {
33
33
DataPath string `json:"data_path"`
34
34
KeyAsPrefix bool `json:"key_as_prefix"`
35
35
36
- loc Locator
37
- stats StatsInfo
36
+ loc Locator
37
+ keys []string
38
+ lastEleKey string
39
+ keysRegion []string
40
+ keysCity []string
41
+ keysCountry []string
42
+ keysIsp []string
43
+ keysCountryCode []string
44
+ keysLatitude []string
45
+ keysLongitude []string
46
+ keysDistrictCode []string
47
+ stats StatsInfo
38
48
}
39
49
40
50
func (t * Transformer ) Init () error {
@@ -43,9 +53,32 @@ func (t *Transformer) Init() error {
43
53
return fmt .Errorf ("new locator: %v" , err )
44
54
}
45
55
t .loc = loc
56
+ t .keys = GetKeys (t .Key )
57
+
58
+ newKeys := make ([]string , len (t .keys ))
59
+ copy (newKeys , t .keys )
60
+ t .lastEleKey = t .keys [len (t .keys )- 1 ]
61
+ t .keysRegion = generateKeys (t .keys , Region , t .KeyAsPrefix )
62
+ t .keysCity = generateKeys (t .keys , City , t .KeyAsPrefix )
63
+ t .keysCountry = generateKeys (t .keys , Country , t .KeyAsPrefix )
64
+ t .keysIsp = generateKeys (t .keys , Isp , t .KeyAsPrefix )
65
+ t .keysCountryCode = generateKeys (t .keys , CountryCode , t .KeyAsPrefix )
66
+ t .keysLatitude = generateKeys (t .keys , Latitude , t .KeyAsPrefix )
67
+ t .keysLongitude = generateKeys (t .keys , Longitude , t .KeyAsPrefix )
68
+ t .keysDistrictCode = generateKeys (t .keys , DistrictCode , t .KeyAsPrefix )
46
69
return nil
47
70
}
48
71
72
+ func generateKeys (keys []string , lastEle string , keyAsPrefix bool ) []string {
73
+ newKeys := make ([]string , len (keys ))
74
+ copy (newKeys , keys )
75
+ if keyAsPrefix {
76
+ lastEle = keys [len (keys )- 1 ] + "_" + lastEle
77
+ }
78
+ newKeys [len (keys )- 1 ] = lastEle
79
+ return newKeys
80
+ }
81
+
49
82
func (_ * Transformer ) RawTransform (datas []string ) ([]string , error ) {
50
83
return datas , errors .New ("IP transformer not support rawTransform" )
51
84
}
@@ -54,18 +87,15 @@ func (t *Transformer) Transform(datas []Data) ([]Data, error) {
54
87
var err , fmtErr error
55
88
errNum := 0
56
89
if t .loc == nil {
57
- loc , err := NewLocator ( t . DataPath )
90
+ err := t . Init ( )
58
91
if err != nil {
59
- t .stats , _ = transforms .SetStatsInfo (err , t .stats , int64 (errNum ), int64 (len (datas )), t .Type ())
60
92
return datas , err
61
93
}
62
- t .loc = loc
63
94
}
64
- keys := GetKeys (t .Key )
65
- newKeys := make ([]string , len (keys ))
95
+ newKeys := make ([]string , len (t .keys ))
66
96
for i := range datas {
67
- copy (newKeys , keys )
68
- val , getErr := GetMapValue (datas [i ], keys ... )
97
+ copy (newKeys , t . keys )
98
+ val , getErr := GetMapValue (datas [i ], t . keys ... )
69
99
if getErr != nil {
70
100
errNum , err = transforms .SetError (errNum , getErr , transforms .GetErr , t .Key )
71
101
continue
@@ -81,36 +111,83 @@ func (t *Transformer) Transform(datas []Data) ([]Data, error) {
81
111
errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
82
112
continue
83
113
}
84
- newKeys [len (newKeys )- 1 ] = Region
85
- SetMapValueWithPrefix (datas [i ], info .Region , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
86
- newKeys [len (newKeys )- 1 ] = City
87
- SetMapValueWithPrefix (datas [i ], info .City , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
88
- newKeys [len (newKeys )- 1 ] = Country
89
- SetMapValueWithPrefix (datas [i ], info .Country , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
90
- newKeys [len (newKeys )- 1 ] = Isp
91
- SetMapValueWithPrefix (datas [i ], info .Isp , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
114
+ findErr = t .SetMapValue (datas [i ], info .Region , t .keysRegion ... )
115
+ if findErr != nil {
116
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
117
+ }
118
+ findErr = t .SetMapValue (datas [i ], info .City , t .keysCity ... )
119
+ if findErr != nil {
120
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
121
+ }
122
+ findErr = t .SetMapValue (datas [i ], info .Country , t .keysCountry ... )
123
+ if findErr != nil {
124
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
125
+ }
126
+ findErr = t .SetMapValue (datas [i ], info .Isp , t .keysIsp ... )
127
+ if findErr != nil {
128
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
129
+ }
92
130
if info .CountryCode != "" {
93
- newKeys [len (newKeys )- 1 ] = CountryCode
94
- SetMapValueWithPrefix (datas [i ], info .CountryCode , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
131
+ findErr = t .SetMapValue (datas [i ], info .CountryCode , t .keysCountryCode ... )
132
+ if findErr != nil {
133
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
134
+ }
95
135
}
96
136
if info .Latitude != "" {
97
- newKeys [len (newKeys )- 1 ] = Latitude
98
- SetMapValueWithPrefix (datas [i ], info .Latitude , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
137
+ findErr = t .SetMapValue (datas [i ], info .Latitude , t .keysLatitude ... )
138
+ if findErr != nil {
139
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
140
+ }
99
141
}
100
142
if info .Longitude != "" {
101
- newKeys [len (newKeys )- 1 ] = Longitude
102
- SetMapValueWithPrefix (datas [i ], info .Longitude , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
143
+ findErr = t .SetMapValue (datas [i ], info .Longitude , t .keysLongitude ... )
144
+ if findErr != nil {
145
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
146
+ }
103
147
}
104
148
if info .DistrictCode != "" {
105
- newKeys [len (newKeys )- 1 ] = DistrictCode
106
- SetMapValueWithPrefix (datas [i ], info .DistrictCode , keys [len (keys )- 1 ], t .KeyAsPrefix , newKeys ... )
149
+ findErr = t .SetMapValue (datas [i ], info .DistrictCode , t .keysDistrictCode ... )
150
+ if findErr != nil {
151
+ errNum , err = transforms .SetError (errNum , findErr , transforms .General , "" )
152
+ }
107
153
}
108
154
}
109
155
110
156
t .stats , fmtErr = transforms .SetStatsInfo (err , t .stats , int64 (errNum ), int64 (len (datas )), t .Type ())
111
157
return datas , fmtErr
112
158
}
113
159
160
+ //通过层级key设置value值, 如果keys不存在则不加前缀,否则加前缀
161
+ func (t * Transformer ) SetMapValue (m map [string ]interface {}, val interface {}, keys ... string ) error {
162
+ if len (keys ) == 0 {
163
+ return nil
164
+ }
165
+ var curr map [string ]interface {}
166
+ curr = m
167
+ for _ , k := range keys [0 : len (keys )- 1 ] {
168
+ finalVal , ok := curr [k ]
169
+ if ! ok {
170
+ n := make (map [string ]interface {})
171
+ curr [k ] = n
172
+ curr = n
173
+ continue
174
+ }
175
+ //判断val是否为map[string]interface{}类型
176
+ if curr , ok = finalVal .(map [string ]interface {}); ok {
177
+ continue
178
+ }
179
+ return fmt .Errorf ("SetMapValueWithPrefix failed, %v is not the type of map[string]interface{}" , keys )
180
+ }
181
+ //判断val(k)是否存在
182
+ _ , exist := curr [keys [len (keys )- 1 ]]
183
+ if exist {
184
+ curr [t .lastEleKey + "_" + keys [len (keys )- 1 ]] = val
185
+ } else {
186
+ curr [keys [len (keys )- 1 ]] = val
187
+ }
188
+ return nil
189
+ }
190
+
114
191
func (_ * Transformer ) Description () string {
115
192
//return "transform ip to country region and isp"
116
193
return "获取IP的区域、国家、城市和运营商信息"
0 commit comments