Skip to content

Commit

Permalink
fix: amend match operator for cosmos.go
Browse files Browse the repository at this point in the history
  • Loading branch information
tauslim committed Aug 28, 2024
1 parent ae4250d commit fe0517f
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
36 changes: 35 additions & 1 deletion pkg/driver/cosmos/cosmos.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func NewCosmosTranslator(r *gorql.RqlRootNode) (st *Translator) {
st.SetOpFunc(driver.EqOp, st.GetEqualityTranslatorOpFunc("=", "IS"))

st.SetOpFunc(driver.LikeOp, st.GetFieldValueTranslatorFunc(driver.LikeOp, starToPercentFunc))
st.SetOpFunc(driver.MatchOp, st.GetFieldValueTranslatorFunc("ILIKE", starToPercentFunc))
st.SetOpFunc(driver.MatchOp, st.GetFunctionValueTranslatorFunc("CONTAINS", starToPercentFunc, true))
st.SetOpFunc(driver.GtOp, st.GetFieldValueTranslatorFunc(">", convert))
st.SetOpFunc(driver.LtOp, st.GetFieldValueTranslatorFunc("<", convert))
st.SetOpFunc(driver.GeOp, st.GetFieldValueTranslatorFunc(">=", convert))
Expand Down Expand Up @@ -256,6 +256,40 @@ func (ct *Translator) GetFieldValueTranslatorFunc(op string, valueAlterFunc Alte
}
}

func (ct *Translator) GetFunctionValueTranslatorFunc(op string, valueAlterFunc AlterValueFunc, optionalBool bool) driver.TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
var field string
var placeholder string
if len(n.Args) > 0 {
a := n.Args[0]
if gorql.IsValidField(a.(string)) {
field = fmt.Sprintf("c.%s", a.(string))
} else {
return "", fmt.Errorf("first argument must be a valid field name (arg: %s)", a)
}
}
subArgs := n.Args[1:]
if len(subArgs) > 1 {
return "", fmt.Errorf("expect one value argument, detected multiple arguments")
}
value, ok := subArgs[0].(string)
if !ok {
return "", fmt.Errorf("value %v is not type string", subArgs[0])
}
placeholder = fmt.Sprintf("@p%s", strconv.Itoa(len(ct.args)+1))
convertedValue, err := valueAlterFunc(value)
if err != nil {
return "", err
}
ct.args = append(ct.args, Param{
Name: placeholder,
Value: convertedValue,
})
s += fmt.Sprintf(`%s, %s, %v`, field, placeholder, optionalBool)
return op + "(" + s + ")", nil
}
}

func (ct *Translator) GetOpFirstTranslatorFunc(op string, valueAlterFunc AlterValueFunc) driver.TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
sep := ""
Expand Down
10 changes: 10 additions & 0 deletions pkg/driver/cosmos/cosmos_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,16 @@ var tests = []Test{
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation for CONTAINS ignore case operator`,
RQL: `match(foo,whoam*)`,
Model: new(struct {
Foo string `rql:"filter"`
}),
ExpectedSQL: `WHERE CONTAINS(c.foo, @p1, true)`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation for IN operator`,
RQL: `in(foo,[bar,john,doe])`,
Expand Down

0 comments on commit fe0517f

Please sign in to comment.