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.engine;
19  
20  import lombok.RequiredArgsConstructor;
21  import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
22  import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory;
23  import org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementBinder;
24  import org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
25  import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder;
26  import org.apache.shardingsphere.infra.binder.statement.dml.MergeStatementBinder;
27  import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
28  import org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementBinder;
29  import org.apache.shardingsphere.infra.hint.HintValueContext;
30  import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
31  import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
32  import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
33  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
34  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
35  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
36  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.MergeStatement;
37  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
38  import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
39  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCursorStatement;
40  
41  import java.util.List;
42  
43  /**
44   * SQL bind engine.
45   */
46  @RequiredArgsConstructor
47  public final class SQLBindEngine {
48      
49      private final ShardingSphereMetaData metaData;
50      
51      private final String defaultDatabaseName;
52      
53      private final HintValueContext hintValueContext;
54      
55      /**
56       * Bind SQL statement with metadata.
57       *
58       * @param sqlStatement SQL statement
59       * @param params parameters
60       * @return SQL statement context
61       */
62      public SQLStatementContext bind(final SQLStatement sqlStatement, final List<Object> params) {
63          SQLStatement buoundedSQLStatement = bind(sqlStatement, metaData, defaultDatabaseName);
64          return SQLStatementContextFactory.newInstance(metaData, params, buoundedSQLStatement, defaultDatabaseName);
65      }
66      
67      private SQLStatement bind(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
68          if (hintValueContext.findHintDataSourceName().isPresent()) {
69              return statement;
70          }
71          if (statement instanceof DMLStatement) {
72              return bindDMLStatement(statement, metaData, defaultDatabaseName);
73          }
74          if (statement instanceof DDLStatement) {
75              return bindDDLStatement(statement, metaData, defaultDatabaseName);
76          }
77          return statement;
78      }
79      
80      private static SQLStatement bindDMLStatement(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
81          if (statement instanceof SelectStatement) {
82              return new SelectStatementBinder().bind((SelectStatement) statement, metaData, defaultDatabaseName);
83          }
84          if (statement instanceof InsertStatement) {
85              return new InsertStatementBinder().bind((InsertStatement) statement, metaData, defaultDatabaseName);
86          }
87          if (statement instanceof UpdateStatement) {
88              return new UpdateStatementBinder().bind((UpdateStatement) statement, metaData, defaultDatabaseName);
89          }
90          if (statement instanceof DeleteStatement) {
91              return new DeleteStatementBinder().bind((DeleteStatement) statement, metaData, defaultDatabaseName);
92          }
93          if (statement instanceof MergeStatement) {
94              return new MergeStatementBinder().bind((MergeStatement) statement, metaData, defaultDatabaseName);
95          }
96          return statement;
97      }
98      
99      private static SQLStatement bindDDLStatement(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
100         if (statement instanceof OpenGaussCursorStatement) {
101             return new CursorStatementBinder().bind((OpenGaussCursorStatement) statement, metaData, defaultDatabaseName);
102         }
103         return statement;
104     }
105 }