Skip to content

Commit

Permalink
feat: add in cosmos db in operators
Browse files Browse the repository at this point in the history
  • Loading branch information
tauslim committed Mar 8, 2024
1 parent 0381d2f commit e989a8a
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
31 changes: 31 additions & 0 deletions pkg/driver/cosmos/cosmos.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ func NewCosmosTranslator(r *gorql.RqlRootNode) (st *Translator) {
st.SetOpFunc(driver.GeOp, st.GetFieldValueTranslatorFunc(">=", convert))
st.SetOpFunc(driver.LeOp, st.GetFieldValueTranslatorFunc("<=", convert))
st.SetOpFunc(driver.NotOp, st.GetOpFirstTranslatorFunc(driver.NotOp, convert))
st.SetOpFunc(driver.InOp, st.GetSliceTranslatorFunc("ARRAY_CONTAINS", convert))

return
}
Expand Down Expand Up @@ -281,6 +282,36 @@ func (ct *Translator) GetOpFirstTranslatorFunc(op string, valueAlterFunc AlterVa
}
}

func (ct *Translator) GetSliceTranslatorFunc(op string, alterValueFunc AlterValueFunc) driver.TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
var values []string
var field string
var placeholder string
for i, a := range n.Args {
if i == 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)
}
} else {
placeholder = fmt.Sprintf("@p%s", strconv.Itoa(len(ct.args)+1))
convertedValue, err := alterValueFunc(a)
if err != nil {
return "", err
}
values = append(values, fmt.Sprintf("%v", convertedValue))
}
}
ct.args = append(ct.args, Param{
Name: placeholder,
Value: values,
})
s += fmt.Sprintf(`%s, %s, false`, placeholder, field)
return op + "(" + s + ")", nil
}
}

// Args returns slice of arguments for WHERE statement
func (ct *Translator) Args() []interface{} {
return ct.args
Expand Down
16 changes: 16 additions & 0 deletions pkg/driver/cosmos/cosmos_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,22 @@ var tests = []Test{
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation for IN operator`,
RQL: `in(foo,bar,john,doe)`,
Model: new(struct {
Foo string `rql:"filter"`
}),
ExpectedSQL: `WHERE ARRAY_CONTAINS(@p1, c.foo, false)`,
ExpectedArgs: []interface{}{
Param{
Name: "@p1",
Value: []string{"bar", "john", "doe"},
},
},
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Mixed style translation`,
RQL: `((eq(foo,42)&gt(price,10))|ge(price,500))&eq(disabled,false)`,
Expand Down

0 comments on commit e989a8a

Please sign in to comment.