@@ -33,6 +33,10 @@ import (
33
33
const (
34
34
pipelinePath = "%s/module/%s/%s/ingest/pipeline.json"
35
35
fieldsYmlPath = "%s/module/%s/%s/_meta/fields.yml"
36
+
37
+ typeIdx = 0
38
+ elementsIdx = 1
39
+ hintIdx = 2
36
40
)
37
41
38
42
var (
@@ -64,8 +68,9 @@ type pipeline struct {
64
68
}
65
69
66
70
type field struct {
67
- Type string
68
- Elements []string
71
+ Syntax string
72
+ SemanticElements []string
73
+ Type string
69
74
}
70
75
71
76
type fieldYml struct {
@@ -92,23 +97,41 @@ func newFieldYml(name, typeName string, noDoc bool) *fieldYml {
92
97
}
93
98
}
94
99
95
- func newField (lp string ) field {
96
- lp = lp [1 : len (lp )- 1 ]
97
- ee := strings .Split (lp , ":" )
98
- if len (ee ) != 2 {
99
- return field {
100
- Type : ee [0 ],
101
- Elements : nil ,
102
- }
100
+ func newField (pattern string ) field {
101
+ if len (pattern ) <= 2 {
102
+ return field {}
103
+ }
104
+ pattern = pattern [1 : len (pattern )- 1 ]
105
+
106
+ elements := strings .Split (pattern , ":" )
107
+ if ! isValidFormat (elements ) {
108
+ return field {}
109
+ }
110
+
111
+ hint := ""
112
+ if containsType (elements ) {
113
+ hint = elements [hintIdx ]
103
114
}
104
115
105
- e := strings .Split (ee [1 ], "." )
106
116
return field {
107
- Type : ee [0 ],
108
- Elements : e ,
117
+ Syntax : elements [typeIdx ],
118
+ SemanticElements : strings .Split (elements [elementsIdx ], "." ),
119
+ Type : hint ,
109
120
}
110
121
}
111
122
123
+ // isValidFormat checks if the input can be split correctly
124
+ // 1. if lenght is 2, the format is {type}:{field.elements}
125
+ // 2. if the lenght is 3, the format is {type}:{field.elements}:{hint}
126
+ func isValidFormat (ee []string ) bool {
127
+ return len (ee ) == 2 || len (ee ) == 3
128
+ }
129
+
130
+ // the last element is the type hint
131
+ func containsType (ee []string ) bool {
132
+ return len (ee ) == 3
133
+ }
134
+
112
135
func readPipeline (beatsPath , module , fileset string ) (* pipeline , error ) {
113
136
pp := fmt .Sprintf (pipelinePath , beatsPath , module , fileset )
114
137
r , err := ioutil .ReadFile (pp )
@@ -134,7 +157,7 @@ func addNewField(fs []field, f field) []field {
134
157
return append (fs , f )
135
158
}
136
159
137
- func getElementsFromPatterns (patterns []string ) ([]field , error ) {
160
+ func getSemanticElementsFromPatterns (patterns []string ) ([]field , error ) {
138
161
r , err := regexp .Compile ("{[\\ .\\ w\\ :]*}" )
139
162
if err != nil {
140
163
return nil , err
@@ -145,7 +168,7 @@ func getElementsFromPatterns(patterns []string) ([]field, error) {
145
168
pp := r .FindAllString (lp , - 1 )
146
169
for _ , p := range pp {
147
170
f := newField (p )
148
- if f .Elements == nil {
171
+ if f .SemanticElements == nil {
149
172
continue
150
173
}
151
174
fs = addNewField (fs , f )
@@ -214,16 +237,16 @@ type processors struct {
214
237
}
215
238
216
239
func (p * processors ) processFields () ([]field , error ) {
217
- f , err := getElementsFromPatterns (p .patterns )
240
+ f , err := getSemanticElementsFromPatterns (p .patterns )
218
241
if err != nil {
219
242
return nil , err
220
243
}
221
244
222
245
for i , ff := range f {
223
- fs := strings .Join (ff .Elements , "." )
246
+ fs := strings .Join (ff .SemanticElements , "." )
224
247
for k , mv := range p .rename {
225
248
if k == fs {
226
- ff .Elements = strings .Split (mv , "." )
249
+ ff .SemanticElements = strings .Split (mv , "." )
227
250
}
228
251
}
229
252
for _ , rm := range p .remove {
@@ -275,33 +298,37 @@ func getFieldByName(f []*fieldYml, name string) *fieldYml {
275
298
return nil
276
299
}
277
300
278
- func insertLastField (f []* fieldYml , name , typeName string , noDoc bool ) []* fieldYml {
301
+ func insertLastField (f []* fieldYml , name string , field field , noDoc bool ) []* fieldYml {
279
302
ff := getFieldByName (f , name )
280
303
if ff != nil {
281
304
return f
282
305
}
283
306
284
- nf := newFieldYml (name , types [typeName ], noDoc )
307
+ fieldType := field .Type
308
+ if fieldType == "" {
309
+ fieldType = types [field .Syntax ]
310
+ }
311
+ nf := newFieldYml (name , fieldType , noDoc )
285
312
return append (f , nf )
286
313
}
287
314
288
315
func insertGroup (out []* fieldYml , field field , index , count int , noDoc bool ) []* fieldYml {
289
- g := getFieldByName (out , field .Elements [index ])
316
+ g := getFieldByName (out , field .SemanticElements [index ])
290
317
if g != nil {
291
318
g .Fields = generateField (g .Fields , field , index + 1 , count , noDoc )
292
319
return out
293
320
}
294
321
295
322
var groupFields []* fieldYml
296
323
groupFields = generateField (groupFields , field , index + 1 , count , noDoc )
297
- group := newFieldYml (field .Elements [index ], "group" , noDoc )
324
+ group := newFieldYml (field .SemanticElements [index ], "group" , noDoc )
298
325
group .Fields = groupFields
299
326
return append (out , group )
300
327
}
301
328
302
329
func generateField (out []* fieldYml , field field , index , count int , noDoc bool ) []* fieldYml {
303
330
if index + 1 == count {
304
- return insertLastField (out , field .Elements [index ], field . Type , noDoc )
331
+ return insertLastField (out , field .SemanticElements [index ], field , noDoc )
305
332
}
306
333
return insertGroup (out , field , index , count , noDoc )
307
334
}
@@ -310,10 +337,10 @@ func generateFields(f []field, noDoc bool) []*fieldYml {
310
337
var out []* fieldYml
311
338
for _ , ff := range f {
312
339
index := 1
313
- if len (ff .Elements ) == 1 {
340
+ if len (ff .SemanticElements ) == 1 {
314
341
index = 0
315
342
}
316
- out = generateField (out , ff , index , len (ff .Elements ), noDoc )
343
+ out = generateField (out , ff , index , len (ff .SemanticElements ), noDoc )
317
344
}
318
345
return out
319
346
}
0 commit comments