1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.binder.engine;
19
20 import lombok.RequiredArgsConstructor;
21 import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
22 import org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
23 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
24 import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
25 import org.apache.shardingsphere.infra.binder.engine.type.DALStatementBindEngine;
26 import org.apache.shardingsphere.infra.binder.engine.type.DCLStatementBindEngine;
27 import org.apache.shardingsphere.infra.binder.engine.type.DDLStatementBindEngine;
28 import org.apache.shardingsphere.infra.binder.engine.type.DMLStatementBindEngine;
29 import org.apache.shardingsphere.infra.hint.HintManager;
30 import org.apache.shardingsphere.infra.hint.HintValueContext;
31 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
32 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
33 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.DALStatement;
34 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dcl.DCLStatement;
35 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DDLStatement;
36 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DMLStatement;
37
38 import java.util.Optional;
39
40
41
42
43 @RequiredArgsConstructor
44 public final class SQLBindEngine {
45
46 private final ShardingSphereMetaData metaData;
47
48 private final String currentDatabaseName;
49
50 private final HintValueContext hintValueContext;
51
52
53
54
55
56
57
58 public SQLStatementContext bind(final SQLStatement sqlStatement) {
59 SQLStatement boundSQLStatement = isNeedBind() ? bindSQLStatement(sqlStatement) : sqlStatement;
60 return SQLStatementContextFactory.newInstance(metaData, boundSQLStatement, currentDatabaseName);
61 }
62
63 private SQLStatement bindSQLStatement(final SQLStatement sqlStatement) {
64 SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, sqlStatement);
65 Optional<DialectSQLBindEngine> dialectSQLBindEngine = DatabaseTypedSPILoader.findService(DialectSQLBindEngine.class, sqlStatement.getDatabaseType());
66 if (dialectSQLBindEngine.isPresent()) {
67 Optional<SQLStatement> boundSQLStatement = dialectSQLBindEngine.get().bind(sqlStatement, binderContext);
68 if (boundSQLStatement.isPresent()) {
69 return boundSQLStatement.get();
70 }
71 }
72 if (sqlStatement instanceof DMLStatement) {
73 return new DMLStatementBindEngine().bind((DMLStatement) sqlStatement, binderContext);
74 }
75 if (sqlStatement instanceof DDLStatement) {
76 return new DDLStatementBindEngine().bind((DDLStatement) sqlStatement, binderContext);
77 }
78 if (sqlStatement instanceof DCLStatement) {
79 return new DCLStatementBindEngine().bind((DCLStatement) sqlStatement, binderContext);
80 }
81 if (sqlStatement instanceof DALStatement) {
82 return new DALStatementBindEngine().bind((DALStatement) sqlStatement, binderContext);
83 }
84 return sqlStatement;
85 }
86
87 private boolean isNeedBind() {
88 return !hintValueContext.findHintDataSourceName().isPresent() && !HintManager.getDataSourceName().isPresent();
89 }
90 }