-
Notifications
You must be signed in to change notification settings - Fork 397
Expand file tree
/
Copy pathPrestoToStringVisitor.java
More file actions
148 lines (136 loc) · 4.95 KB
/
PrestoToStringVisitor.java
File metadata and controls
148 lines (136 loc) · 4.95 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package sqlancer.presto;
import sqlancer.common.ast.newast.NewToStringVisitor;
import sqlancer.presto.ast.PrestoAtTimeZoneOperator;
import sqlancer.presto.ast.PrestoCastFunction;
import sqlancer.presto.ast.PrestoConstant;
import sqlancer.presto.ast.PrestoExpression;
import sqlancer.presto.ast.PrestoFunctionWithoutParenthesis;
import sqlancer.presto.ast.PrestoJoin;
import sqlancer.presto.ast.PrestoMultiValuedComparison;
import sqlancer.presto.ast.PrestoQuantifiedComparison;
import sqlancer.presto.ast.PrestoSelect;
public class PrestoToStringVisitor extends NewToStringVisitor<PrestoExpression> {
public static String asString(PrestoExpression expr) {
PrestoToStringVisitor visitor = new PrestoToStringVisitor();
visitor.visit(expr);
return visitor.get();
}
@Override
public void visitSpecific(PrestoExpression expr) {
if (expr instanceof PrestoConstant) {
visit((PrestoConstant) expr);
} else if (expr instanceof PrestoSelect) {
visit((PrestoSelect) expr);
} else if (expr instanceof PrestoJoin) {
visit((PrestoJoin) expr);
} else if (expr instanceof PrestoCastFunction) {
visit((PrestoCastFunction) expr);
} else if (expr instanceof PrestoFunctionWithoutParenthesis) {
visit((PrestoFunctionWithoutParenthesis) expr);
} else if (expr instanceof PrestoAtTimeZoneOperator) {
visit((PrestoAtTimeZoneOperator) expr);
} else if (expr instanceof PrestoMultiValuedComparison) {
visit((PrestoMultiValuedComparison) expr);
} else if (expr instanceof PrestoQuantifiedComparison) {
visit((PrestoQuantifiedComparison) expr);
} else {
throw new AssertionError(expr.getClass());
}
}
private void visit(PrestoJoin join) {
visit((PrestoExpression) join.getLeftTable());
sb.append(" ");
sb.append(join.getJoinType());
sb.append(" ");
if (join.getOuterType() != null) {
sb.append(join.getOuterType());
}
sb.append(" JOIN ");
visit((PrestoExpression) join.getRightTable());
if (join.getOnCondition() != null) {
sb.append(" ON ");
visit(join.getOnCondition());
}
}
private void visit(PrestoConstant constant) {
sb.append(constant.toString());
}
private void visit(PrestoAtTimeZoneOperator timeZoneOperator) {
visit(timeZoneOperator.getExpr());
sb.append(" AT TIME ZONE ");
sb.append(timeZoneOperator.getTimeZone());
}
private void visit(PrestoFunctionWithoutParenthesis prestoFunctionWithoutParenthesis) {
sb.append(prestoFunctionWithoutParenthesis.getExpr());
}
private void visit(PrestoSelect select) {
sb.append("SELECT ");
if (select.isDistinct()) {
sb.append("DISTINCT ");
}
visit(select.getFetchColumns());
sb.append(" FROM ");
visit(select.getFromList());
if (!select.getFromList().isEmpty() && !select.getJoinList().isEmpty()) {
sb.append(", ");
}
if (!select.getJoinList().isEmpty()) {
visit(select.getJoinList());
}
if (select.getWhereClause() != null) {
sb.append(" WHERE ");
visit(select.getWhereClause());
}
if (!select.getGroupByExpressions().isEmpty()) {
sb.append(" GROUP BY ");
visit(select.getGroupByExpressions());
}
if (select.getHavingClause() != null) {
sb.append(" HAVING ");
visit(select.getHavingClause());
}
if (!select.getOrderByClauses().isEmpty()) {
sb.append(" ORDER BY ");
visit(select.getOrderByClauses());
}
if (select.getLimitClause() != null) {
sb.append(" LIMIT ");
visit(select.getLimitClause());
}
if (select.getOffsetClause() != null) {
sb.append(" OFFSET ");
visit(select.getOffsetClause());
}
}
public void visit(PrestoCastFunction cast) {
sb.append("CAST((");
visit(cast.getExpr());
sb.append(") AS ");
sb.append(cast.getType().toString());
sb.append(")");
}
public void visit(PrestoMultiValuedComparison comp) {
sb.append("(");
visit(comp.getLeft());
sb.append(" ");
sb.append(comp.getOp().getStringRepresentation());
sb.append(" ");
sb.append(comp.getType());
sb.append(" (VALUES ");
visit(comp.getRight());
sb.append(")");
sb.append(")");
}
public void visit(PrestoQuantifiedComparison comp) {
sb.append("(");
visit(comp.getLeft());
sb.append(" ");
sb.append(comp.getOp().getStringRepresentation());
sb.append(" ");
sb.append(comp.getType());
sb.append(" ( ");
visit(comp.getRight());
sb.append(" ) ");
sb.append(")");
}
}