You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/05/10 12:27:08 UTC

[shardingsphere] branch master updated: Use ShardingSphere SPI in SQLVisitorFacade (#17528)

This is an automated email from the ASF dual-hosted git repository.

zhonghongsheng 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 f9f1059554e Use ShardingSphere SPI in SQLVisitorFacade (#17528)
f9f1059554e is described below

commit f9f1059554e1e5ab92d465c06251ade7eadccd66
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue May 10 20:27:02 2022 +0800

    Use ShardingSphere SPI in SQLVisitorFacade (#17528)
    
    * Use ShardingSphere SPI in SQLVisitorFacade
    
    * Update SQLParserFacade
---
 .../spi/FeaturedDistSQLStatementParserFacade.java  |  3 +-
 .../database/visitor/SQLVisitorFacadeFactory.java  | 46 +++++++++++++++
 .../database/visitor/SQLVisitorFacadeRegistry.java | 68 ----------------------
 .../core/database/visitor/SQLVisitorFactory.java   |  2 +-
 .../parser/spi/DatabaseTypedSQLParserFacade.java   |  3 +-
 .../sql/parser/spi/SQLParserFacade.java            |  3 +-
 .../sql/parser/spi/SQLVisitorFacade.java           |  8 ++-
 7 files changed, 58 insertions(+), 75 deletions(-)

diff --git a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
index 6ae9d56b7e3..0f85a731033 100644
--- a/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
+++ b/shardingsphere-distsql/shardingsphere-distsql-parser/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.distsql.parser.engine.spi;
 
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitor;
 import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
 
@@ -26,7 +25,7 @@ import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
  * Featured dist SQL statement parser facade.
  */
 @SingletonSPI
-public interface FeaturedDistSQLStatementParserFacade extends SQLParserFacade, TypedSPI {
+public interface FeaturedDistSQLStatementParserFacade extends SQLParserFacade {
     
     /**
      * Get visitor class.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeFactory.java
new file mode 100644
index 00000000000..8bf0e1a043b
--- /dev/null
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.core.database.visitor;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
+import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade;
+
+/**
+ * SQL visitor facade factory.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SQLVisitorFacadeFactory {
+    
+    static {
+        ShardingSphereServiceLoader.register(SQLVisitorFacade.class);
+    }
+    
+    /**
+     * Get instance of visitor facade.
+     * 
+     * @param databaseType database type
+     * @param visitorType visitor type
+     * @return instance of visitor facade
+     */
+    public static SQLVisitorFacade getInstance(final String databaseType, final String visitorType) {
+        return TypedSPIRegistry.getRegisteredService(SQLVisitorFacade.class, String.join(".", databaseType, visitorType));
+    }
+}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeRegistry.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeRegistry.java
deleted file mode 100644
index 0d8f1888645..00000000000
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFacadeRegistry.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sql.parser.core.database.visitor;
-
-import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.ServiceLoader;
-
-/**
- * SQL visitor facade registry.
- */
-public final class SQLVisitorFacadeRegistry {
-    
-    private static final SQLVisitorFacadeRegistry INSTANCE = new SQLVisitorFacadeRegistry();
-    
-    private final Map<String, SQLVisitorFacade> facades = new LinkedHashMap<>();
-    
-    private SQLVisitorFacadeRegistry() {
-        for (SQLVisitorFacade each : ServiceLoader.load(SQLVisitorFacade.class)) {
-            facades.put(getQualifiedType(each.getDatabaseType(), each.getVisitorType()), each);
-        }
-    }
-    
-    /**
-     * Get instance.
-     *
-     * @return instance
-     */
-    public static SQLVisitorFacadeRegistry getInstance() {
-        return INSTANCE;
-    }
-    
-    /**
-     * Get SQL visitor facade.
-     * 
-     * @param databaseType database type
-     * @param visitorType visitor type
-     * @return SQL visitor facade
-     */
-    public SQLVisitorFacade getSQLVisitorFacade(final String databaseType, final String visitorType) {
-        String qualifiedType = getQualifiedType(databaseType, visitorType);
-        if (facades.containsKey(qualifiedType)) {
-            return facades.get(qualifiedType);
-        }
-        throw new UnsupportedOperationException(String.format("Cannot support '%s' visitor with database '%s'", visitorType, databaseType));
-    }
-    
-    private String getQualifiedType(final String databaseType, final String visitorType) {
-        return String.join(".", databaseType, visitorType);
-    }
-}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
index bd376528aeb..ecf52e836ba 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
@@ -44,7 +44,7 @@ public final class SQLVisitorFactory {
      * @return parse tree visitor
      */
     public static <T> ParseTreeVisitor<T> newInstance(final String databaseType, final String visitorType, final SQLVisitorRule visitorRule, final Properties props) {
-        SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseType, visitorType);
+        SQLVisitorFacade facade = SQLVisitorFacadeFactory.getInstance(databaseType, visitorType);
         return createParseTreeVisitor(facade, visitorRule.getType(), props);
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/DatabaseTypedSQLParserFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/DatabaseTypedSQLParserFacade.java
index bb37bdf1f86..d42dd32737d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/DatabaseTypedSQLParserFacade.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/DatabaseTypedSQLParserFacade.java
@@ -18,11 +18,10 @@
 package org.apache.shardingsphere.sql.parser.spi;
 
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 
 /**
  * Database type based SQL parser facade.
  */
 @SingletonSPI
-public interface DatabaseTypedSQLParserFacade extends SQLParserFacade, TypedSPI {
+public interface DatabaseTypedSQLParserFacade extends SQLParserFacade {
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLParserFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLParserFacade.java
index d11389f0ba2..9d167ca4100 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLParserFacade.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLParserFacade.java
@@ -17,13 +17,14 @@
 
 package org.apache.shardingsphere.sql.parser.spi;
 
+import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLLexer;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 
 /**
  * SQL parser facade.
  */
-public interface SQLParserFacade {
+public interface SQLParserFacade extends TypedSPI {
     
     /**
      * Get SQL lexer class type.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLVisitorFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLVisitorFacade.java
index a29c0e127c3..cb788b2b81a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLVisitorFacade.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-spi/src/main/java/org/apache/shardingsphere/sql/parser/spi/SQLVisitorFacade.java
@@ -17,12 +17,13 @@
 
 package org.apache.shardingsphere.sql.parser.spi;
 
+import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitor;
 
 /**
  * SQL visitor facade.
  */
-public interface SQLVisitorFacade {
+public interface SQLVisitorFacade extends TypedSPI {
     
     /**
      * Get database type.
@@ -79,4 +80,9 @@ public interface SQLVisitorFacade {
      * @return RL visitor class
      */
     Class<? extends SQLVisitor> getRLVisitorClass();
+    
+    @Override
+    default String getType() {
+        return String.join(".", getDatabaseType(), getVisitorType());
+    }
 }