You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/06/19 06:21:05 UTC
[shardingsphere] branch master updated: Refactor DatabaseCommunicationEngine (#18423)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 f51ace448a1 Refactor DatabaseCommunicationEngine (#18423)
f51ace448a1 is described below
commit f51ace448a172a818b53be3a4dfa686137fe9cd5
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Jun 19 14:20:58 2022 +0800
Refactor DatabaseCommunicationEngine (#18423)
---
.../mode/manager/ContextManager.java | 3 +-
.../communication/DatabaseCommunicationEngine.java | 23 ++-------
.../jdbc/JDBCDatabaseCommunicationEngine.java | 5 +-
.../response/header/query/QueryHeaderBuilder.java | 6 +--
.../header/query/QueryHeaderBuilderEngine.java | 15 ++----
.../header/query/impl/MySQLQueryHeaderBuilder.java | 25 ++++++----
.../query/impl/OpenGaussQueryHeaderBuilder.java | 10 ++--
.../query/impl/PostgreSQLQueryHeaderBuilder.java | 8 ++-
.../admin/DatabaseAdminQueryBackendHandler.java | 15 +-----
.../jdbc/JDBCDatabaseCommunicationEngineTest.java | 19 +------
.../query/impl/MySQLQueryHeaderBuilderTest.java | 58 +++++++---------------
.../impl/OpenGaussQueryHeaderBuilderTest.java | 4 +-
.../impl/PostgreSQLQueryHeaderBuilderTest.java | 2 +-
13 files changed, 59 insertions(+), 134 deletions(-)
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 18734aebb9a..41a6c88b8f4 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -651,8 +651,7 @@ public final class ContextManager implements AutoCloseable {
private void setInstanceContext() {
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> each.setInstanceContext(instanceContext));
- metaDataContexts.getMetaData().getDatabases()
- .forEach((key, value) -> value.getRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> each.setInstanceContext(instanceContext)));
+ metaDataContexts.getMetaData().getDatabases().forEach((key, value) -> value.getRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> each.setInstanceContext(instanceContext)));
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index 34ca5592d90..4d39260c60d 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -21,7 +21,6 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -121,30 +120,18 @@ public abstract class DatabaseCommunicationEngine<T> {
protected List<QueryHeader> createQueryHeaders(final ExecutionContext executionContext, final QueryResult queryResultSample) throws SQLException {
int columnCount = getColumnCount(executionContext, queryResultSample);
List<QueryHeader> result = new ArrayList<>(columnCount);
- LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(database);
QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(database.getProtocolType());
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
- result.add(createQueryHeader(queryHeaderBuilderEngine, executionContext, queryResultSample, database, columnIndex, dataNodeContainedRule));
+ result.add(createQueryHeader(queryHeaderBuilderEngine, executionContext, queryResultSample, database, columnIndex));
}
return result;
}
- protected LazyInitializer<DataNodeContainedRule> getDataNodeContainedRuleLazyInitializer(final ShardingSphereDatabase database) {
- return new LazyInitializer<DataNodeContainedRule>() {
-
- @Override
- protected DataNodeContainedRule initialize() {
- return null != database ? database.getRuleMetaData().findSingleRule(DataNodeContainedRule.class).orElse(null) : null;
- }
- };
- }
-
- protected QueryHeader createQueryHeader(final QueryHeaderBuilderEngine queryHeaderBuilderEngine, final ExecutionContext executionContext, final QueryResult queryResultSample,
- final ShardingSphereDatabase database, final int columnIndex,
- final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+ protected QueryHeader createQueryHeader(final QueryHeaderBuilderEngine queryHeaderBuilderEngine, final ExecutionContext executionContext,
+ final QueryResult queryResultSample, final ShardingSphereDatabase database, final int columnIndex) throws SQLException {
return hasSelectExpandProjections(executionContext.getSqlStatementContext()) ? queryHeaderBuilderEngine.build(
- ((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), database, columnIndex, dataNodeContainedRule)
- : queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database, columnIndex, dataNodeContainedRule);
+ ((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), database, columnIndex)
+ : queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database, columnIndex);
}
protected int getColumnCount(final ExecutionContext executionContext, final QueryResult queryResultSample) throws SQLException {
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 f23cacc200f..6e4a567c1f7 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
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc;
import lombok.SneakyThrows;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -39,7 +38,6 @@ import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
import org.apache.shardingsphere.infra.federation.executor.FederationExecutorFactory;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtil;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
import org.apache.shardingsphere.proxy.backend.communication.ProxySQLExecutor;
@@ -167,10 +165,9 @@ public final class JDBCDatabaseCommunicationEngine extends DatabaseCommunication
int columnCount = resultSet.getMetaData().getColumnCount();
setQueryHeaders(new ArrayList<>(columnCount));
ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(backendConnection.getConnectionSession().getDatabaseName());
- LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(database);
QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(null == database ? null : database.getProtocolType());
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
- getQueryHeaders().add(queryHeaderBuilderEngine.build(new JDBCQueryResultMetaData(resultSet.getMetaData()), database, columnIndex, dataNodeContainedRule));
+ getQueryHeaders().add(queryHeaderBuilderEngine.build(new JDBCQueryResultMetaData(resultSet.getMetaData()), database, columnIndex));
}
setMergedResult(new IteratorStreamMergedResult(Collections.singletonList(new JDBCStreamQueryResult(resultSet))));
return new QueryResponseHeader(getQueryHeaders());
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
index fd98aac8a6a..e6228cda64a 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilder.java
@@ -17,10 +17,8 @@
package org.apache.shardingsphere.proxy.backend.response.header.query;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.spi.type.required.RequiredSPI;
import org.apache.shardingsphere.spi.type.typed.TypedSPI;
@@ -41,10 +39,8 @@ public interface QueryHeaderBuilder extends TypedSPI, RequiredSPI {
* @param columnName column name
* @param columnLabel column label
* @param columnIndex column index
- * @param dataNodeContainedRule data node contained rule
* @return query header
* @throws SQLException SQL exception
*/
- QueryHeader build(QueryResultMetaData queryResultMetaData, ShardingSphereDatabase database,
- String columnName, String columnLabel, int columnIndex, LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException;
+ QueryHeader build(QueryResultMetaData queryResultMetaData, ShardingSphereDatabase database, String columnName, String columnLabel, int columnIndex) throws SQLException;
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
index 2efae1d1d1d..cf8ab72f360 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.proxy.backend.response.header.query;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.binder.segment.select.projection.DerivedColumn;
import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
@@ -26,7 +25,6 @@ import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Col
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import java.sql.SQLException;
@@ -44,15 +42,13 @@ public final class QueryHeaderBuilderEngine {
* @param queryResultMetaData query result meta data
* @param database database
* @param columnIndex column index
- * @param dataNodeContainedRule data node contained rule
* @return query header
* @throws SQLException SQL exception
*/
- public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database,
- final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+ public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database, final int columnIndex) throws SQLException {
String columnName = queryResultMetaData.getColumnName(columnIndex);
String columnLabel = queryResultMetaData.getColumnLabel(columnIndex);
- return QueryHeaderBuilderFactory.getInstance(databaseType).build(queryResultMetaData, database, columnName, columnLabel, columnIndex, dataNodeContainedRule);
+ return QueryHeaderBuilderFactory.getInstance(databaseType).build(queryResultMetaData, database, columnName, columnLabel, columnIndex);
}
/**
@@ -62,15 +58,14 @@ public final class QueryHeaderBuilderEngine {
* @param queryResultMetaData query result meta data
* @param database database
* @param columnIndex column index
- * @param dataNodeContainedRule data node contained rule
* @return query header
* @throws SQLException SQL exception
*/
- public QueryHeader build(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData,
- final ShardingSphereDatabase database, final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+ public QueryHeader build(final ProjectionsContext projectionsContext,
+ final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database, final int columnIndex) throws SQLException {
String columnName = getColumnName(projectionsContext, queryResultMetaData, columnIndex);
String columnLabel = getColumnLabel(projectionsContext, queryResultMetaData, columnIndex);
- return QueryHeaderBuilderFactory.getInstance(databaseType).build(queryResultMetaData, database, columnName, columnLabel, columnIndex, dataNodeContainedRule);
+ return QueryHeaderBuilderFactory.getInstance(databaseType).build(queryResultMetaData, database, columnName, columnLabel, columnIndex);
}
private String getColumnLabel(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData, final int columnIndex) throws SQLException {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
index 396d72ef74f..fd59a072613 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilder.java
@@ -17,9 +17,6 @@
package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
-import lombok.SneakyThrows;
-import org.apache.commons.lang3.concurrent.ConcurrentException;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereColumn;
@@ -32,20 +29,19 @@ import java.sql.SQLException;
import java.util.Optional;
/**
- * QueryHeaderBuilder for MySQL.
+ * Query header builder for MySQL.
*/
public final class MySQLQueryHeaderBuilder implements QueryHeaderBuilder {
- @SneakyThrows(ConcurrentException.class)
@Override
- public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database, final String columnName, final String columnLabel,
- final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
+ public QueryHeader build(final QueryResultMetaData queryResultMetaData,
+ final ShardingSphereDatabase database, final String columnName, final String columnLabel, final int columnIndex) throws SQLException {
String schemaName = null == database ? "" : database.getName();
String actualTableName = queryResultMetaData.getTableName(columnIndex);
String tableName;
boolean primaryKey;
- if (null != actualTableName && null != dataNodeContainedRule.get()) {
- tableName = dataNodeContainedRule.get().findLogicTableByActualTable(actualTableName).orElse("");
+ if (null != actualTableName && null != database) {
+ tableName = getLogicTableName(database, actualTableName);
ShardingSphereTable table = database.getSchemas().get(schemaName).get(tableName);
primaryKey = null != table && Optional.ofNullable(table.getColumns().get(columnName.toLowerCase())).map(ShardingSphereColumn::isPrimaryKey).orElse(false);
} else {
@@ -62,11 +58,22 @@ public final class MySQLQueryHeaderBuilder implements QueryHeaderBuilder {
return new QueryHeader(schemaName, tableName, columnLabel, columnName, columnType, columnTypeName, columnLength, decimals, signed, primaryKey, notNull, autoIncrement);
}
+ private String getLogicTableName(final ShardingSphereDatabase database, final String actualTableName) {
+ for (DataNodeContainedRule each : database.getRuleMetaData().findRules(DataNodeContainedRule.class)) {
+ Optional<String> logicTable = each.findLogicTableByActualTable(actualTableName);
+ if (logicTable.isPresent()) {
+ return logicTable.get();
+ }
+ }
+ return "";
+ }
+
@Override
public String getType() {
return "MySQL";
}
+ // TODO to be confirmed, QueryHeaderBuilder should not has default value, just throw unsupport exception if database type missing
@Override
public boolean isDefault() {
return true;
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
index 1641bd2cf7f..17a9cbac26a 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilder.java
@@ -17,26 +17,24 @@
package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
import java.sql.SQLException;
/**
- * QueryHeaderBuilder for openGauss.
+ * Query header builder for openGauss.
*/
public final class OpenGaussQueryHeaderBuilder implements QueryHeaderBuilder {
private final PostgreSQLQueryHeaderBuilder delegated = new PostgreSQLQueryHeaderBuilder();
@Override
- public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database, final String columnName, final String columnLabel,
- final int columnIndex, final LazyInitializer<DataNodeContainedRule> dataNodeContainedRule) throws SQLException {
- return delegated.build(queryResultMetaData, database, columnName, columnLabel, columnIndex, dataNodeContainedRule);
+ public QueryHeader build(final QueryResultMetaData queryResultMetaData,
+ final ShardingSphereDatabase database, final String columnName, final String columnLabel, final int columnIndex) throws SQLException {
+ return delegated.build(queryResultMetaData, database, columnName, columnLabel, columnIndex);
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
index 71a6a544bf8..f007701f085 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilder.java
@@ -17,17 +17,15 @@
package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
import java.sql.SQLException;
/**
- * QueryHeaderBuilder for PostgreSQL.
+ * Query header builder for PostgreSQL.
*/
public final class PostgreSQLQueryHeaderBuilder implements QueryHeaderBuilder {
@@ -38,8 +36,8 @@ public final class PostgreSQLQueryHeaderBuilder implements QueryHeaderBuilder {
private static final boolean UNUSED_BOOLEAN_FIELD = false;
@Override
- public QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereDatabase database, final String columnName, final String columnLabel,
- final int columnIndex, final LazyInitializer<DataNodeContainedRule> unused) throws SQLException {
+ public QueryHeader build(final QueryResultMetaData queryResultMetaData,
+ final ShardingSphereDatabase database, final String columnName, final String columnLabel, final int columnIndex) throws SQLException {
int columnType = queryResultMetaData.getColumnType(columnIndex);
String columnTypeName = queryResultMetaData.getColumnTypeName(columnIndex);
int columnLength = queryResultMetaData.getColumnLength(columnIndex);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
index dab96308d01..72544364f65 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
@@ -18,12 +18,10 @@
package org.apache.shardingsphere.proxy.backend.text.admin;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
@@ -66,23 +64,12 @@ public final class DatabaseAdminQueryBackendHandler implements TextProtocolBacke
ShardingSphereDatabase database = null == connectionSession.getDatabaseName() ? null : ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
DatabaseType databaseType = null == database ? connectionSession.getDatabaseType() : database.getProtocolType();
QueryHeaderBuilderEngine queryHeaderBuilderEngine = new QueryHeaderBuilderEngine(databaseType);
- LazyInitializer<DataNodeContainedRule> dataNodeContainedRule = getDataNodeContainedRuleLazyInitializer(database);
for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
- result.add(queryHeaderBuilderEngine.build(queryResultMetaData, database, columnIndex, dataNodeContainedRule));
+ result.add(queryHeaderBuilderEngine.build(queryResultMetaData, database, columnIndex));
}
return result;
}
- private LazyInitializer<DataNodeContainedRule> getDataNodeContainedRuleLazyInitializer(final ShardingSphereDatabase database) {
- return new LazyInitializer<DataNodeContainedRule>() {
-
- @Override
- protected DataNodeContainedRule initialize() {
- return null == database ? null : database.getRuleMetaData().findSingleRule(DataNodeContainedRule.class).orElse(null);
- }
- };
- }
-
@Override
public boolean next() throws SQLException {
return mergedResult.next();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
index 640b756f8c9..9e38e0a418c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngineTest.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.proxy.backend.communication.jdbc;
import lombok.SneakyThrows;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
@@ -37,7 +36,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -66,7 +64,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.instanceOf;
@@ -123,7 +120,7 @@ public final class JDBCDatabaseCommunicationEngineTest extends ProxyContextResto
ShardingSphereDatabase database = createDatabaseMetaData();
MemberAccessor accessor = Plugins.getMemberAccessor();
accessor.set(queryHeadersField, engine, Collections.singletonList(
- new QueryHeaderBuilderEngine(new MySQLDatabaseType()).build(createQueryResultMetaData(), database, 1, getDataNodeContainedRule(database))));
+ new QueryHeaderBuilderEngine(new MySQLDatabaseType()).build(createQueryResultMetaData(), database, 1)));
Field mergedResultField = DatabaseCommunicationEngine.class.getDeclaredField("mergedResult");
accessor.set(mergedResultField, engine, new MemoryMergedResult<ShardingSphereRule>(null, null, null, Collections.emptyList()) {
@@ -148,9 +145,7 @@ public final class JDBCDatabaseCommunicationEngineTest extends ProxyContextResto
ShardingSphereColumn column = new ShardingSphereColumn("order_id", Types.INTEGER, true, false, false);
when(result.getSchemas().get(DefaultDatabase.LOGIC_NAME).get("t_logic_order")).thenReturn(
new ShardingSphereTable("t_logic_order", Collections.singletonList(column), Collections.singletonList(new ShardingSphereIndex("order_id")), Collections.emptyList()));
- ShardingRule shardingRule = mock(ShardingRule.class);
- when(shardingRule.findLogicTableByActualTable("t_order")).thenReturn(Optional.of("t_logic_order"));
- when(result.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(shardingRule));
+ when(result.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(mock(ShardingRule.class)));
when(result.getName()).thenReturn("sharding_schema");
return result;
}
@@ -169,16 +164,6 @@ public final class JDBCDatabaseCommunicationEngineTest extends ProxyContextResto
return result;
}
- private LazyInitializer<DataNodeContainedRule> getDataNodeContainedRule(final ShardingSphereDatabase database) {
- return new LazyInitializer<DataNodeContainedRule>() {
-
- @Override
- protected DataNodeContainedRule initialize() {
- return (DataNodeContainedRule) database.getRuleMetaData().getRules().stream().filter(each -> each instanceof DataNodeContainedRule).findFirst().orElse(null);
- }
- };
- }
-
@Test
public void assertAddStatementCorrectly() {
SQLStatementContext<?> sqlStatementContext = mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
index f877c1ec499..14892169db5 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/MySQLQueryHeaderBuilderTest.java
@@ -17,10 +17,7 @@
package org.apache.shardingsphere.proxy.backend.response.header.query.impl;
-import com.google.common.base.Preconditions;
-import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereColumn;
@@ -29,7 +26,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.junit.Test;
@@ -48,14 +44,10 @@ import static org.mockito.Mockito.when;
public final class MySQLQueryHeaderBuilderTest {
- private final QueryHeaderBuilder queryHeaderBuilder = new MySQLQueryHeaderBuilder();
-
@Test
public void assertBuild() throws SQLException {
QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
- ShardingSphereDatabase database = createDatabase();
- QueryHeader actual = queryHeaderBuilder.build(
- queryResultMetaData, database, queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1, getDataNodeContainedRule(database));
+ QueryHeader actual = new MySQLQueryHeaderBuilder().build(queryResultMetaData, createDatabase(), queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1);
assertThat(actual.getSchema(), is(DefaultDatabase.LOGIC_NAME));
assertThat(actual.getTable(), is("t_logic_order"));
assertThat(actual.getColumnLabel(), is("order_id"));
@@ -70,41 +62,38 @@ public final class MySQLQueryHeaderBuilderTest {
}
@Test
- public void assertQueryHeaderPrimaryKeyWithoutColumn() throws SQLException {
+ public void assertBuildWithoutPrimaryKeyColumn() throws SQLException {
QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
- ShardingSphereDatabase database = createDatabase();
- QueryHeader actual = queryHeaderBuilder.build(
- queryResultMetaData, database, queryResultMetaData.getColumnName(2), queryResultMetaData.getColumnLabel(2), 2, getDataNodeContainedRule(database));
- assertFalse(actual.isPrimaryKey());
+ assertFalse(new MySQLQueryHeaderBuilder().build(queryResultMetaData, createDatabase(), queryResultMetaData.getColumnName(2), queryResultMetaData.getColumnLabel(2), 2).isPrimaryKey());
}
@Test
- public void assertDataNodeContainedRuleIsNotPresent() throws SQLException {
+ public void assertBuildWithNullDatabase() throws SQLException {
QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
- ShardingSphereDatabase database = createDatabase();
- QueryHeader actual = queryHeaderBuilder.build(queryResultMetaData, database, queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1,
- new LazyInitializer<DataNodeContainedRule>() {
-
- @Override
- protected DataNodeContainedRule initialize() {
- return null;
- }
- });
+ QueryHeader actual = new MySQLQueryHeaderBuilder().build(queryResultMetaData, null, queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1);
assertFalse(actual.isPrimaryKey());
assertThat(actual.getTable(), is("t_order"));
}
+ @Test
+ public void assertBuildWithoutDataNodeContainedRule() throws SQLException {
+ QueryResultMetaData queryResultMetaData = createQueryResultMetaData();
+ QueryHeader actual = new MySQLQueryHeaderBuilder().build(
+ queryResultMetaData, mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS), queryResultMetaData.getColumnName(1), queryResultMetaData.getColumnLabel(1), 1);
+ assertFalse(actual.isPrimaryKey());
+ assertThat(actual.getTable(), is(""));
+ }
+
private ShardingSphereDatabase createDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
ShardingSphereColumn column = new ShardingSphereColumn("order_id", Types.INTEGER, true, false, false);
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
- when(schema.get("t_logic_order")).thenReturn(new ShardingSphereTable("t_logic_order",
- Collections.singletonList(column), Collections.singletonList(new ShardingSphereIndex("order_id")), Collections.emptyList()));
- when(result.getResource().getDataSourceMetaData("ds_0")).thenReturn(mock(DataSourceMetaData.class));
+ when(schema.get("t_logic_order")).thenReturn(
+ new ShardingSphereTable("t_logic_order", Collections.singleton(column), Collections.singleton(new ShardingSphereIndex("order_id")), Collections.emptyList()));
when(result.getSchemas().get(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
ShardingRule shardingRule = mock(ShardingRule.class);
when(shardingRule.findLogicTableByActualTable("t_order")).thenReturn(Optional.of("t_logic_order"));
- when(result.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(shardingRule));
+ when(result.getRuleMetaData().findRules(DataNodeContainedRule.class)).thenReturn(Collections.singleton(shardingRule));
when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
return result;
}
@@ -124,17 +113,4 @@ public final class MySQLQueryHeaderBuilderTest {
when(result.isNotNull(1)).thenReturn(true);
return result;
}
-
- private LazyInitializer<DataNodeContainedRule> getDataNodeContainedRule(final ShardingSphereDatabase database) {
- return new LazyInitializer<DataNodeContainedRule>() {
-
- @Override
- protected DataNodeContainedRule initialize() {
- Optional<DataNodeContainedRule> result = database.getRuleMetaData().getRules().stream()
- .filter(each -> each instanceof DataNodeContainedRule).findFirst().map(each -> (DataNodeContainedRule) each);
- Preconditions.checkState(result.isPresent());
- return result.get();
- }
- };
- }
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
index bd485401e24..5e7b0825f7c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/OpenGaussQueryHeaderBuilderTest.java
@@ -39,8 +39,8 @@ public final class OpenGaussQueryHeaderBuilderTest {
when(queryResultMetaData.getColumnType(columnIndex)).thenReturn(Types.INTEGER);
when(queryResultMetaData.getColumnTypeName(columnIndex)).thenReturn("int");
when(queryResultMetaData.getColumnLength(columnIndex)).thenReturn(11);
- QueryHeader expected = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
- QueryHeader actual = new OpenGaussQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
+ QueryHeader expected = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex);
+ QueryHeader actual = new OpenGaussQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex);
assertThat(actual.getColumnLabel(), is(expected.getColumnLabel()));
assertThat(actual.getColumnType(), is(expected.getColumnType()));
assertThat(actual.getColumnTypeName(), is(expected.getColumnTypeName()));
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
index dfdeaaa3fe2..fae93d552f1 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/PostgreSQLQueryHeaderBuilderTest.java
@@ -39,7 +39,7 @@ public final class PostgreSQLQueryHeaderBuilderTest {
when(queryResultMetaData.getColumnType(columnIndex)).thenReturn(Types.INTEGER);
when(queryResultMetaData.getColumnTypeName(columnIndex)).thenReturn("int");
when(queryResultMetaData.getColumnLength(columnIndex)).thenReturn(11);
- QueryHeader actual = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex, null);
+ QueryHeader actual = new PostgreSQLQueryHeaderBuilder().build(queryResultMetaData, null, null, queryResultMetaData.getColumnLabel(columnIndex), columnIndex);
assertThat(actual.getColumnLabel(), is("label"));
assertThat(actual.getColumnType(), is(Types.INTEGER));
assertThat(actual.getColumnTypeName(), is("int"));