-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfuzzy_rule.go
More file actions
164 lines (147 loc) · 3.77 KB
/
fuzzy_rule.go
File metadata and controls
164 lines (147 loc) · 3.77 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
package picker
import (
"encoding/json"
"github.com/chanced/dynamic"
)
type FuzzyRuler interface {
FuzzyRule() (*FuzzyRule, error)
}
type FuzzyRuleParams struct {
// (Required) The term to match
Term string `json:"term"`
// (Optional, string) analyzer used to analyze terms in the query. Defaults
// to the top-level <field>'s analyzer.
Analyzer string `json:"analyzer,omitempty"`
// (Optional) An optional interval filter.
Filter RuleFilterer `json:"filter,omitempty"`
// (Optional) If specified, then match intervals from this field
// rather than the top-level <field>.
//
// The fuzzy is normalized using the search analyzer from this field,
// unless a separate analyzer is specified.
UseField string `json:"use_field,omitempty"`
// (Optional, integer) Number of beginning characters left unchanged when creating expansions. Defaults to 0.
PrefixLength int `json:"prefix_length,omitempty"`
// (Optional, string) Maximum edit distance allowed for matching. See
// Fuzziness for valid values and more information. Defaults to auto.
Fuzziness string `json:"fuzziness,omitempty"`
// (Optional, Boolean) Indicates whether edits include transpositions of two
// adjacent characters (ab → ba). Defaults to true.
Transpositions interface{} `json:"transpositions,omitempty"`
}
func (FuzzyRuleParams) Type() RuleType {
return RuleTypeFuzzy
}
func (p FuzzyRuleParams) Rule() (Rule, error) {
return p.FuzzyRule()
}
func (p FuzzyRuleParams) FuzzyRule() (*FuzzyRule, error) {
r := &FuzzyRule{}
r.SetUseField(p.UseField)
r.SetAnalyzer(p.Analyzer)
err := r.SetTerm(p.Term)
if err != nil {
return r, err
}
err = r.SetFilter(p.Filter)
if err != nil {
return r, err
}
return r, nil
}
type FuzzyRule struct {
analyzerParam
ruleFilterParam
useFieldParam
transpositionsParam
prefixLengthParam
fuzzinessParam
term string
}
func (f FuzzyRule) Term() string {
return f.term
}
func (f *FuzzyRule) SetTerm(term string) error {
if len(term) == 0 {
return ErrTermRequired
}
f.term = term
return nil
}
func (FuzzyRule) Type() RuleType {
return RuleTypeFuzzy
}
func (f *FuzzyRule) Rule() (QueryRule, error) {
return f, nil
}
func (f *FuzzyRule) UnmarshalBSON(data []byte) error {
return f.UnmarshalJSON(data)
}
func (f *FuzzyRule) UnmarshalJSON(data []byte) error {
*f = FuzzyRule{}
rd := dynamic.JSON(data)
var r fuzzyRule
if rd.IsString() {
var str string
err := json.Unmarshal(rd, &str)
if err != nil {
return err
}
r = fuzzyRule{
Term: str,
}
} else {
err := json.Unmarshal(rd, &r)
if err != nil {
return err
}
}
mv, err := r.FuzzyRule()
*f = *mv
return err
}
func (f FuzzyRule) MarshalBSON() ([]byte, error) {
return f.MarshalJSON()
}
func (f FuzzyRule) MarshalJSON() ([]byte, error) {
d, err := json.Marshal(fuzzyRule{
Term: f.term,
Analyzer: f.analyzer,
Filter: f.filter,
UseField: f.useField,
PrefixLength: f.PrefixLength(),
Fuzziness: f.fuzziness,
Transpositions: f.Transpositions(),
})
if err != nil {
return nil, err
}
obj := dynamic.JSONObject{
f.Type().String(): d,
}
return json.Marshal(obj)
}
//easyjson:json
type fuzzyRule struct {
Term string `json:"term"`
Analyzer string `json:"analyzer,omitempty"`
Filter *RuleFilter `json:"filter,omitempty"`
UseField string `json:"use_field,omitempty"`
PrefixLength int `json:"prefix_length,omitempty"`
Fuzziness string `json:"fuzziness,omitempty"`
Transpositions interface{} `json:"transpositions,omitempty"`
}
func (p fuzzyRule) FuzzyRule() (*FuzzyRule, error) {
r := &FuzzyRule{}
r.SetUseField(p.UseField)
r.SetAnalyzer(p.Analyzer)
err := r.SetTerm(p.Term)
if err != nil {
return r, err
}
err = r.SetFilter(p.Filter)
if err != nil {
return r, err
}
return r, nil
}