Binary Node: operations for >, >=, <, <=, =, !=, AND, OR, Like, IN x = y => db.users.find({field: {"$eq": value}}) x != y => db.inventory.find( { qty: { $ne: 20 } } ) x like "list%" => db.users.find( { user_id: /^list/ } ) x like "%list%" => db.users.find( { u
(node *expr.BinaryNode)
| 265 | // x IN [a,b,c] => db.users.find( { user_id: {"$in":[a,b,c] } } ) |
| 266 | // |
| 267 | func (m *rewrite) walkFilterBinary(node *expr.BinaryNode) (expr.Node, error) { |
| 268 | |
| 269 | // If we have to recurse deeper for AND, OR operators |
| 270 | switch node.Operator.T { |
| 271 | case lex.TokenNE: |
| 272 | if node.Args[1].String() == "NULL" { |
| 273 | //u.Errorf("we found something wrong werener") |
| 274 | //return expr.NewIdentityNodeVal(fmt.Sprintf("%s IS NOT NULL", node.Args[0])), nil |
| 275 | node.Operator.V = "IS NOT NULL" |
| 276 | node.Args[1] = expr.NewIdentityNodeVal("") |
| 277 | //u.Warnf("rh %#v", node.Args[1]) |
| 278 | } |
| 279 | return node, nil |
| 280 | // case lex.TokenLogicOr: |
| 281 | // lh, err := m.walkNode(node.Args[0]) |
| 282 | // rh, err2 := m.walkNode(node.Args[1]) |
| 283 | // if err != nil || err2 != nil { |
| 284 | // u.Errorf("could not get children nodes? %v %v %v", err, err2, node) |
| 285 | // return nil, fmt.Errorf("could not evaluate: %v", node.String()) |
| 286 | // } |
| 287 | // node.Args[0] = lh |
| 288 | // node.Args[1] = rh |
| 289 | // return node, nil |
| 290 | } |
| 291 | |
| 292 | //u.Debugf("walkBinary: %v l:%v r:%v %T %T", node, lhval, rhval, lhval, rhval) |
| 293 | switch node.Operator.T { |
| 294 | case lex.TokenEqual, lex.TokenEqualEqual: |
| 295 | |
| 296 | case lex.TokenNE: |
| 297 | // db.inventory.find( { qty: { $ne: 20 } } ) |
| 298 | |
| 299 | case lex.TokenLE: |
| 300 | // db.inventory.find( { qty: { $lte: 20 } } ) |
| 301 | |
| 302 | case lex.TokenLT: |
| 303 | // db.inventory.find( { qty: { $lt: 20 } } ) |
| 304 | |
| 305 | case lex.TokenGE: |
| 306 | // db.inventory.find( { qty: { $gte: 20 } } ) |
| 307 | |
| 308 | case lex.TokenGT: |
| 309 | // db.inventory.find( { qty: { $gt: 20 } } ) |
| 310 | |
| 311 | case lex.TokenLike: |
| 312 | // { $text: { $search: <string>, $language: <string> } } |
| 313 | // { <field>: { $regex: /pattern/, $options: '<options>' } } |
| 314 | |
| 315 | case lex.TokenIN: |
| 316 | // switch vt := node.Args[1].(type) { |
| 317 | // case value.SliceValue: |
| 318 | // default: |
| 319 | // u.Warnf("not implemented type %#v", rhval) |
| 320 | // } |
| 321 | |
| 322 | default: |
| 323 | u.Warnf("not implemented: %v", node.Operator) |
| 324 | } |
no test coverage detected