-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfield.go
More file actions
96 lines (89 loc) · 3.96 KB
/
field.go
File metadata and controls
96 lines (89 loc) · 3.96 KB
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
package picker
import (
"encoding/json"
"errors"
"fmt"
"strings"
"github.com/tidwall/gjson"
)
// TODO TypeVersion
// TODO TypeMurmur3
// TODO TypeAggregateMetricDouble
// TODO TypeHistogram
// TODO TypeAnnotatedText
// FieldTypeHandlers is a map of mapping Type to func that returns a Field instantiated with the appropriate Type
var FieldTypeHandlers = map[FieldType]func() Field{
FieldTypeAlias: func() Field { return &AliasField{} },
FieldTypeBinary: func() Field { return &BinaryField{} },
FieldTypeBoolean: func() Field { return &BooleanField{} },
FieldTypeByte: func() Field { return &ByteField{} },
FieldTypeCompletion: func() Field { return &CompletionField{} },
FieldTypeConstant: func() Field { return &ConstantField{} },
FieldTypeDate: func() Field { return &DateField{} },
FieldTypeDateNanos: func() Field { return &DateNanoSecField{} },
FieldTypeDateRange: func() Field { return &DateRangeField{} },
FieldTypeDenseVector: func() Field { return &DenseVectorField{} },
FieldTypeDouble: func() Field { return &DoubleField{} },
FieldTypeDoubleRange: func() Field { return &DoubleRangeField{} },
FieldTypeFlattened: func() Field { return &FlattenedField{} },
FieldTypeFloat: func() Field { return &FloatField{} },
FieldTypeFloatRange: func() Field { return &FloatRangeField{} },
FieldTypePoint: func() Field { return &PointField{} },
FieldTypeGeoPoint: func() Field { return &GeoPointField{} },
FieldTypeGeoShape: func() Field { return &GeoShapeField{} },
FieldTypeShape: func() Field { return &ShapeField{} },
FieldTypeHalfFloat: func() Field { return &HalfFloatField{} },
FieldTypeIP: func() Field { return &IPField{} },
FieldTypeIPRange: func() Field { return &IPRangeField{} },
FieldTypeInteger: func() Field { return &IntegerField{} },
FieldTypeIntegerRange: func() Field { return &IntegerRangeField{} },
FieldTypeJoin: func() Field { return &JoinField{} },
FieldTypeKeyword: func() Field { return &KeywordField{} },
FieldTypeLong: func() Field { return &LongField{} },
FieldTypeLongRange: func() Field { return &LongRangeField{} },
FieldTypeNested: func() Field { return &NestedField{} },
FieldTypeObject: func() Field { return &ObjectField{} },
FieldTypePercolator: func() Field { return &PercolatorField{} },
FieldTypeRankFeature: func() Field { return &RankFeatureField{} },
FieldTypeRankFeatures: func() Field { return &RankFeaturesField{} },
FieldTypeScaledFloat: func() Field { return &ScaledFloatField{} },
FieldTypeSearchAsYouType: func() Field { return &SearchAsYouTypeField{} },
FieldTypeShort: func() Field { return &ShortField{} },
FieldTypeText: func() Field { return &TextField{} },
FieldTypeTokenCount: func() Field { return &TokenCountField{} },
FieldTypeUnsignedLong: func() Field { return &UnsignedLongField{} },
FieldTypeWildcardKeyword: func() Field { return &WildcardField{} },
FieldTypeHistogram: func() Field { return &HistogramField{} },
}
func UnmarshalFieldJSON(data []byte, field *Field) error {
if len(data) == 0 {
return errors.New("picker: JSON is empty; can not unmarshal Field")
}
g := gjson.GetBytes(data, "type")
if !g.Exists() {
return fmt.Errorf("%w; can not unmarshal JSON", ErrMissingType)
}
str := g.String()
if len(str) == 0 {
return fmt.Errorf("%w; can not unmarshal JSON", ErrMissingType)
}
handler := FieldTypeHandlers[FieldType(str)]
if handler == nil {
handler = FieldTypeHandlers[FieldType(strings.ToLower(str))]
}
if handler == nil {
return fmt.Errorf("%w <%s>", ErrUnsupportedType, str)
}
*field = handler()
return (*field).UnmarshalJSON(data)
}
// Field is an elasticsearch field mapping
type Field interface {
Fielder
json.Marshaler
json.Unmarshaler
}
type Fielder interface {
Field() (Field, error)
Type() FieldType
}