This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 cf31162 Refactor SQLParserFactory to adapt SQL parser and Dist SQL
parser (#10793)
cf31162 is described below
commit cf31162ea79e678ff1594201cae708a2cb03ebdf
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jun 12 21:21:25 2021 +0800
Refactor SQLParserFactory to adapt SQL parser and Dist SQL parser (#10793)
---
.../parser/api/DistSQLStatementParserEngine.java | 8 +--
.../parser/core/{standard => }/DistSQLParser.java | 2 +-
.../core/{standard => }/DistSQLParserFactory.java | 2 +-
.../parser/core/{standard => }/DistSQLVisitor.java | 2 +-
.../parser/core/rule/DistRuleSQLParserFactory.java | 67 ----------------------
...a => DatabaseTypedSQLParserFacadeRegistry.java} | 23 ++++----
.../sql/parser/core/parser/SQLParserExecutor.java | 4 +-
.../sql/parser/core/parser/SQLParserFactory.java | 14 ++---
8 files changed, 25 insertions(+), 97 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 e55c34f..c373b58 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,12 +19,12 @@ 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.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.core.DistSQLParserFactory;
+import org.apache.shardingsphere.distsql.parser.core.DistSQLVisitor;
import
org.apache.shardingsphere.distsql.parser.spi.FeatureTypedSQLParserFacade;
import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.SQLParserFactory;
import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -76,7 +76,7 @@ public final class DistSQLStatementParserEngine {
private ParseASTNode parseFromRuleParsers(final String sql) {
for (FeatureTypedSQLParserFacade each : RULE_PARSER_FACADES) {
try {
- return (ParseASTNode)
DistRuleSQLParserFactory.newInstance(sql, each).parse();
+ return (ParseASTNode) SQLParserFactory.newInstance(sql,
each.getLexerClass(), each.getParserClass()).parse();
} catch (final ParseCancellationException ignored) {
}
}
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
similarity index 95%
rename from
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
rename to
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
index 29429ff..00e6c47 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParser.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParser.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.distsql.parser.core.standard;
+package org.apache.shardingsphere.distsql.parser.core;
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/standard/DistSQLParserFactory.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java
similarity index 97%
rename from
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParserFactory.java
rename to
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java
index 903fdd6..3a59173 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLParserFactory.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLParserFactory.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.distsql.parser.core.standard;
+package org.apache.shardingsphere.distsql.parser.core;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
similarity index 99%
rename from
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
rename to
shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
index 931071d..de7623d 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/standard/DistSQLVisitor.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.distsql.parser.core.standard;
+package org.apache.shardingsphere.distsql.parser.core;
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/rule/DistRuleSQLParserFactory.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/rule/DistRuleSQLParserFactory.java
deleted file mode 100644
index b6ab976..0000000
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/rule/DistRuleSQLParserFactory.java
+++ /dev/null
@@ -1,67 +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.distsql.parser.core.rule;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import lombok.SneakyThrows;
-import org.antlr.v4.runtime.CharStream;
-import org.antlr.v4.runtime.CodePointBuffer;
-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.FeatureTypedSQLParserFacade;
-import org.apache.shardingsphere.sql.parser.api.parser.SQLLexer;
-import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-
-import java.nio.CharBuffer;
-
-/**
- * Dist rule SQL parser factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DistRuleSQLParserFactory {
-
- /**
- * New instance of SQL parser.
- *
- * @param facade dist rule SQL parser facade
- * @param sql SQL
- * @return SQL parser
- */
- public static SQLParser newInstance(final String sql, final
FeatureTypedSQLParserFacade facade) {
- return createSQLParser(createTokenStream(sql, facade.getLexerClass()),
facade.getParserClass());
- }
-
- @SneakyThrows(ReflectiveOperationException.class)
- private static SQLParser createSQLParser(final TokenStream tokenStream,
final Class<? extends SQLParser> parserClass) {
- return
parserClass.getConstructor(TokenStream.class).newInstance(tokenStream);
- }
-
- @SneakyThrows(ReflectiveOperationException.class)
- private static TokenStream createTokenStream(final String sql, final
Class<? extends SQLLexer> lexerClass) {
- Lexer lexer = (Lexer)
lexerClass.getConstructor(CharStream.class).newInstance(getSQLCharStream(sql));
- return new CommonTokenStream(lexer);
- }
-
- private static CharStream getSQLCharStream(final String sql) {
- CodePointBuffer buffer =
CodePointBuffer.withChars(CharBuffer.wrap(sql.toCharArray()));
- return CodePointCharStream.fromBuffer(buffer);
- }
-}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/DatabaseTypedSQLParserFacadeRegistry.java
similarity index 66%
rename from
shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
rename to
shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/DatabaseTypedSQLParserFacadeRegistry.java
index 0d14cb3..d122577 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/DatabaseTypedSQLParserFacadeRegistry.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.sql.parser.core.parser;
+import com.google.common.base.Preconditions;
import org.apache.shardingsphere.sql.parser.spi.DatabaseTypedSQLParserFacade;
import java.util.LinkedHashMap;
@@ -24,15 +25,15 @@ import java.util.Map;
import java.util.ServiceLoader;
/**
- * SQL parser facade registry.
+ * Database type based SQL parser facade registry.
*/
-public final class SQLParserFacadeRegistry {
+public final class DatabaseTypedSQLParserFacadeRegistry {
- private static final SQLParserFacadeRegistry INSTANCE = new
SQLParserFacadeRegistry();
+ private static final DatabaseTypedSQLParserFacadeRegistry INSTANCE = new
DatabaseTypedSQLParserFacadeRegistry();
private final Map<String, DatabaseTypedSQLParserFacade> facades = new
LinkedHashMap<>();
- private SQLParserFacadeRegistry() {
+ private DatabaseTypedSQLParserFacadeRegistry() {
for (DatabaseTypedSQLParserFacade each :
ServiceLoader.load(DatabaseTypedSQLParserFacade.class)) {
facades.put(each.getDatabaseType(), each);
}
@@ -43,20 +44,18 @@ public final class SQLParserFacadeRegistry {
*
* @return instance
*/
- public static SQLParserFacadeRegistry getInstance() {
+ public static DatabaseTypedSQLParserFacadeRegistry getInstance() {
return INSTANCE;
}
/**
- * Get SQL parser facade.
+ * Get database type based SQL parser facade.
*
* @param databaseType database type
- * @return SQL parser facade
+ * @return database type based SQL parser facade
*/
- public DatabaseTypedSQLParserFacade getSQLParserFacade(final String
databaseType) {
- if (facades.containsKey(databaseType)) {
- return facades.get(databaseType);
- }
- throw new UnsupportedOperationException(String.format("Cannot support
database type '%s'", databaseType));
+ public DatabaseTypedSQLParserFacade getFacade(final String databaseType) {
+ Preconditions.checkArgument(facades.containsKey(databaseType), "Cannot
support database type '%s'", databaseType);
+ return facades.get(databaseType);
}
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
index fa5fbfa..4ef18c6 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
@@ -26,6 +26,7 @@ import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
+import org.apache.shardingsphere.sql.parser.spi.DatabaseTypedSQLParserFacade;
/**
* SQL parser executor.
@@ -50,7 +51,8 @@ public final class SQLParserExecutor {
}
private ParseASTNode twoPhaseParse(final String sql) {
- SQLParser sqlParser = SQLParserFactory.newInstance(databaseType, sql);
+ DatabaseTypedSQLParserFacade sqlParserFacade =
DatabaseTypedSQLParserFacadeRegistry.getInstance().getFacade(databaseType);
+ SQLParser sqlParser = SQLParserFactory.newInstance(sql,
sqlParserFacade.getLexerClass(), sqlParserFacade.getParserClass());
try {
setPredictionMode((Parser) sqlParser, PredictionMode.SLL);
return (ParseASTNode) sqlParser.parse();
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 205c775..01bfe26 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
@@ -28,8 +28,6 @@ import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.TokenStream;
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.DatabaseTypedSQLParserFacade;
-import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
import java.nio.CharBuffer;
@@ -42,17 +40,13 @@ public final class SQLParserFactory {
/**
* New instance of SQL parser.
*
- * @param databaseType database type
* @param sql SQL
+ * @param lexerClass lexer class
+ * @param parserClass parser class
* @return SQL parser
*/
- public static SQLParser newInstance(final String databaseType, final
String sql) {
- DatabaseTypedSQLParserFacade 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());
+ public static SQLParser newInstance(final String sql, final Class<?
extends SQLLexer> lexerClass, final Class<? extends SQLParser> parserClass) {
+ return createSQLParser(createTokenStream(sql, lexerClass),
parserClass);
}
@SneakyThrows(ReflectiveOperationException.class)