@@ -20,6 +20,8 @@ type Param struct {
2020 Value interface {} `json:"value"`
2121}
2222
23+ type OperationValueAlterFunc func (interface {}) (string , interface {}, error )
24+
2325func (ct * Translator ) SetOpFunc (op string , f driver.TranslatorOpFunc ) {
2426 ct .opsDic [strings .ToUpper (op )] = f
2527}
@@ -130,6 +132,27 @@ var starToPercentFunc = AlterValueFunc(func(value interface{}) (interface{}, err
130132 return strings .Replace (value .(string ), `*` , `%` , - 1 ), nil
131133})
132134
135+ // for *foo* -> CONTAINS foo
136+ // for foo* -> STARTSWITH foo
137+ // for *foo -> ENDSWITH foo
138+ var containsOperationValueAlterFunc = OperationValueAlterFunc (func (value interface {}) (string , interface {}, error ) {
139+ val := value .(string )
140+ op := "CONTAINS"
141+ hasStarPrefix := strings .HasPrefix (val , "*" )
142+ hasStarSuffix := strings .HasSuffix (val , "*" )
143+ if hasStarPrefix && hasStarSuffix {
144+ val = strings .TrimPrefix (val , "*" )
145+ val = strings .TrimSuffix (val , "*" )
146+ } else if hasStarPrefix {
147+ val = strings .TrimPrefix (val , "*" )
148+ op = "ENDSWITH"
149+ } else if hasStarSuffix {
150+ val = strings .TrimSuffix (val , "*" )
151+ op = "STARTSWITH"
152+ }
153+ return op , val , nil
154+ })
155+
133156func NewCosmosTranslator (r * gorql.RqlRootNode ) (st * Translator ) {
134157 st = & Translator {rootNode : r , opsDic : map [string ]driver.TranslatorOpFunc {}}
135158
@@ -140,7 +163,7 @@ func NewCosmosTranslator(r *gorql.RqlRootNode) (st *Translator) {
140163 st .SetOpFunc (driver .EqOp , st .GetEqualityTranslatorOpFunc ("=" , "IS" ))
141164
142165 st .SetOpFunc (driver .LikeOp , st .GetFieldValueTranslatorFunc (driver .LikeOp , starToPercentFunc ))
143- st .SetOpFunc (driver .MatchOp , st .GetFunctionValueTranslatorFunc (true ))
166+ st .SetOpFunc (driver .MatchOp , st .GetFunctionValueTranslatorFunc (containsOperationValueAlterFunc , true ))
144167 st .SetOpFunc (driver .GtOp , st .GetFieldValueTranslatorFunc (">" , convert ))
145168 st .SetOpFunc (driver .LtOp , st .GetFieldValueTranslatorFunc ("<" , convert ))
146169 st .SetOpFunc (driver .GeOp , st .GetFieldValueTranslatorFunc (">=" , convert ))
@@ -256,7 +279,7 @@ func (ct *Translator) GetFieldValueTranslatorFunc(op string, valueAlterFunc Alte
256279 }
257280}
258281
259- func (ct * Translator ) GetFunctionValueTranslatorFunc (optionalBool bool ) driver.TranslatorOpFunc {
282+ func (ct * Translator ) GetFunctionValueTranslatorFunc (operationValueAlterFunc OperationValueAlterFunc , optionalBool bool ) driver.TranslatorOpFunc {
260283 return func (n * gorql.RqlNode ) (s string , err error ) {
261284 var field string
262285 var placeholder string
@@ -278,23 +301,14 @@ func (ct *Translator) GetFunctionValueTranslatorFunc(optionalBool bool) driver.T
278301 }
279302 placeholder = fmt .Sprintf ("@p%s" , strconv .Itoa (len (ct .args )+ 1 ))
280303
281- op := "CONTAINS"
282- hasStarPrefix := strings .HasPrefix (value , "*" )
283- hasStarSuffix := strings .HasSuffix (value , "*" )
284- if hasStarPrefix && hasStarSuffix {
285- value = strings .TrimPrefix (value , "*" )
286- value = strings .TrimSuffix (value , "*" )
287- } else if hasStarPrefix {
288- value = strings .TrimPrefix (value , "*" )
289- op = "ENDSWITH"
290- } else if hasStarSuffix {
291- value = strings .TrimSuffix (value , "*" )
292- op = "STARTSWITH"
304+ op , transformedValue , err := operationValueAlterFunc (value )
305+ if err != nil {
306+ return "" , fmt .Errorf ("error transforming value %s: %v" , value , err )
293307 }
294308
295309 ct .args = append (ct .args , Param {
296310 Name : placeholder ,
297- Value : value ,
311+ Value : transformedValue ,
298312 })
299313
300314 s += fmt .Sprintf (`%s, %s, %v` , field , placeholder , optionalBool )
0 commit comments