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());
}