1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression;
19
20 import lombok.AccessLevel;
21 import lombok.NoArgsConstructor;
22 import org.apache.calcite.sql.SqlNode;
23 import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
27 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
28 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CaseWhenExpression;
29 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CollateExpression;
30 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
31 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
32 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExtractArgExpression;
33 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
34 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
35 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
36 import org.apache.shardingsphere.sql.parser.sql.dialect.segment.mysql.match.MatchAgainstExpression;
37 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
38 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.RowExpression;
39 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.TypeCastExpression;
40 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.UnaryOperationExpression;
41 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
42 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
43 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
44 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
45 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
46 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
47 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.BetweenExpressionConverter;
48 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.BinaryOperationExpressionConverter;
49 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.CaseWhenExpressionConverter;
50 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.CollateExpressionConverter;
51 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ColumnConverter;
52 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ExistsSubqueryExpressionConverter;
53 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ExtractArgExpressionConverter;
54 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.FunctionConverter;
55 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.InExpressionConverter;
56 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ListExpressionConverter;
57 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.LiteralExpressionConverter;
58 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.MatchExpressionConverter;
59 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.NotExpressionConverter;
60 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.ParameterMarkerExpressionConverter;
61 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.RowExpressionConverter;
62 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.SubqueryExpressionConverter;
63 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.TypeCastExpressionConverter;
64 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.UnaryOperationExpressionConverter;
65 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.impl.VariableSegmentConverter;
66 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.projection.impl.AggregationProjectionConverter;
67 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.projection.impl.DataTypeConverter;
68
69 import java.util.Optional;
70
71
72
73
74 @NoArgsConstructor(access = AccessLevel.PRIVATE)
75 public final class ExpressionConverter {
76
77
78
79
80
81
82
83
84 public static Optional<SqlNode> convert(final ExpressionSegment segment) {
85 if (null == segment) {
86 return Optional.empty();
87 }
88 if (segment instanceof LiteralExpressionSegment) {
89 return LiteralExpressionConverter.convert((LiteralExpressionSegment) segment);
90 }
91 if (segment instanceof CommonExpressionSegment) {
92
93 throw new UnsupportedSQLOperationException("unsupported CommonExpressionSegment");
94 }
95 if (segment instanceof ListExpression) {
96 return ListExpressionConverter.convert((ListExpression) segment);
97 }
98 if (segment instanceof BinaryOperationExpression) {
99 return BinaryOperationExpressionConverter.convert((BinaryOperationExpression) segment);
100 }
101 if (segment instanceof ColumnSegment) {
102 return ColumnConverter.convert((ColumnSegment) segment);
103 }
104 if (segment instanceof ExistsSubqueryExpression) {
105 return ExistsSubqueryExpressionConverter.convert((ExistsSubqueryExpression) segment);
106 }
107 if (segment instanceof SubqueryExpressionSegment) {
108 return SubqueryExpressionConverter.convert((SubqueryExpressionSegment) segment);
109 }
110 if (segment instanceof InExpression) {
111 return InExpressionConverter.convert((InExpression) segment);
112 }
113 if (segment instanceof BetweenExpression) {
114 return BetweenExpressionConverter.convert((BetweenExpression) segment);
115 }
116 if (segment instanceof ParameterMarkerExpressionSegment) {
117 return ParameterMarkerExpressionConverter.convert((ParameterMarkerExpressionSegment) segment);
118 }
119 if (segment instanceof FunctionSegment) {
120 return FunctionConverter.convert((FunctionSegment) segment);
121 }
122 if (segment instanceof AggregationProjectionSegment) {
123 return AggregationProjectionConverter.convert((AggregationProjectionSegment) segment);
124 }
125 if (segment instanceof DataTypeSegment) {
126 return DataTypeConverter.convert((DataTypeSegment) segment);
127 }
128 if (segment instanceof CaseWhenExpression) {
129 return CaseWhenExpressionConverter.convert((CaseWhenExpression) segment);
130 }
131 if (segment instanceof NotExpression) {
132 return NotExpressionConverter.convert((NotExpression) segment);
133 }
134 if (segment instanceof TypeCastExpression) {
135 return TypeCastExpressionConverter.convert((TypeCastExpression) segment);
136 }
137 if (segment instanceof ExtractArgExpression) {
138 return ExtractArgExpressionConverter.convert((ExtractArgExpression) segment);
139 }
140 if (segment instanceof MatchAgainstExpression) {
141 return MatchExpressionConverter.convert((MatchAgainstExpression) segment);
142 }
143 if (segment instanceof CollateExpression) {
144 return CollateExpressionConverter.convert((CollateExpression) segment);
145 }
146 if (segment instanceof RowExpression) {
147 return RowExpressionConverter.convert((RowExpression) segment);
148 }
149 if (segment instanceof VariableSegment) {
150 return VariableSegmentConverter.convert((VariableSegment) segment);
151 }
152 if (segment instanceof UnaryOperationExpression) {
153 return UnaryOperationExpressionConverter.convert((UnaryOperationExpression) segment);
154 }
155 throw new UnsupportedSQLOperationException("unsupported TableSegment type: " + segment.getClass());
156 }
157 }