@@ -2,6 +2,7 @@ package clover
2
2
3
3
import (
4
4
"regexp"
5
+ "strings"
5
6
6
7
"github.com/ostafen/clover/encoding"
7
8
)
@@ -62,13 +63,12 @@ func (f *field) IsNilOrNotExists() *Criteria {
62
63
}
63
64
64
65
func (f * field ) Eq (value interface {}) * Criteria {
65
- normalizedValue , err := encoding .Normalize (value )
66
- if err != nil {
67
- return & falseCriteria
68
- }
69
-
70
66
return & Criteria {
71
67
p : func (doc * Document ) bool {
68
+ normalizedValue , err := encoding .Normalize (getFieldOrValue (doc , value ))
69
+ if err != nil {
70
+ return false
71
+ }
72
72
if ! doc .Has (f .name ) {
73
73
return false
74
74
}
@@ -78,52 +78,48 @@ func (f *field) Eq(value interface{}) *Criteria {
78
78
}
79
79
80
80
func (f * field ) Gt (value interface {}) * Criteria {
81
- normValue , err := encoding .Normalize (value )
82
- if err != nil {
83
- return & falseCriteria
84
- }
85
-
86
81
return & Criteria {
87
82
p : func (doc * Document ) bool {
83
+ normValue , err := encoding .Normalize (getFieldOrValue (doc , value ))
84
+ if err != nil {
85
+ return false
86
+ }
88
87
return compareValues (doc .Get (f .name ), normValue ) > 0
89
88
},
90
89
}
91
90
}
92
91
93
92
func (f * field ) GtEq (value interface {}) * Criteria {
94
- normValue , err := encoding .Normalize (value )
95
- if err != nil {
96
- return & falseCriteria
97
- }
98
-
99
93
return & Criteria {
100
94
p : func (doc * Document ) bool {
95
+ normValue , err := encoding .Normalize (getFieldOrValue (doc , value ))
96
+ if err != nil {
97
+ return false
98
+ }
101
99
return compareValues (doc .Get (f .name ), normValue ) >= 0
102
100
},
103
101
}
104
102
}
105
103
106
104
func (f * field ) Lt (value interface {}) * Criteria {
107
- normValue , err := encoding .Normalize (value )
108
- if err != nil {
109
- return & falseCriteria
110
- }
111
-
112
105
return & Criteria {
113
106
p : func (doc * Document ) bool {
107
+ normValue , err := encoding .Normalize (getFieldOrValue (doc , value ))
108
+ if err != nil {
109
+ return false
110
+ }
114
111
return compareValues (doc .Get (f .name ), normValue ) < 0
115
112
},
116
113
}
117
114
}
118
115
119
116
func (f * field ) LtEq (value interface {}) * Criteria {
120
- normValue , err := encoding .Normalize (value )
121
- if err != nil {
122
- return & falseCriteria
123
- }
124
-
125
117
return & Criteria {
126
118
p : func (doc * Document ) bool {
119
+ normValue , err := encoding .Normalize (getFieldOrValue (doc , value ))
120
+ if err != nil {
121
+ return false
122
+ }
127
123
return compareValues (doc .Get (f .name ), normValue ) <= 0
128
124
},
129
125
}
@@ -142,8 +138,9 @@ func (f *field) In(values ...interface{}) *Criteria {
142
138
return & Criteria {
143
139
p : func (doc * Document ) bool {
144
140
docValue := doc .Get (f .name )
145
- for _ , value := range normValues .([]interface {}) {
146
- if compareValues (value , docValue ) == 0 {
141
+ for _ , v := range values {
142
+ normValue , err := encoding .Normalize (getFieldOrValue (doc , v ))
143
+ if err == nil && compareValues (normValue , docValue ) == 0 {
147
144
return true
148
145
}
149
146
}
@@ -164,7 +161,7 @@ func (f *field) Contains(elems ...interface{}) *Criteria {
164
161
165
162
for _ , elem := range elems {
166
163
found := false
167
- normElem , err := encoding .Normalize (elem )
164
+ normElem , err := encoding .Normalize (getFieldOrValue ( doc , elem ) )
168
165
169
166
if err == nil {
170
167
for _ , val := range slice {
@@ -241,3 +238,15 @@ func (c *Criteria) Not() *Criteria {
241
238
p : negatePredicate (c .p ),
242
239
}
243
240
}
241
+
242
+ // getFieldOrValue returns dereferenced value if value denotes another document field,
243
+ // otherwise returns the value itself directly
244
+ func getFieldOrValue (doc * Document , value interface {}) interface {} {
245
+ if cmpField , ok := value .(* field ); ok {
246
+ value = doc .Get (cmpField .name )
247
+ } else if fStr , ok := value .(string ); ok && strings .HasPrefix (fStr , "$" ) {
248
+ fieldName := strings .TrimLeft (fStr , "$" )
249
+ value = doc .Get (fieldName )
250
+ }
251
+ return value
252
+ }
0 commit comments