Remove any aliases
(from *SqlSource, node expr.Node)
| 376 | |
| 377 | // Remove any aliases |
| 378 | func rewriteNode(from *SqlSource, node expr.Node) expr.Node { |
| 379 | switch nt := node.(type) { |
| 380 | case *expr.IdentityNode: |
| 381 | if left, right, ok := nt.LeftRight(); ok { |
| 382 | //u.Debugf("rewriteNode from.Name:%v l:%v r:%v", from.alias, left, right) |
| 383 | if left == from.alias { |
| 384 | in := expr.IdentityNode{Text: right} |
| 385 | //u.Warnf("nice, found it! in = %v", in) |
| 386 | return &in |
| 387 | } |
| 388 | } |
| 389 | case *expr.NumberNode, *expr.NullNode, *expr.StringNode, *expr.ValueNode: |
| 390 | //u.Warnf("skipping? %v", nt.String()) |
| 391 | return nt |
| 392 | case *expr.BinaryNode: |
| 393 | switch nt.Operator.T { |
| 394 | case lex.TokenAnd, lex.TokenLogicAnd, lex.TokenLogicOr: |
| 395 | n1 := rewriteNode(from, nt.Args[0]) |
| 396 | n2 := rewriteNode(from, nt.Args[1]) |
| 397 | return &expr.BinaryNode{Operator: nt.Operator, Args: []expr.Node{n1, n2}} |
| 398 | case lex.TokenEqual, lex.TokenEqualEqual: |
| 399 | n := rewriteNode(from, nt.Args[0]) |
| 400 | if n != nil { |
| 401 | return n |
| 402 | } |
| 403 | n = rewriteNode(from, nt.Args[1]) |
| 404 | if n != nil { |
| 405 | return n |
| 406 | } |
| 407 | u.Warnf("Could not find node: %#v", node) |
| 408 | default: |
| 409 | u.Warnf("un-implemented op: %v", nt.Operator) |
| 410 | } |
| 411 | case *expr.FuncNode: |
| 412 | fn := expr.NewFuncNode(nt.Name, nt.F) |
| 413 | fn.Args = make([]expr.Node, len(nt.Args)) |
| 414 | for i, arg := range nt.Args { |
| 415 | fn.Args[i] = rewriteNode(from, arg) |
| 416 | if fn.Args[i] == nil { |
| 417 | // What??? |
| 418 | u.Warnf("error, nil node: %s", arg.String()) |
| 419 | return nil |
| 420 | } |
| 421 | } |
| 422 | return fn |
| 423 | default: |
| 424 | u.Warnf("%T node types are not suppored yet for column rewrite", node) |
| 425 | } |
| 426 | return nil |
| 427 | } |
no test coverage detected