You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2021/06/12 08:26:48 UTC

[shardingsphere] branch master updated: Add DistRuleSQLParserFacade to prepare SPI with rule SQL parser (#10788)

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

wuweijie 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 1272443  Add DistRuleSQLParserFacade to prepare SPI with rule SQL parser (#10788)
1272443 is described below

commit 12724437e1d0d8baa5aaf1d93e6c413d583c5315
Author: Liang Zhang <te...@163.com>
AuthorDate: Sat Jun 12 16:26:14 2021 +0800

    Add DistRuleSQLParserFacade to prepare SPI with rule SQL parser (#10788)
    
    * Refactor DistSQLStatementParserEngine
    
    * Add DistRuleSQLParserFacade SPI
    
    * Refactor SQLParserFactory
---
 .../parser/api/DistSQLStatementParserEngine.java   | 42 +++++++++++++++++++---
 .../parser/core/rule/DistRuleSQLParserFactory.java | 15 ++++----
 .../parser/core/{ => standard}/DistSQLParser.java  |  2 +-
 .../core/{ => standard}/DistSQLParserFactory.java  |  6 ++--
 .../parser/core/{ => standard}/DistSQLVisitor.java |  2 +-
 .../DistRuleSQLParserFacade.java}                  | 37 +++++++++++--------
 .../sql/parser/core/parser/SQLParserFactory.java   |  4 +++
 7 files changed, 76 insertions(+), 32 deletions(-)

diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
index b0f75e4..2beb25f 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngine.java
@@ -19,18 +19,32 @@ package org.apache.shardingsphere.distsql.parser.api;
 
 import org.antlr.v4.runtime.misc.ParseCancellationException;
 import org.antlr.v4.runtime.tree.ErrorNode;
-import org.apache.shardingsphere.distsql.parser.core.DistSQLParserFactory;
-import org.apache.shardingsphere.distsql.parser.core.DistSQLVisitor;
+import org.apache.shardingsphere.distsql.parser.core.rule.DistRuleSQLParserFactory;
+import org.apache.shardingsphere.distsql.parser.core.standard.DistSQLParserFactory;
+import org.apache.shardingsphere.distsql.parser.core.standard.DistSQLVisitor;
+import org.apache.shardingsphere.distsql.parser.spi.DistRuleSQLParserFacade;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.ServiceLoader;
+
 /**
  * Dist SQL statement parser engine.
  */
 public final class DistSQLStatementParserEngine {
     
+    private static final Collection<DistRuleSQLParserFacade> RULE_PARSER_FACADES = new LinkedList<>();
+    
+    static {
+        for (DistRuleSQLParserFacade each : ServiceLoader.load(DistRuleSQLParserFacade.class)) {
+            RULE_PARSER_FACADES.add(each);
+        }
+    }
+    
     /**
      * Parse SQL.
      *
@@ -38,16 +52,34 @@ public final class DistSQLStatementParserEngine {
      * @return AST node
      */
     public SQLStatement parse(final String sql) {
-        SQLParser sqlParser = DistSQLParserFactory.newInstance(sql);
         ParseASTNode parseASTNode;
         try {
-            parseASTNode = (ParseASTNode) sqlParser.parse();
+            parseASTNode = parseFromStandardParser(sql);
         } catch (final ParseCancellationException ex) {
-            throw new SQLParsingException("You have an error in your SQL syntax");
+            parseASTNode = parseFromRuleParsers(sql);
         }
         if (parseASTNode.getRootNode() instanceof ErrorNode) {
             throw new SQLParsingException("Unsupported SQL of `%s`", sql);
         }
         return (SQLStatement) new DistSQLVisitor().visit(parseASTNode.getRootNode());
     }
+    
+    private ParseASTNode parseFromStandardParser(final String sql) {
+        SQLParser sqlParser = DistSQLParserFactory.newInstance(sql);
+        try {
+            return (ParseASTNode) sqlParser.parse();
+        } catch (final ParseCancellationException ex) {
+            throw new SQLParsingException("You have an error in your SQL syntax.");
+        }
+    }
+    
+    private ParseASTNode parseFromRuleParsers(final String sql) {
+        for (DistRuleSQLParserFacade each : RULE_PARSER_FACADES) {
+            try {
+                return (ParseASTNode) DistRuleSQLParserFactory.newInstance(sql, each).parse();
+            } catch (final ParseCancellationException ignored) {
+            }
+        }
+        throw new SQLParsingException("You have an error in your SQL syntax.");
+    }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/rule/DistRuleSQLParserFactory.java
similarity index 80%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
copy to shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/rule/DistRuleSQLParserFactory.java
index c4c3c88..a2a8cf3 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/rule/DistRuleSQLParserFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core.parser;
+package org.apache.shardingsphere.distsql.parser.core.rule;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -26,28 +26,27 @@ import org.antlr.v4.runtime.CodePointCharStream;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.TokenStream;
+import org.apache.shardingsphere.distsql.parser.spi.DistRuleSQLParserFacade;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLLexer;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
 
 import java.nio.CharBuffer;
 
 /**
- * SQL parser factory.
+ * Dist rule SQL parser factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SQLParserFactory {
+public final class DistRuleSQLParserFactory {
     
     /**
      * New instance of SQL parser.
      * 
-     * @param databaseType database type
+     * @param facade dist rule SQL parser facade
      * @param sql SQL
      * @return SQL parser
      */
-    public static SQLParser newInstance(final String databaseType, final String sql) {
-        SQLParserFacade sqlParserFacade = SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseType);
-        return createSQLParser(createTokenStream(sql, sqlParserFacade.getLexerClass()), sqlParserFacade.getParserClass());
+    public static SQLParser newInstance(final String sql, final DistRuleSQLParserFacade facade) {
+        return createSQLParser(createTokenStream(sql, facade.getLexerClass()), facade.getParserClass());
     }
     
     @SneakyThrows(ReflectiveOperationException.class)
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
similarity index 95%
copy from shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
copy to shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
index 00e6c47..29429ff 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.parser.core;
+package org.apache.shardingsphere.distsql.parser.core.standard;
 
 import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser;
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParserFactory.java
similarity index 93%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParserFactory.java
index 1654a96..903fdd6 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParserFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.parser.core;
+package org.apache.shardingsphere.distsql.parser.core.standard;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -37,10 +37,10 @@ import java.nio.CharBuffer;
 public final class DistSQLParserFactory {
     
     /**
-     * New instance of Dist SQL parser.
+     * New instance of dist SQL parser.
      *
      * @param sql SQL
-     * @return Dist SQL parser
+     * @return dist SQL parser
      */
     public static SQLParser newInstance(final String sql) {
         return new DistSQLParser(createTokenStream(sql));
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
similarity index 99%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
index de7623d..931071d 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.parser.core;
+package org.apache.shardingsphere.distsql.parser.core.standard;
 
 import com.google.common.base.Joiner;
 import org.antlr.v4.runtime.tree.ParseTree;
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/spi/DistRuleSQLParserFacade.java
similarity index 59%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/spi/DistRuleSQLParserFacade.java
index 00e6c47..6f5dc8b 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/spi/DistRuleSQLParserFacade.java
@@ -15,25 +15,34 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.parser.core;
+package org.apache.shardingsphere.distsql.parser.spi;
 
-import org.antlr.v4.runtime.TokenStream;
-import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser;
+import org.apache.shardingsphere.sql.parser.api.parser.SQLLexer;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
-import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
- * SQL parser for Dist SQL.
+ * Dist rule SQL parser facade.
  */
-public final class DistSQLParser extends DistSQLStatementParser implements SQLParser {
+public interface DistRuleSQLParserFacade {
     
-    public DistSQLParser(final TokenStream input) {
-        super(input);
-    }
+    /**
+     * Get SQL lexer class type.
+     *
+     * @return SQL lexer class type
+     */
+    Class<? extends SQLLexer> getLexerClass();
     
-    @Override
-    public ASTNode parse() {
-        return new ParseASTNode(execute());
-    }
+    /**
+     * Get SQL parser class type.
+     * 
+     * @return SQL parser class type
+     */
+    Class<? extends SQLParser> getParserClass();
+    
+    /**
+     * Get rule type.
+     *
+     * @return rule type
+     */
+    String getRuleType();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
index c4c3c88..6002f40 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
@@ -47,6 +47,10 @@ public final class SQLParserFactory {
      */
     public static SQLParser newInstance(final String databaseType, final String sql) {
         SQLParserFacade sqlParserFacade = SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseType);
+        return createSQLParser(sql, sqlParserFacade);
+    }
+    
+    private static SQLParser createSQLParser(final String sql, final SQLParserFacade sqlParserFacade) {
         return createSQLParser(createTokenStream(sql, sqlParserFacade.getLexerClass()), sqlParserFacade.getParserClass());
     }