Skip to content

Commit d67a68d

Browse files
samueldouglaslim
authored andcommitted
refactor: make GetFunctionValueTranslatorFunc more generic
1 parent 25211ad commit d67a68d

File tree

1 file changed

+29
-15
lines changed

1 file changed

+29
-15
lines changed

pkg/driver/cosmos/cosmos.go

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ type Param struct {
2020
Value interface{} `json:"value"`
2121
}
2222

23+
type OperationValueAlterFunc func(interface{}) (string, interface{}, error)
24+
2325
func (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+
133156
func 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

Comments
 (0)