-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfield_value_factor_function.go
More file actions
166 lines (148 loc) · 3.81 KB
/
field_value_factor_function.go
File metadata and controls
166 lines (148 loc) · 3.81 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
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package picker
import (
"fmt"
"encoding/json"
"github.com/chanced/dynamic"
)
type FieldValueFactorFunc struct {
// Field to be extracted from the document.
Field string
// Optional factor to multiply the field value with, defaults to 1.
Factor interface{}
// Modifier to apply to the field value, can be one of: none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, or reciprocal. Defaults to none.
Modifier Modifier
// Value used if the document doesn’t have that field. The modifier and factor are still applied to it as though it were read from the document.
Missing interface{}
// (optional) Query to filter (such as picker.TermQuery, picker.MatchQuery, and so on)
Filter CompleteClauser
// Float
Weight interface{}
}
func (FieldValueFactorFunc) FuncKind() FuncKind {
return FuncKindRandomScore
}
func (fvf FieldValueFactorFunc) Function() (Function, error) {
return fvf.FieldValueFactorFunction()
}
func (fvf FieldValueFactorFunc) FieldValueFactorFunction() (*FieldValueFactorFunction, error) {
f := &FieldValueFactorFunction{field: fvf.Field}
err := f.SetWeight(fvf.Weight)
if err != nil {
return f, err
}
err = f.SetModifier(fvf.Modifier)
if err != nil {
return f, err
}
err = f.SetFilter(fvf.Filter)
if err != nil {
return f, err
}
f.SetMissing(fvf.Missing)
err = f.SetFactor(fvf.Factor)
if err != nil {
return f, err
}
return f, nil
}
type FieldValueFactorFunction struct {
field string
missing interface{}
factor dynamic.Number
modifierParam
weightParam
filter QueryClause
}
func (fvf FieldValueFactorFunction) Field() string {
return fvf.field
}
func (fvf *FieldValueFactorFunction) SetField(field string) {
if fvf == nil {
*fvf = FieldValueFactorFunction{}
}
fvf.field = field
}
func (fvf FieldValueFactorFunction) Filter() QueryClause {
return fvf.filter
}
func (fvf *FieldValueFactorFunction) SetFilter(filter CompleteClauser) error {
if fvf == nil {
*fvf = FieldValueFactorFunction{}
}
c, err := filter.Clause()
if err != nil {
return err
}
fvf.filter = c
return nil
}
func (FieldValueFactorFunction) FuncKind() FuncKind {
return FuncKindFieldValueFactor
}
func (fvf FieldValueFactorFunction) SetFactor(v interface{}) error {
fvf.factor = dynamic.Number{}
err := fvf.factor.Set(v)
if err != nil {
return err
}
if _, ok := fvf.factor.Float64(); !ok {
return fmt.Errorf("invalid Factor value for %s: <%d>", fvf.field, fvf.factor.Value())
}
return nil
}
func (fvf FieldValueFactorFunction) Factor() float64 {
if fvf.factor.IsNil() {
return float64(1)
}
f, _ := fvf.factor.Float64()
return f
}
func (fvf *FieldValueFactorFunction) SetMissing(missing interface{}) {
if fvf == nil {
*fvf = FieldValueFactorFunction{}
}
fvf.missing = missing
}
func (fvf FieldValueFactorFunction) Missing() interface{} {
return fvf.missing
}
func (fvf FieldValueFactorFunction) MarshalJSON() ([]byte, error) {
return marshalFunction(&fvf)
}
func (fvf *FieldValueFactorFunction) marshalParams(data dynamic.JSONObject) error {
params := fieldValueFactorParams{
Field: fvf.field,
Missing: fvf.missing,
Modifier: fvf.modifier,
}
if f, ok := fvf.factor.Float64(); ok {
params.Factor = &f
}
fd, err := json.Marshal(params)
if err != nil {
return err
}
data["field_value_factor"] = fd
return nil
}
func (fvf *FieldValueFactorFunction) unmarshalParams(data dynamic.JSON) error {
params := fieldValueFactorParams{}
err := json.Unmarshal(data, ¶ms)
if err != nil {
return err
}
err = fvf.factor.Set(params.Factor)
if err != nil {
return err
}
fvf.SetMissing(params.Missing)
err = fvf.SetModifier(params.Modifier)
return err
}
//easyjson:json
type fieldValueFactorParams struct {
Modifier Modifier `json:"modifier,omitempty"`
Field string `json:"field"`
Missing interface{} `json:"missing,omitempty"`
Factor *float64 `json:"factor,omitempty"`
}