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