This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new e9bf38f Add LogicSQLContext to refactor JDBCExecutorWrapper (#7525)
e9bf38f is described below
commit e9bf38f6dc87be48c2925d93b97c50f84c3d496f
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 20 22:16:52 2020 +0800
Add LogicSQLContext to refactor JDBCExecutorWrapper (#7525)
* For code format
* Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
* Add LogicSQLContext
* Use LogicSQLContext on SQLExecuteEngine
* Use LogicSQLContext on JDBCDatabaseCommunicationEngine
* Use LogicSQLContext on ShardingCTLExplainBackendHandler
* Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
* Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
* Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
* Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
* Refactor JDBCExecutorWrapper
* Refactor JDBCExecutorWrapper
---
.../DatabaseCommunicationEngineFactory.java | 12 +++--
.../jdbc/JDBCDatabaseCommunicationEngine.java | 34 +++++++------
.../jdbc/execute/SQLExecuteEngine.java | 5 +-
.../execute/engine/jdbc/JDBCExecuteEngine.java | 8 ++--
.../jdbc/wrapper/JDBCExecutorWrapper.java | 56 ++++++++++++++++++----
.../LogicSQLContext.java} | 38 +++++++--------
.../wrapper/PreparedStatementExecutorWrapper.java | 49 +++----------------
.../jdbc/wrapper/StatementExecutorWrapper.java | 52 +++-----------------
.../text/admin/ShowTablesBackendHandler.java | 6 +--
.../backend/text/query/QueryBackendHandler.java | 6 +--
.../explain/ShardingCTLExplainBackendHandler.java | 12 +++--
11 files changed, 123 insertions(+), 155 deletions(-)
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
index b6b7d68..a344bbb 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
@@ -23,11 +23,13 @@ import
org.apache.shardingsphere.infra.context.SchemaContext;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.JDBCDatabaseCommunicationEngine;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.engine.jdbc.JDBCExecuteEngine;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.PreparedStatementExecutorWrapper;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.StatementExecutorWrapper;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import java.util.Collections;
import java.util.List;
/**
@@ -53,11 +55,12 @@ public final class DatabaseCommunicationEngineFactory {
* @param sqlStatement sql statement
* @param sql SQL to be executed
* @param backendConnection backend connection
- * @return instance of text protocol backend handler
+ * @return text protocol backend handler
*/
public DatabaseCommunicationEngine newTextProtocolInstance(final
SQLStatement sqlStatement, final String sql, final BackendConnection
backendConnection) {
SchemaContext schemaContext =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
- return new JDBCDatabaseCommunicationEngine(sql, backendConnection, new
JDBCExecuteEngine(backendConnection, new
StatementExecutorWrapper(schemaContext, sqlStatement)));
+ LogicSQLContext logicSQLContext = new LogicSQLContext(schemaContext,
sql, Collections.emptyList(), sqlStatement);
+ return new JDBCDatabaseCommunicationEngine(logicSQLContext,
backendConnection, new JDBCExecuteEngine(backendConnection, new
StatementExecutorWrapper()));
}
/**
@@ -67,10 +70,11 @@ public final class DatabaseCommunicationEngineFactory {
* @param sql SQL to be executed
* @param parameters SQL parameters
* @param backendConnection backend connection
- * @return instance of binary protocol backend handler
+ * @return binary protocol backend handler
*/
public DatabaseCommunicationEngine newBinaryProtocolInstance(final
SQLStatement sqlStatement, final String sql, final List<Object> parameters,
final BackendConnection backendConnection) {
SchemaContext schemaContext =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
- return new JDBCDatabaseCommunicationEngine(sql, backendConnection, new
JDBCExecuteEngine(backendConnection, new
PreparedStatementExecutorWrapper(schemaContext, sqlStatement, parameters)));
+ LogicSQLContext logicSQLContext = new LogicSQLContext(schemaContext,
sql, parameters, sqlStatement);
+ return new JDBCDatabaseCommunicationEngine(logicSQLContext,
backendConnection, new JDBCExecuteEngine(backendConnection, new
PreparedStatementExecutorWrapper()));
}
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index cd59cab..3f8c808 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -17,11 +17,9 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc;
-import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.governance.core.event.persist.MetaDataPersistEvent;
import
org.apache.shardingsphere.governance.core.eventbus.ShardingSphereEventBus;
import
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
-import org.apache.shardingsphere.infra.context.SchemaContext;
import org.apache.shardingsphere.infra.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
import org.apache.shardingsphere.infra.executor.sql.log.SQLLogger;
@@ -35,6 +33,7 @@ import
org.apache.shardingsphere.infra.rule.DataNodeRoutedRule;
import
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.SQLExecuteEngine;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.exception.TableModifyInTransactionException;
import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -56,38 +55,34 @@ import java.util.Optional;
/**
* Database access engine for JDBC.
*/
-@RequiredArgsConstructor
public final class JDBCDatabaseCommunicationEngine implements
DatabaseCommunicationEngine {
- private final String sql;
+ private final LogicSQLContext logicSQLContext;
private final BackendConnection connection;
private final SQLExecuteEngine executeEngine;
- private final SchemaContext schema;
-
private BackendResponse response;
private MergedResult mergedResult;
- public JDBCDatabaseCommunicationEngine(final String sql, final
BackendConnection backendConnection, final SQLExecuteEngine sqlExecuteEngine) {
- this.sql = sql;
+ public JDBCDatabaseCommunicationEngine(final LogicSQLContext
logicSQLContext, final BackendConnection backendConnection, final
SQLExecuteEngine sqlExecuteEngine) {
+ this.logicSQLContext = logicSQLContext;
connection = backendConnection;
executeEngine = sqlExecuteEngine;
- schema =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
}
@Override
public BackendResponse execute() throws SQLException {
- ExecutionContext executionContext =
executeEngine.generateExecutionContext(sql);
+ ExecutionContext executionContext =
executeEngine.generateExecutionContext(logicSQLContext);
logSQL(executionContext);
return doExecute(executionContext);
}
private void logSQL(final ExecutionContext executionContext) {
if
(ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW))
{
- SQLLogger.logSQL(sql,
ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE),
executionContext);
+ SQLLogger.logSQL(logicSQLContext.getSql(),
ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE),
executionContext);
}
}
@@ -122,16 +117,17 @@ public final class JDBCDatabaseCommunicationEngine
implements DatabaseCommunicat
}
Optional<MetaDataRefreshStrategy> refreshStrategy =
MetaDataRefreshStrategyFactory.newInstance(sqlStatementContext);
if (refreshStrategy.isPresent()) {
-
refreshStrategy.get().refreshMetaData(schema.getSchema().getMetaData(),
ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
- schema.getSchema().getDataSources(), sqlStatementContext,
this::loadTableMetaData);
- ShardingSphereEventBus.getInstance().post(new
MetaDataPersistEvent(schema.getName(),
schema.getSchema().getMetaData().getRuleSchemaMetaData()));
+
refreshStrategy.get().refreshMetaData(logicSQLContext.getSchemaContext().getSchema().getMetaData(),
ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
+
logicSQLContext.getSchemaContext().getSchema().getDataSources(),
sqlStatementContext, this::loadTableMetaData);
+ ShardingSphereEventBus.getInstance().post(
+ new
MetaDataPersistEvent(logicSQLContext.getSchemaContext().getName(),
logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData()));
}
}
private Optional<TableMetaData> loadTableMetaData(final String tableName)
throws SQLException {
- RuleSchemaMetaDataLoader loader = new
RuleSchemaMetaDataLoader(schema.getSchema().getRules());
+ RuleSchemaMetaDataLoader loader = new
RuleSchemaMetaDataLoader(logicSQLContext.getSchemaContext().getSchema().getRules());
return
loader.load(ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
- schema.getSchema().getDataSources(), tableName,
ProxyContext.getInstance().getSchemaContexts().getProps());
+
logicSQLContext.getSchemaContext().getSchema().getDataSources(), tableName,
ProxyContext.getInstance().getSchemaContexts().getProps());
}
private BackendResponse merge(final SQLStatementContext<?>
sqlStatementContext) throws SQLException {
@@ -150,13 +146,15 @@ public final class JDBCDatabaseCommunicationEngine
implements DatabaseCommunicat
}
private boolean isNeedAccumulate(final SQLStatementContext<?>
sqlStatementContext) {
- Optional<DataNodeRoutedRule> dataNodeRoutedRule =
schema.getSchema().getRules().stream().filter(each -> each instanceof
DataNodeRoutedRule).findFirst().map(rule -> (DataNodeRoutedRule) rule);
+ Optional<DataNodeRoutedRule> dataNodeRoutedRule =
+
logicSQLContext.getSchemaContext().getSchema().getRules().stream().filter(each
-> each instanceof DataNodeRoutedRule).findFirst().map(rule ->
(DataNodeRoutedRule) rule);
return dataNodeRoutedRule.isPresent() &&
dataNodeRoutedRule.get().isNeedAccumulate(sqlStatementContext.getTablesContext().getTableNames());
}
private MergedResult mergeQuery(final SQLStatementContext<?>
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
MergeEngine mergeEngine = new
MergeEngine(ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
-
schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
ProxyContext.getInstance().getSchemaContexts().getProps(),
schema.getSchema().getRules());
+
logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
+ ProxyContext.getInstance().getSchemaContexts().getProps(),
logicSQLContext.getSchemaContext().getSchema().getRules());
return mergeEngine.merge(queryResults, sqlStatementContext);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
index a0b203c..55b7ba9 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc.execute;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
import java.sql.SQLException;
@@ -30,11 +31,11 @@ public interface SQLExecuteEngine {
/**
* Generate execution context.
*
- * @param sql SQL
+ * @param logicSQLContext logic SQL context
* @return execution context
* @throws SQLException SQL exception
*/
- ExecutionContext generateExecutionContext(String sql) throws SQLException;
+ ExecutionContext generateExecutionContext(LogicSQLContext logicSQLContext)
throws SQLException;
/**
* Execute SQL.
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
index a319da1..a422393 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
@@ -40,6 +40,7 @@ import
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.SQLExecuteEngine;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.JDBCExecutorWrapper;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
import org.apache.shardingsphere.proxy.backend.context.BackendExecutorContext;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -76,8 +77,8 @@ public final class JDBCExecuteEngine implements
SQLExecuteEngine {
}
@Override
- public ExecutionContext generateExecutionContext(final String sql) throws
SQLException {
- return jdbcExecutorWrapper.generateExecutionContext(sql);
+ public ExecutionContext generateExecutionContext(final LogicSQLContext
logicSQLContext) {
+ return jdbcExecutorWrapper.generateExecutionContext(logicSQLContext);
}
@Override
@@ -117,7 +118,8 @@ public final class JDBCExecuteEngine implements
SQLExecuteEngine {
@SuppressWarnings({"unchecked", "rawtypes"})
private Collection<InputGroup<StatementExecuteUnit>>
generateInputGroups(final Collection<ExecutionUnit> executionUnits, final int
maxConnectionsSizePerQuery, final boolean isReturnGeneratedKeys,
final RouteContext routeContext) throws SQLException {
- ExecuteGroupEngine executeGroupEngine =
jdbcExecutorWrapper.getExecuteGroupEngine(backendConnection,
maxConnectionsSizePerQuery, new StatementOption(isReturnGeneratedKeys));
+ Collection<ShardingSphereRule> rules =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName()).getSchema().getRules();
+ ExecuteGroupEngine executeGroupEngine =
jdbcExecutorWrapper.getExecuteGroupEngine(backendConnection,
maxConnectionsSizePerQuery, new StatementOption(isReturnGeneratedKeys), rules);
return (Collection<InputGroup<StatementExecuteUnit>>)
executeGroupEngine.generate(routeContext, executionUnits);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
index b2c2984..f79de38 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
@@ -18,25 +18,64 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
+import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
+import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
import org.apache.shardingsphere.infra.executor.sql.group.ExecuteGroupEngine;
import
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
+import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
+import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
+import org.apache.shardingsphere.infra.route.DataNodeRouter;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.infra.route.context.RouteResult;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
+import
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.Collection;
+import java.util.List;
/**
- * JDBC executor wrapper.
+ * JDBC Executor wrapper.
*/
-public interface JDBCExecutorWrapper {
+public abstract class JDBCExecutorWrapper {
/**
* Generate execution context.
- *
- * @param sql SQL
+ *
+ * @param logicSQLContext logic SQL context
* @return execution context
*/
- ExecutionContext generateExecutionContext(String sql);
+ public final ExecutionContext generateExecutionContext(final
LogicSQLContext logicSQLContext) {
+ Collection<ShardingSphereRule> rules =
logicSQLContext.getSchemaContext().getSchema().getRules();
+ if (rules.isEmpty()) {
+ return createDefaultExecutionContext(logicSQLContext);
+ }
+ DataNodeRouter router = new
DataNodeRouter(logicSQLContext.getSchemaContext().getSchema().getMetaData(),
ProxyContext.getInstance().getSchemaContexts().getProps(), rules);
+ RouteContext routeContext =
router.route(logicSQLContext.getSqlStatement(), logicSQLContext.getSql(),
logicSQLContext.getParameters());
+ SQLRewriteEntry rewriteEntry = new
SQLRewriteEntry(logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
+ ProxyContext.getInstance().getSchemaContexts().getProps(),
rules);
+ SQLRewriteResult sqlRewriteResult =
rewriteEntry.rewrite(logicSQLContext.getSql(),
cloneParameters(logicSQLContext.getParameters()), routeContext);
+ SQLStatementContext<?> sqlStatementContext =
routeContext.getSqlStatementContext();
+ Collection<ExecutionUnit> executionUnits =
ExecutionContextBuilder.build(logicSQLContext.getSchemaContext().getSchema().getMetaData(),
sqlRewriteResult, sqlStatementContext);
+ return new ExecutionContext(sqlStatementContext, executionUnits,
routeContext);
+ }
+
+ @SuppressWarnings("unchecked")
+ private ExecutionContext createDefaultExecutionContext(final
LogicSQLContext logicSQLContext) {
+ String dataSourceName =
logicSQLContext.getSchemaContext().getSchema().getDataSources().isEmpty()
+ ? "" :
logicSQLContext.getSchemaContext().getSchema().getDataSources().keySet().iterator().next();
+ SQLStatementContext<?> sqlStatementContext = new
CommonSQLStatementContext(logicSQLContext.getSqlStatement());
+ ExecutionUnit executionUnit = new ExecutionUnit(dataSourceName, new
SQLUnit(logicSQLContext.getSql(), logicSQLContext.getParameters()));
+ RouteContext routeContext = new RouteContext(sqlStatementContext,
logicSQLContext.getParameters(), new RouteResult());
+ return new ExecutionContext(sqlStatementContext, executionUnit,
routeContext);
+ }
+
+ protected abstract List<Object> cloneParameters(List<Object> parameters);
/**
* Get execute group engine.
@@ -44,18 +83,19 @@ public interface JDBCExecutorWrapper {
* @param backendConnection backend connection
* @param maxConnectionsSizePerQuery max connections size per query
* @param option statement option
+ * @param rules rules
* @return execute group engine
*/
- ExecuteGroupEngine<?> getExecuteGroupEngine(BackendConnection
backendConnection, int maxConnectionsSizePerQuery, StatementOption option);
+ public abstract ExecuteGroupEngine<?>
getExecuteGroupEngine(BackendConnection backendConnection, int
maxConnectionsSizePerQuery, StatementOption option,
Collection<ShardingSphereRule> rules);
/**
* Execute SQL.
- *
+ *
* @param statement statement
* @param sql SQL to be executed
* @param isReturnGeneratedKeys is return generated keys
* @return {@code true} is for query, {@code false} is for update
* @throws SQLException SQL exception
*/
- boolean execute(Statement statement, String sql, boolean
isReturnGeneratedKeys) throws SQLException;
+ public abstract boolean execute(Statement statement, String sql, boolean
isReturnGeneratedKeys) throws SQLException;
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
similarity index 54%
copy from
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
copy to
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
index a0b203c..245bce4 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
@@ -15,33 +15,27 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.communication.jdbc.execute;
+package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.context.SchemaContext;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import java.sql.SQLException;
+import java.util.List;
/**
- * SQL Execute engine.
+ * Logic SQL context.
*/
-public interface SQLExecuteEngine {
+@RequiredArgsConstructor
+@Getter
+public final class LogicSQLContext {
- /**
- * Generate execution context.
- *
- * @param sql SQL
- * @return execution context
- * @throws SQLException SQL exception
- */
- ExecutionContext generateExecutionContext(String sql) throws SQLException;
+ private final SchemaContext schemaContext;
- /**
- * Execute SQL.
- *
- * @param executionContext execution context
- * @return execute response
- * @throws SQLException SQL exception
- */
- BackendResponse execute(ExecutionContext executionContext) throws
SQLException;
+ private final String sql;
+
+ private final List<Object> parameters;
+
+ private final SQLStatement sqlStatement;
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
index d1aa221..7a94687 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
@@ -17,26 +17,11 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.context.SchemaContext;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
-import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
import org.apache.shardingsphere.infra.executor.sql.group.ExecuteGroupEngine;
import
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.PreparedStatementExecuteGroupEngine;
import
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
-import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
-import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
-import org.apache.shardingsphere.infra.route.DataNodeRouter;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
-import
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@@ -48,39 +33,17 @@ import java.util.List;
/**
* Executor wrapper for prepared statement.
*/
-@RequiredArgsConstructor
-public final class PreparedStatementExecutorWrapper implements
JDBCExecutorWrapper {
+public final class PreparedStatementExecutorWrapper extends
JDBCExecutorWrapper {
- private static final ProxyContext PROXY_SCHEMA_CONTEXTS =
ProxyContext.getInstance();
-
- private final SchemaContext schema;
-
- private final SQLStatement sqlStatement;
-
- private final List<Object> parameters;
-
- @SuppressWarnings("unchecked")
@Override
- public ExecutionContext generateExecutionContext(final String sql) {
- Collection<ShardingSphereRule> rules = schema.getSchema().getRules();
- if (rules.isEmpty()) {
- SQLStatementContext<?> sqlStatementContext = new
CommonSQLStatementContext(sqlStatement);
- return new ExecutionContext(sqlStatementContext, new
ExecutionUnit(schema.getSchema().getDataSources().keySet().iterator().next(),
new SQLUnit(sql, parameters)),
- new RouteContext(sqlStatementContext, parameters, new
RouteResult()));
- }
- DataNodeRouter dataNodeRouter = new
DataNodeRouter(schema.getSchema().getMetaData(),
PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
- RouteContext routeContext = dataNodeRouter.route(sqlStatement, sql,
parameters);
- SQLRewriteEntry sqlRewriteEntry = new
SQLRewriteEntry(schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
- PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
- SQLRewriteResult sqlRewriteResult = sqlRewriteEntry.rewrite(sql, new
ArrayList<>(parameters), routeContext);
- SQLStatementContext<?> sqlStatementContext =
routeContext.getSqlStatementContext();
- Collection<ExecutionUnit> executionUnits =
ExecutionContextBuilder.build(schema.getSchema().getMetaData(),
sqlRewriteResult, sqlStatementContext);
- return new ExecutionContext(sqlStatementContext, executionUnits,
routeContext);
+ protected List<Object> cloneParameters(final List<Object> parameters) {
+ return new ArrayList<>(parameters);
}
@Override
- public ExecuteGroupEngine<?> getExecuteGroupEngine(final BackendConnection
backendConnection, final int maxConnectionsSizePerQuery, final StatementOption
option) {
- return new
PreparedStatementExecuteGroupEngine(maxConnectionsSizePerQuery,
backendConnection, option, schema.getSchema().getRules());
+ public ExecuteGroupEngine<?> getExecuteGroupEngine(final BackendConnection
backendConnection,
+ final int
maxConnectionsSizePerQuery, final StatementOption option, final
Collection<ShardingSphereRule> rules) {
+ return new
PreparedStatementExecuteGroupEngine(maxConnectionsSizePerQuery,
backendConnection, option, rules);
}
@Override
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
index 51054a1..7dea87b 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
@@ -17,73 +17,35 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.context.SchemaContext;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
-import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
import
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementExecuteGroupEngine;
import
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
-import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
-import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
-import org.apache.shardingsphere.infra.route.DataNodeRouter;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
-import
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
/**
* Executor wrapper for statement.
*/
-@RequiredArgsConstructor
-public final class StatementExecutorWrapper implements JDBCExecutorWrapper {
-
- private static final ProxyContext PROXY_SCHEMA_CONTEXTS =
ProxyContext.getInstance();
-
- private final SchemaContext schema;
-
- private final SQLStatement sqlStatement;
+public final class StatementExecutorWrapper extends JDBCExecutorWrapper {
@Override
- public ExecutionContext generateExecutionContext(final String sql) {
- Collection<ShardingSphereRule> rules = schema.getSchema().getRules();
- if (rules.isEmpty()) {
- return createExecutionContext(sql);
- }
- DataNodeRouter router = new
DataNodeRouter(schema.getSchema().getMetaData(),
PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
- RouteContext routeContext = router.route(sqlStatement, sql,
Collections.emptyList());
- SQLRewriteResult sqlRewriteResult = new
SQLRewriteEntry(schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
- PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(),
rules).rewrite(sql, Collections.emptyList(), routeContext);
- SQLStatementContext<?> sqlStatementContext =
routeContext.getSqlStatementContext();
- Collection<ExecutionUnit> executionUnits =
ExecutionContextBuilder.build(schema.getSchema().getMetaData(),
sqlRewriteResult, sqlStatementContext);
- return new ExecutionContext(sqlStatementContext, executionUnits,
routeContext);
+ protected List<Object> cloneParameters(final List<Object> parameters) {
+ return Collections.emptyList();
}
@Override
- public StatementExecuteGroupEngine getExecuteGroupEngine(final
BackendConnection backendConnection, final int maxConnectionsSizePerQuery,
final StatementOption option) {
- return new StatementExecuteGroupEngine(maxConnectionsSizePerQuery,
backendConnection, option, schema.getSchema().getRules());
+ public StatementExecuteGroupEngine getExecuteGroupEngine(final
BackendConnection backendConnection,
+ final int
maxConnectionsSizePerQuery, final StatementOption option, final
Collection<ShardingSphereRule> rules) {
+ return new StatementExecuteGroupEngine(maxConnectionsSizePerQuery,
backendConnection, option, rules);
}
@Override
public boolean execute(final Statement statement, final String sql, final
boolean isReturnGeneratedKeys) throws SQLException {
return statement.execute(sql, isReturnGeneratedKeys ?
Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS);
}
-
- @SuppressWarnings("unchecked")
- private ExecutionContext createExecutionContext(final String sql) {
- String dataSource = schema.getSchema().getDataSources().isEmpty() ? ""
: schema.getSchema().getDataSources().keySet().iterator().next();
- SQLStatementContext<?> sqlStatementContext = new
CommonSQLStatementContext(sqlStatement);
- ExecutionUnit executionUnit = new ExecutionUnit(dataSource, new
SQLUnit(sql, Collections.emptyList()));
- return new ExecutionContext(sqlStatementContext, executionUnit, new
RouteContext(sqlStatementContext, Collections.emptyList(), new RouteResult()));
- }
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
index c41955b..1aef71e 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
@@ -53,11 +53,11 @@ public final class ShowTablesBackendHandler implements
TextProtocolBackendHandle
@Override
public BackendResponse execute() throws SQLException {
- SchemaContext context =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
- if (null == context) {
+ SchemaContext schemaContext =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+ if (null == schemaContext) {
throw new NoDatabaseSelectedException();
}
- if (!context.isComplete()) {
+ if (!schemaContext.isComplete()) {
return getDefaultQueryResponse(backendConnection.getSchemaName());
}
// TODO Get all tables from meta data.
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
index e33c6cc..6edd029 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
@@ -53,11 +53,11 @@ public final class QueryBackendHandler implements
TextProtocolBackendHandler {
@Override
public BackendResponse execute() throws SQLException {
- SchemaContext context =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
- if (null == context) {
+ SchemaContext schemaContext =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+ if (null == schemaContext) {
throw new NoDatabaseSelectedException();
}
- if (!context.isComplete()) {
+ if (!schemaContext.isComplete()) {
return getDefaultQueryResponse(backendConnection.getSchemaName());
}
databaseCommunicationEngine =
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatement, sql,
backendConnection);
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
index 28cfcb0..0196816 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.context.SchemaContext;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
import
org.apache.shardingsphere.infra.executor.sql.raw.execute.result.query.QueryHeader;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
import
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.StatementExecutorWrapper;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -29,9 +30,11 @@ import
org.apache.shardingsphere.proxy.backend.response.query.QueryData;
import org.apache.shardingsphere.proxy.backend.response.query.QueryResponse;
import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
import
org.apache.shardingsphere.proxy.backend.text.sctl.exception.InvalidShardingCTLFormatException;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.sql.Types;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
@@ -56,10 +59,11 @@ public final class ShardingCTLExplainBackendHandler
implements TextProtocolBacke
if (!explainStatement.isPresent()) {
throw new InvalidShardingCTLFormatException(sql);
}
- SchemaContext schema =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
- StatementExecutorWrapper statementExecutorWrapper =
- new StatementExecutorWrapper(schema,
schema.getRuntimeContext().getSqlParserEngine().parse(explainStatement.get().getSql(),
false));
- executionUnits =
statementExecutorWrapper.generateExecutionContext(explainStatement.get().getSql()).getExecutionUnits().iterator();
+ SchemaContext schemaContext =
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+ StatementExecutorWrapper statementExecutorWrapper = new
StatementExecutorWrapper();
+ SQLStatement sqlStatement =
schemaContext.getRuntimeContext().getSqlParserEngine().parse(explainStatement.get().getSql(),
false);
+ executionUnits = statementExecutorWrapper.generateExecutionContext(
+ new LogicSQLContext(schemaContext,
explainStatement.get().getSql(), Collections.emptyList(),
sqlStatement)).getExecutionUnits().iterator();
queryHeaders = new ArrayList<>(2);
queryHeaders.add(new QueryHeader("", "", "datasource_name", "", 255,
Types.CHAR, 0, false, false, false, false));
queryHeaders.add(new QueryHeader("", "", "sql", "", 255, Types.CHAR,
0, false, false, false, false));