Skip to content

Commit cd8af01

Browse files
ajnavarrosmola
authored andcommitted
Add transformUp method to expressions (#27)
1 parent a0e2b48 commit cd8af01

File tree

6 files changed

+58
-0
lines changed

6 files changed

+58
-0
lines changed

sql/expression.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ type Expression interface {
55
Type() Type
66
Name() string
77
Eval(Row) interface{}
8+
TransformUp(func(Expression) Expression) Expression
89
}

sql/expression/boolean.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,10 @@ func (e Not) Eval(row sql.Row) interface{} {
2121
func (e Not) Name() string {
2222
return "Not(" + e.Child.Name() + ")"
2323
}
24+
25+
func (e *Not) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
26+
c := e.UnaryExpression.Child.TransformUp(f)
27+
n := &Not{UnaryExpression{c}}
28+
29+
return f(n)
30+
}

sql/expression/comparison.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ func (e Equals) Eval(row sql.Row) interface{} {
3535
return e.ChildType.Compare(a, b) == 0
3636
}
3737

38+
func (c *Equals) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
39+
lc := c.BinaryExpression.Left.TransformUp(f)
40+
rc := c.BinaryExpression.Right.TransformUp(f)
41+
42+
return f(NewEquals(lc, rc))
43+
}
44+
3845
type GreaterThan struct {
3946
Comparison
4047
}
@@ -51,6 +58,13 @@ func (e GreaterThan) Eval(row sql.Row) interface{} {
5158
return e.ChildType.Compare(a, b) == 1
5259
}
5360

61+
func (c *GreaterThan) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
62+
lc := c.BinaryExpression.Left.TransformUp(f)
63+
rc := c.BinaryExpression.Right.TransformUp(f)
64+
65+
return f(NewGreaterThan(lc, rc))
66+
}
67+
5468
type LessThan struct {
5569
Comparison
5670
}
@@ -67,6 +81,13 @@ func (e LessThan) Eval(row sql.Row) interface{} {
6781
return e.ChildType.Compare(a, b) == -1
6882
}
6983

84+
func (c *LessThan) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
85+
lc := c.BinaryExpression.Left.TransformUp(f)
86+
rc := c.BinaryExpression.Right.TransformUp(f)
87+
88+
return f(NewLessThan(lc, rc))
89+
}
90+
7091
type GreaterThanOrEqual struct {
7192
Comparison
7293
}
@@ -83,6 +104,13 @@ func (e GreaterThanOrEqual) Eval(row sql.Row) interface{} {
83104
return e.ChildType.Compare(a, b) > -1
84105
}
85106

107+
func (c *GreaterThanOrEqual) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
108+
lc := c.BinaryExpression.Left.TransformUp(f)
109+
rc := c.BinaryExpression.Right.TransformUp(f)
110+
111+
return f(NewGreaterThanOrEqual(lc, rc))
112+
}
113+
86114
type LessThanOrEqual struct {
87115
Comparison
88116
}
@@ -99,6 +127,13 @@ func (e LessThanOrEqual) Eval(row sql.Row) interface{} {
99127
return e.ChildType.Compare(a, b) < 1
100128
}
101129

130+
func (c *LessThanOrEqual) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
131+
lc := c.BinaryExpression.Left.TransformUp(f)
132+
rc := c.BinaryExpression.Right.TransformUp(f)
133+
134+
return f(NewLessThanOrEqual(lc, rc))
135+
}
136+
102137
func checkEqualTypes(a sql.Expression, b sql.Expression) {
103138
if a.Resolved() && b.Resolved() && a.Type() != b.Type() {
104139
panic(fmt.Errorf("both types should be equal: %v and %v\n", a, b))

sql/expression/get_field.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,8 @@ func (p GetField) Eval(row sql.Row) interface{} {
3131
func (p GetField) Name() string {
3232
return p.fieldName
3333
}
34+
35+
func (p *GetField) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
36+
n := *p
37+
return f(&n)
38+
}

sql/expression/literal.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,8 @@ func (p Literal) Eval(row sql.Row) interface{} {
3131
func (p Literal) Name() string {
3232
return p.name
3333
}
34+
35+
func (p *Literal) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
36+
n := *p
37+
return f(&n)
38+
}

sql/expression/unresolved.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,8 @@ func (c UnresolvedColumn) Name() string {
2525
func (UnresolvedColumn) Eval(r sql.Row) interface{} {
2626
return "FAIL" //FIXME
2727
}
28+
29+
func (p *UnresolvedColumn) TransformUp(f func(sql.Expression) sql.Expression) sql.Expression {
30+
n := *p
31+
return f(&n)
32+
}

0 commit comments

Comments
 (0)