@@ -4,13 +4,82 @@ import (
44 "github.com/viant/sqlparser/node"
55)
66
7- //Binary represents binary expr
7+ // Binary represents binary expr
88type Binary struct {
99 X , Y node.Node
1010 Op string
1111}
1212
13- //HasPlaceholder returns true if x or y operand is placeholder
13+ func (b * Binary ) Walk (fn func (ident node.Node , values Values , operator , parentOperator string ) error ) error {
14+ switch b .Op [0 ] {
15+ case 'A' , 'O' , 'a' , 'o' :
16+ if x , ok := b .X .(* Binary ); ok {
17+ if err := x .walk (fn , b .Op ); err != nil {
18+ return err
19+ }
20+ }
21+ if y , ok := b .Y .(* Binary ); ok {
22+ if err := y .walk (fn , b .Op ); err != nil {
23+ return err
24+ }
25+ }
26+ return nil
27+ }
28+ return b .walk (fn , "" )
29+
30+ }
31+
32+ func (b * Binary ) walk (fn func (ident node.Node , values Values , operator , parentOperator string ) error , operator string ) error {
33+ switch b .Op [0 ] {
34+ case 'A' , 'O' :
35+ if x , ok := b .X .(* Binary ); ok {
36+ if err := x .walk (fn , b .Op ); err != nil {
37+ return err
38+ }
39+ }
40+ if y , ok := b .Y .(* Binary ); ok {
41+ if err := y .walk (fn , b .Op ); err != nil {
42+ return err
43+ }
44+ }
45+ return nil
46+ }
47+ sel , values , err := b .Predicate ()
48+ if err != nil {
49+ return err
50+ }
51+ return fn (sel , values , b .Op , operator )
52+
53+ }
54+
55+ // Predicate binary predicate or nil
56+ func (b * Binary ) Predicate () (node.Node , Values , error ) {
57+ switch b .Op [0 ] {
58+ case 'A' , 'O' :
59+ return nil , nil , nil
60+ }
61+ identifier := b .Identifier ()
62+ if identifier == nil {
63+ return nil , nil , nil
64+ }
65+ values , err := b .Values ()
66+ if err != nil {
67+ return nil , nil , err
68+ }
69+ return identifier , values , nil
70+ }
71+
72+ // Placeholder returns placeholder
73+ func (b * Binary ) Placeholder () * Placeholder {
74+ r , ok := b .X .(* Placeholder )
75+ if ok {
76+ return r
77+ }
78+ r , ok = b .Y .(* Placeholder )
79+ return r
80+ }
81+
82+ // HasPlaceholder returns true if x or y operand is placeholder
1483func (b * Binary ) HasPlaceholder () bool {
1584 if _ , ok := b .X .(* Placeholder ); ok {
1685 return ok
@@ -19,7 +88,7 @@ func (b *Binary) HasPlaceholder() bool {
1988 return ok
2089}
2190
22- //Parenthesis returns parenthesis
91+ // Parenthesis returns parenthesis
2392func (b * Binary ) Parenthesis () * Parenthesis {
2493 if p , ok := b .X .(* Parenthesis ); ok {
2594 return p
@@ -28,20 +97,28 @@ func (b *Binary) Parenthesis() *Parenthesis {
2897 return p
2998}
3099
31- //HasIdentifier returns true if x or y opperand is identity
100+ // HasIdentifier returns true if x or y opperand is identity
32101func (b * Binary ) HasIdentifier () bool {
33102 return b .Identifier () != nil
34103}
35104
36- //Identifier returns an identifier node or nil
105+ // Identifier returns an identifier node or nil
37106func (b * Binary ) Identifier () node.Node {
38107 if x := Identity (b .X ); x != nil {
39108 return x
40109 }
41110 return Identity (b .Y )
42111}
43112
44- //NewBinary returns a binary expr
113+ // Values returns expression values
114+ func (b * Binary ) Values () (Values , error ) {
115+ if x := Identity (b .X ); x == nil {
116+ return NewValues (b .X )
117+ }
118+ return NewValues (b .Y )
119+ }
120+
121+ // NewBinary returns a binary expr
45122func NewBinary (x node.Node ) * Binary {
46123 return & Binary {X : x }
47124}
0 commit comments