New API for sql parser engine (#8008)
* New API for sql parser engine
* check style
* Add EXECUTORS
diff --git a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
index d3df88e..6fc46aa 100644
--- a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
@@ -19,8 +19,6 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
-import lombok.RequiredArgsConstructor;
-import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.api.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.api.SQLVisitorEngine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -30,13 +28,19 @@
/**
* SQL statement parser engine.
*/
-@RequiredArgsConstructor
public final class SQLStatementParserEngine {
- private final String databaseTypeName;
+ private final SQLParserEngine parserEngine;
+
+ private final SQLVisitorEngine visitorEngine;
private final Cache<String, SQLStatement> cache = CacheBuilder.newBuilder().softValues().initialCapacity(2000).maximumSize(65535).build();
+ public SQLStatementParserEngine(final String databaseTypeName) {
+ parserEngine = new SQLParserEngine(databaseTypeName);
+ visitorEngine = new SQLVisitorEngine(databaseTypeName, "STATEMENT");
+ }
+
/**
* Parse to SQL statement.
*
@@ -58,7 +62,6 @@
}
private SQLStatement parse(final String sql) {
- ParseTree parseTree = SQLParserEngine.parse(databaseTypeName, sql, false);
- return SQLVisitorEngine.visit(databaseTypeName, "STATEMENT", parseTree);
+ return visitorEngine.visit(parserEngine.parse(sql, false));
}
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
index 12f1c21..e5fd117 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
@@ -17,8 +17,7 @@
package org.apache.shardingsphere.sql.parser.api;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
@@ -28,24 +27,22 @@
/**
* SQL parser engine.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@RequiredArgsConstructor
public final class SQLParserEngine {
- private static final Map<String, SQLParserExecutor> ENGINES = new ConcurrentHashMap<>();
+ private static final Map<String, SQLParserExecutor> EXECUTORS = new ConcurrentHashMap<>();
+
+ private final String databaseType;
/**
* Parse SQL.
*
- * @param databaseType database type
* @param sql SQL to be parsed
* @param useCache whether use cache
* @return parse tree
*/
- public static ParseTree parse(final String databaseType, final String sql, final boolean useCache) {
- return getSQLParserExecutor(databaseType).parse(sql, useCache);
- }
-
- private static SQLParserExecutor getSQLParserExecutor(final String databaseType) {
- return ENGINES.containsKey(databaseType) ? ENGINES.get(databaseType) : ENGINES.computeIfAbsent(databaseType, SQLParserExecutor::new);
+ public ParseTree parse(final String sql, final boolean useCache) {
+ SQLParserExecutor executor = EXECUTORS.containsKey(databaseType) ? EXECUTORS.get(databaseType) : EXECUTORS.computeIfAbsent(databaseType, SQLParserExecutor::new);
+ return executor.parse(sql, useCache);
}
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLVisitorEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLVisitorEngine.java
index b5d138c..40a9fd6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLVisitorEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLVisitorEngine.java
@@ -17,8 +17,7 @@
package org.apache.shardingsphere.sql.parser.api;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory;
@@ -27,19 +26,21 @@
/**
* SQL visitor engine.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@RequiredArgsConstructor
public final class SQLVisitorEngine {
+ private final String databaseType;
+
+ private final String visitorType;
+
/**
* Visit parse tree.
*
- * @param databaseType database type
- * @param visitorType SQL visitor type
* @param parseTree parse tree
* @param <T> type of SQL visitor result
* @return SQL visitor result
*/
- public static <T> T visit(final String databaseType, final String visitorType, final ParseTree parseTree) {
+ public <T> T visit(final ParseTree parseTree) {
ParseTreeVisitor<T> visitor = SQLVisitorFactory.newInstance(databaseType, visitorType, SQLVisitorRule.valueOf(parseTree.getClass()));
return parseTree.accept(visitor);
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/SQLParserParameterizedTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/SQLParserParameterizedTest.java
index 45e870e..79e54f3 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/SQLParserParameterizedTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/SQLParserParameterizedTest.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.test.sql.parser.parameterized.engine;
import lombok.RequiredArgsConstructor;
-import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.api.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.api.SQLVisitorEngine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -85,7 +84,6 @@
}
private SQLStatement parseSQLStatement(final String databaseType, final String sql) {
- ParseTree parseTree = SQLParserEngine.parse(databaseType, sql, false);
- return SQLVisitorEngine.visit(databaseType, "STATEMENT", parseTree);
+ return new SQLVisitorEngine(databaseType, "STATEMENT").visit(new SQLParserEngine(databaseType).parse(sql, false));
}
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/UnsupportedSQLParserParameterizedTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/UnsupportedSQLParserParameterizedTest.java
index 10d2ed0..a73baa6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/UnsupportedSQLParserParameterizedTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/engine/UnsupportedSQLParserParameterizedTest.java
@@ -47,6 +47,6 @@
public final void assertUnsupportedSQL() {
String sql = SQL_CASES_LOADER.getSQL(sqlCaseId, sqlCaseType, Collections.emptyList());
String databaseType = "H2".equals(this.databaseType) ? "MySQL" : this.databaseType;
- SQLParserEngine.parse(databaseType, sql, false);
+ new SQLParserEngine(databaseType).parse(sql, false);
}
}