Skip to content

Commit

Permalink
feat: implement $not for mongodb parser
Browse files Browse the repository at this point in the history
  • Loading branch information
tauslim committed Feb 27, 2024
1 parent 213720f commit da028b2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 56 deletions.
81 changes: 33 additions & 48 deletions pkg/driver/mongo.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,16 @@ func (mt *MongoTranslator) where(n *gorql.RqlNode) (string, error) {
func NewMongoTranslator(r *gorql.RqlRootNode) (mt *MongoTranslator) {
mt = &MongoTranslator{r, map[string]TranslatorOpFunc{}}
mt.SetOpFunc(AndOp, mt.GetAndOrTranslatorOpFunc(strings.ToLower(AndOp)))
mt.SetOpFunc(OrOp, mt.GetAndOrTranslatorOpFunc(OrOp))
//mt.SetOpFunc(NeOp, mt.GetEqualityTranslatorOpFunc("!=", "IS NOT"))
mt.SetOpFunc(EqOp, mt.GetEqualityTranslatorOpFunc(strings.ToLower(EqOp)))
mt.SetOpFunc(OrOp, mt.GetAndOrTranslatorOpFunc(strings.ToLower(OrOp)))
mt.SetOpFunc(NeOp, mt.GetFieldValueTranslatorFunc(strings.ToLower(NeOp)))
mt.SetOpFunc(EqOp, mt.GetFieldValueTranslatorFunc(strings.ToLower(EqOp)))
//mt.SetOpFunc(LikeOp, mt.GetFieldValueTranslatorFunc("LIKE", starToPercentFunc))
//mt.SetOpFunc(MatchOp, mt.GetFieldValueTranslatorFunc("ILIKE", starToPercentFunc))
mt.SetOpFunc(GtOp, mt.GetFieldValueTranslatorFunc(strings.ToLower(GtOp)))
//mt.SetOpFunc(LtOp, mt.GetFieldValueTranslatorFunc("<", nil))
//mt.SetOpFunc(GeOp, mt.GetFieldValueTranslatorFunc(">=", nil))
//mt.SetOpFunc(LeOp, mt.GetFieldValueTranslatorFunc("<=", nil))
mt.SetOpFunc(NotOp, mt.GetFieldValueTranslatorFunc(strings.ToLower(NotOp)))
mt.SetOpFunc(NotOp, mt.GetOpFirstTranslatorFunc(strings.ToLower(NotOp)))
return
}

Expand All @@ -78,12 +78,6 @@ func (mt *MongoTranslator) GetAndOrTranslatorOpFunc(op string) TranslatorOpFunc
}
}

func (mt *MongoTranslator) GetEqualityTranslatorOpFunc(op string) TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
return mt.GetFieldValueTranslatorFunc(op)(n)
}
}

func (mt *MongoTranslator) GetFieldValueTranslatorFunc(op string) TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
sep := ""
Expand All @@ -110,51 +104,42 @@ func (mt *MongoTranslator) GetFieldValueTranslatorFunc(op string) TranslatorOpFu
if err != nil {
return "", err
}
s += fmt.Sprintf("%v", convertedValue)
s += fmt.Sprintf("{'$%s': %v}", op, convertedValue)
}
s += tempS
}
sep = fmt.Sprintf(": ")
sep = fmt.Sprintf(`: `)
}
return fmt.Sprintf(`{'$%s': {%s}}`, op, s), nil
return fmt.Sprintf(`{%s}`, s), nil
}
}

//func (mt *MongoTranslator) GetOpFirstTranslatorFunc(op string) TranslatorOpFunc {
// return func(n *gorql.RqlNode) (s string, err error) {
// sep := ""
// for _, a := range n.Args {
// s += sep
// switch v := a.(type) {
// case string:
// var tempS string
// _, err := strconv.ParseInt(v, 10, 64)
// if err == nil || IsValidField(v) {
// tempS = v
// } else if valueAlterFunc != nil {
// tempS, err = valueAlterFunc(v)
// if err != nil {
// return "", err
// }
// } else {
// tempS = Quote(v)
// }
// s += tempS
// case *gorql.RqlNode:
// var tempS string
// tempS, err = mt.where(v)
// if err != nil {
// return "", err
// }
// s = s + tempS
// }
//
// sep = ", "
// }
//
// return fmt.Sprintf("{'$%s': %s}", op, strings.Join(ops, ", ")), nil
// }
//}
func (mt *MongoTranslator) GetOpFirstTranslatorFunc(op string) TranslatorOpFunc {
return func(n *gorql.RqlNode) (s string, err error) {
sep := ""
for _, a := range n.Args {
s += sep
switch v := a.(type) {
case *gorql.RqlNode:
var tempS string
tempS, err = mt.where(v)
if err != nil {
return "", err
}
s = s + tempS
default:
convertedValue, err := convert(v)
if err != nil {
return "", err
}
s += fmt.Sprintf("%v", convertedValue)
}
sep = ", "
}

return fmt.Sprintf("{'$%s': %s}", op, s), nil
}
}

func convert(value interface{}) (interface{}, error) {
switch v := value.(type) {
Expand Down
16 changes: 8 additions & 8 deletions pkg/driver/mongo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,17 @@ var mongodbTests = []MongodbTest{
{
Name: `Basic translation with double equal operators`,
RQL: `and(foo=eq=42,price=eq=10)`,
Expected: `{'$and': [{'$eq': {'foo': '42'}}, {'$eq': {'price': 10}}]}`,
Expected: `{'$and': [{'foo': {'$eq': '42'}}, {'price': {'$eq': 10}}]}`,
WantParseError: false,
WantTranslatorError: false,
},
{
Name: `Basic translation with func style operators`,
RQL: `and(eq(foo,42),gt(price,10),not(disabled=false))`,
Expected: `{'$and': [{'foo': {'$eq': '42'}}, {'price': {'$gt': 10}}, {'$not': {'disabled': {'$eq': false}}}]}`,
WantParseError: false,
WantTranslatorError: false,
},
//{
// Name: `Basic translation with func style operators`,
// RQL: `and(eq(foo,42),gt(price,10),not(disabled))`,
// Expected: `{'$and': [{'$eq': {'foo': '42'}}, {'$eq': {'price': 10}}, {'$eq': {'disabled': false}}]}`,
// WantParseError: false,
// WantTranslatorError: false,
//},
}

func TestMongodbParser(t *testing.T) {
Expand Down

0 comments on commit da028b2

Please sign in to comment.