-
Notifications
You must be signed in to change notification settings - Fork 346
/
StatelessTransformer.scala
65 lines (56 loc) · 2.5 KB
/
StatelessTransformer.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package io.getquill.ast
trait StatelessTransformer {
def apply(e: Ast): Ast =
e match {
case e: Query => apply(e)
case e: Operation => apply(e)
case e: Action => apply(e)
case e: Value => apply(e)
case Function(params, body) => Function(params, apply(body))
case e: Ident => e
case Property(a, name) => Property(apply(a), name)
case Infix(a, b) => Infix(a, b.map(apply))
case OptionOperation(t, a, b, c) => OptionOperation(t, apply(a), b, apply(c))
case If(a, b, c) => If(apply(a), apply(b), apply(c))
case e: Dynamic => e
}
def apply(e: Query): Query =
e match {
case e: Entity => e
case Filter(a, b, c) => Filter(apply(a), b, apply(c))
case Map(a, b, c) => Map(apply(a), b, apply(c))
case FlatMap(a, b, c) => FlatMap(apply(a), b, apply(c))
case SortBy(a, b, c, d) => SortBy(apply(a), b, apply(c), d)
case GroupBy(a, b, c) => GroupBy(apply(a), b, apply(c))
case Aggregation(o, a) => Aggregation(o, apply(a))
case Take(a, b) => Take(apply(a), apply(b))
case Drop(a, b) => Drop(apply(a), apply(b))
case Union(a, b) => Union(apply(a), apply(b))
case UnionAll(a, b) => UnionAll(apply(a), apply(b))
case OuterJoin(t, a, b, iA, iB, on) =>
OuterJoin(t, apply(a), apply(b), iA, iB, apply(on))
}
def apply(e: Operation): Operation =
e match {
case UnaryOperation(o, a) => UnaryOperation(o, apply(a))
case BinaryOperation(a, b, c) => BinaryOperation(apply(a), b, apply(c))
case FunctionApply(function, values) => FunctionApply(apply(function), values.map(apply))
}
def apply(e: Value): Value =
e match {
case e: Constant => e
case NullValue => NullValue
case Tuple(values) => Tuple(values.map(apply))
}
def apply(e: Action): Action =
e match {
case AssignedAction(action, assignments) => AssignedAction(apply(action), assignments.map(apply))
case Update(query) => Update(apply(query))
case Insert(query) => Insert(apply(query))
case Delete(query) => Delete(apply(query))
}
private def apply(e: Assignment): Assignment =
e match {
case Assignment(property, value) => Assignment(property, apply(value))
}
}