View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Expression converter.
73   */
74  @NoArgsConstructor(access = AccessLevel.PRIVATE)
75  public final class ExpressionConverter {
76      
77      /**
78       * Convert expression segment to sql node.
79       * 
80       * @param segment expression segment
81       * @return sql node
82       * @throws UnsupportedSQLOperationException unsupported SQL operation exception
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              // TODO
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 }