You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2022/06/28 15:31:41 UTC
[shardingsphere] branch master updated: Update parserContexts when add database (#18669)
This is an automated email from the ASF dual-hosted git repository.
menghaoran 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 3d3cd3c6b0e Update parserContexts when add database (#18669)
3d3cd3c6b0e is described below
commit 3d3cd3c6b0e2678b72da71dde6d1d4b0f1912fbc
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue Jun 28 23:31:29 2022 +0800
Update parserContexts when add database (#18669)
---
.../shardingsphere/sharding/rule/ShardingRule.java | 3 +--
.../context/parser/OptimizerParserContextFactory.java | 14 ++++++++++++--
.../planner/OptimizerPlannerContextFactory.java | 10 +++++-----
.../optimizer/metadata/FederationMetaData.java | 4 ++--
.../shardingsphere/mode/manager/ContextManager.java | 18 +++++++++++-------
.../mode/manager/ContextManagerTest.java | 4 ++++
6 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index e23d29d4123..4277c9889f8 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -763,8 +763,7 @@ public final class ShardingRule implements DatabaseRule, DataNodeContainedRule,
@Override
public void setInstanceContext(final InstanceContext instanceContext) {
- keyGenerators.values().stream().filter(each -> each instanceof InstanceAwareAlgorithm)
- .forEach(each -> ((InstanceAwareAlgorithm) each).setInstanceContext(instanceContext));
+ keyGenerators.values().stream().filter(each -> each instanceof InstanceAwareAlgorithm).forEach(each -> ((InstanceAwareAlgorithm) each).setInstanceContext(instanceContext));
if (defaultKeyGenerateAlgorithm instanceof InstanceAwareAlgorithm) {
((InstanceAwareAlgorithm) defaultKeyGenerateAlgorithm).setInstanceContext(instanceContext);
}
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/parser/OptimizerParserContextFactory.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/parser/OptimizerParserContextFactory.java
index c8021a3f8bd..5afa0dadccc 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/parser/OptimizerParserContextFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/parser/OptimizerParserContextFactory.java
@@ -24,10 +24,10 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.federation.optimizer.context.parser.dialect.OptimizerSQLDialectBuilderFactory;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Optimizer parser context factory.
@@ -43,7 +43,7 @@ public final class OptimizerParserContextFactory {
* @return created optimizer parser context map
*/
public static Map<String, OptimizerParserContext> create(final Map<String, ShardingSphereDatabase> databases) {
- Map<String, OptimizerParserContext> result = new HashMap<>();
+ Map<String, OptimizerParserContext> result = new ConcurrentHashMap<>();
for (Entry<String, ShardingSphereDatabase> entry : databases.entrySet()) {
DatabaseType databaseType = entry.getValue().getProtocolType();
result.put(entry.getKey(), new OptimizerParserContext(databaseType, createSQLDialectProperties(databaseType)));
@@ -51,6 +51,16 @@ public final class OptimizerParserContextFactory {
return result;
}
+ /**
+ * Create optimizer parser context.
+ *
+ * @param databaseType database type
+ * @return optimizer parser context
+ */
+ public static OptimizerParserContext create(final DatabaseType databaseType) {
+ return new OptimizerParserContext(databaseType, createSQLDialectProperties(databaseType));
+ }
+
private static Properties createSQLDialectProperties(final DatabaseType databaseType) {
Properties result = new Properties();
result.setProperty(CalciteConnectionProperty.TIME_ZONE.camelName(), "UTC");
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/planner/OptimizerPlannerContextFactory.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/planner/OptimizerPlannerContextFactory.java
index 3dc9643726c..ca257721938 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/planner/OptimizerPlannerContextFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/planner/OptimizerPlannerContextFactory.java
@@ -42,11 +42,11 @@ import org.apache.shardingsphere.infra.federation.optimizer.metadata.calcite.Fed
import org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
import java.util.Collections;
-import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Optimizer planner context factory.
@@ -61,7 +61,7 @@ public final class OptimizerPlannerContextFactory {
* @return created optimizer planner context map
*/
public static Map<String, OptimizerPlannerContext> create(final FederationMetaData metaData) {
- Map<String, OptimizerPlannerContext> result = new HashMap<>(metaData.getDatabases().size(), 1);
+ Map<String, OptimizerPlannerContext> result = new ConcurrentHashMap<>(metaData.getDatabases().size(), 1);
for (Entry<String, FederationDatabaseMetaData> entry : metaData.getDatabases().entrySet()) {
result.put(entry.getKey(), create(entry.getValue()));
}
@@ -71,13 +71,13 @@ public final class OptimizerPlannerContextFactory {
/**
* Create optimizer planner context.
*
- * @param schemaMetaData federation schema meta data
+ * @param databaseMetaData federation database meta data
* @return created optimizer planner context
*/
- public static OptimizerPlannerContext create(final FederationDatabaseMetaData schemaMetaData) {
+ public static OptimizerPlannerContext create(final FederationDatabaseMetaData databaseMetaData) {
Map<String, SqlValidator> validators = new LinkedHashMap<>();
Map<String, SqlToRelConverter> converters = new LinkedHashMap<>();
- FederationDatabase federationDatabase = new FederationDatabase(schemaMetaData);
+ FederationDatabase federationDatabase = new FederationDatabase(databaseMetaData);
for (Entry<String, Schema> entry : federationDatabase.getSubSchemaMap().entrySet()) {
CalciteConnectionConfig connectionConfig = new CalciteConnectionConfigImpl(createConnectionProperties());
RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationMetaData.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationMetaData.java
index 329568779bc..952ff995392 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationMetaData.java
@@ -20,9 +20,9 @@ package org.apache.shardingsphere.infra.federation.optimizer.metadata;
import lombok.Getter;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Federation meta data.
@@ -33,7 +33,7 @@ public final class FederationMetaData {
private final Map<String, FederationDatabaseMetaData> databases;
public FederationMetaData(final Map<String, ShardingSphereDatabase> databases) {
- this.databases = new LinkedHashMap<>(databases.size(), 1);
+ this.databases = new ConcurrentHashMap<>(databases.size(), 1);
for (Entry<String, ShardingSphereDatabase> entry : databases.entrySet()) {
this.databases.put(entry.getKey().toLowerCase(), new FederationDatabaseMetaData(entry.getKey(), entry.getValue().getSchemas()));
}
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 9e4c56a8c3b..c48be48fbc8 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
@@ -31,6 +31,7 @@ import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
import org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory;
+import org.apache.shardingsphere.infra.federation.optimizer.context.parser.OptimizerParserContextFactory;
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.instance.InstanceContext;
@@ -118,22 +119,25 @@ public final class ContextManager implements AutoCloseable {
* @throws SQLException SQL exception
*/
public synchronized void addDatabase(final String databaseName) throws SQLException {
- if (!metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
- addDatabaseMetaData(databaseName);
- addFederationDatabaseMetaData(databaseName);
- persistMetaData(metaDataContexts);
+ if (metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
+ return;
}
+ DatabaseType protocolType = DatabaseTypeEngine.getProtocolType(Collections.emptyMap(), metaDataContexts.getMetaData().getProps());
+ addDatabaseMetaData(databaseName, protocolType);
+ addFederationDatabaseMetaData(databaseName, protocolType);
+ persistMetaData(metaDataContexts);
}
- private void addDatabaseMetaData(final String databaseName) throws SQLException {
- ShardingSphereDatabase database = ShardingSphereDatabase.create(databaseName, DatabaseTypeEngine.getProtocolType(Collections.emptyMap(), metaDataContexts.getMetaData().getProps()));
+ private void addDatabaseMetaData(final String databaseName, final DatabaseType protocolType) throws SQLException {
+ ShardingSphereDatabase database = ShardingSphereDatabase.create(databaseName, protocolType);
metaDataContexts.getMetaData().getDatabases().put(databaseName, database);
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(database));
}
- private void addFederationDatabaseMetaData(final String databaseName) {
+ private void addFederationDatabaseMetaData(final String databaseName, final DatabaseType protocolType) {
FederationDatabaseMetaData federationDatabaseMetaData = new FederationDatabaseMetaData(databaseName, Collections.emptyMap());
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().put(databaseName, federationDatabaseMetaData);
+ metaDataContexts.getOptimizerContext().getParserContexts().put(databaseName, OptimizerParserContextFactory.create(protocolType));
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index bbd67c2e000..55835a30f1d 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -82,6 +82,8 @@ public final class ContextManagerTest {
when(metaDataContexts.getMetaData().getDatabases().get("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_db", new ShardingSphereSchema()));
when(metaDataContexts.getMetaData().getDatabases().get("foo_db").getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
when(metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases()).thenReturn(new LinkedHashMap<>());
+ when(metaDataContexts.getOptimizerContext().getParserContexts()).thenReturn(new LinkedHashMap<>());
+ when(metaDataContexts.getOptimizerContext().getPlannerContexts()).thenReturn(new LinkedHashMap<>());
contextManager = new ContextManager(metaDataContexts, mock(InstanceContext.class));
}
@@ -107,6 +109,8 @@ public final class ContextManagerTest {
contextManager.addDatabase("foo_db");
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabases().containsKey("foo_db"));
assertTrue(contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().containsKey("foo_db"));
+ assertTrue(contextManager.getMetaDataContexts().getOptimizerContext().getParserContexts().containsKey("foo_db"));
+ assertTrue(contextManager.getMetaDataContexts().getOptimizerContext().getPlannerContexts().containsKey("foo_db"));
}
@Test