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.infra.binder.segment.expression;
19  
20  import lombok.AccessLevel;
21  import lombok.NoArgsConstructor;
22  import org.apache.shardingsphere.infra.binder.enums.SegmentType;
23  import org.apache.shardingsphere.infra.binder.segment.expression.impl.BinaryOperationExpressionBinder;
24  import org.apache.shardingsphere.infra.binder.segment.expression.impl.ColumnSegmentBinder;
25  import org.apache.shardingsphere.infra.binder.segment.expression.impl.ExistsSubqueryExpressionBinder;
26  import org.apache.shardingsphere.infra.binder.segment.expression.impl.FunctionExpressionSegmentBinder;
27  import org.apache.shardingsphere.infra.binder.segment.expression.impl.InExpressionBinder;
28  import org.apache.shardingsphere.infra.binder.segment.expression.impl.NotExpressionBinder;
29  import org.apache.shardingsphere.infra.binder.segment.expression.impl.SubqueryExpressionSegmentBinder;
30  import org.apache.shardingsphere.infra.binder.segment.from.TableSegmentBinderContext;
31  import org.apache.shardingsphere.infra.binder.statement.SQLStatementBinderContext;
32  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
33  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
34  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
35  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
36  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
37  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
38  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
39  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
40  
41  import java.util.LinkedHashMap;
42  import java.util.Map;
43  
44  /**
45   * Expression segment binder.
46   */
47  @NoArgsConstructor(access = AccessLevel.PRIVATE)
48  public final class ExpressionSegmentBinder {
49      
50      /**
51       * Bind expression segment with metadata.
52       *
53       * @param segment expression segment
54       * @param parentSegmentType parent segment type
55       * @param statementBinderContext statement binder context
56       * @param tableBinderContexts table binder contexts
57       * @param outerTableBinderContexts outer table binder contexts
58       * @return bounded expression segment
59       */
60      public static ExpressionSegment bind(final ExpressionSegment segment, final SegmentType parentSegmentType, final SQLStatementBinderContext statementBinderContext,
61                                           final Map<String, TableSegmentBinderContext> tableBinderContexts, final Map<String, TableSegmentBinderContext> outerTableBinderContexts) {
62          if (segment instanceof BinaryOperationExpression) {
63              return BinaryOperationExpressionBinder.bind((BinaryOperationExpression) segment, parentSegmentType, statementBinderContext, tableBinderContexts, outerTableBinderContexts);
64          }
65          if (segment instanceof ExistsSubqueryExpression) {
66              return ExistsSubqueryExpressionBinder.bind((ExistsSubqueryExpression) segment, statementBinderContext, tableBinderContexts);
67          }
68          if (segment instanceof SubqueryExpressionSegment) {
69              Map<String, TableSegmentBinderContext> newOuterTableBinderContexts = new LinkedHashMap<>();
70              newOuterTableBinderContexts.putAll(outerTableBinderContexts);
71              newOuterTableBinderContexts.putAll(tableBinderContexts);
72              return SubqueryExpressionSegmentBinder.bind((SubqueryExpressionSegment) segment, statementBinderContext, newOuterTableBinderContexts);
73          }
74          if (segment instanceof InExpression) {
75              return InExpressionBinder.bind((InExpression) segment, parentSegmentType, statementBinderContext, tableBinderContexts, outerTableBinderContexts);
76          }
77          if (segment instanceof NotExpression) {
78              return NotExpressionBinder.bind((NotExpression) segment, parentSegmentType, statementBinderContext, tableBinderContexts);
79          }
80          if (segment instanceof ColumnSegment) {
81              return ColumnSegmentBinder.bind((ColumnSegment) segment, parentSegmentType, statementBinderContext, tableBinderContexts, outerTableBinderContexts);
82          }
83          if (segment instanceof FunctionSegment) {
84              return FunctionExpressionSegmentBinder.bind((FunctionSegment) segment, parentSegmentType, statementBinderContext, tableBinderContexts, outerTableBinderContexts);
85          }
86          // TODO support more ExpressionSegment bind
87          return segment;
88      }
89  }