From e240277d682f3e872be443e32103b5f34fb2c60d Mon Sep 17 00:00:00 2001 From: "Juan Pan(Trista)" Date: Mon, 2 Nov 2020 18:22:07 +0800 Subject: [PATCH] New API for sql parser engine (#8008) * New API for sql parser engine * check style * Add EXECUTORS --- .../parser/sql/SQLStatementParserEngine.java | 15 +++++++++------ .../sql/parser/api/SQLParserEngine.java | 19 ++++++++----------- .../sql/parser/api/SQLVisitorEngine.java | 13 +++++++------ .../engine/SQLParserParameterizedTest.java | 4 +--- ...UnsupportedSQLParserParameterizedTest.java | 2 +- 5 files changed, 26 insertions(+), 27 deletions(-) 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 d3df88eabc..6fc46aaa85 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 @@ package org.apache.shardingsphere.infra.parser.sql; 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 @@ import java.util.Optional; /** * SQL statement parser engine. */ -@RequiredArgsConstructor public final class SQLStatementParserEngine { - private final String databaseTypeName; + private final SQLParserEngine parserEngine; + + private final SQLVisitorEngine visitorEngine; private final Cache 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 @@ public final class SQLStatementParserEngine { } 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 12f1c213b5..e5fd117618 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 @@ import java.util.concurrent.ConcurrentHashMap; /** * SQL parser engine. */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) +@RequiredArgsConstructor public final class SQLParserEngine { - private static final Map ENGINES = new ConcurrentHashMap<>(); + private static final Map 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 b5d138c545..40a9fd646d 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 @@ import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule; /** * 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 type of SQL visitor result * @return SQL visitor result */ - public static T visit(final String databaseType, final String visitorType, final ParseTree parseTree) { + public T visit(final ParseTree parseTree) { ParseTreeVisitor 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 45e870e8ec..79e54f33bb 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 @@ public abstract class SQLParserParameterizedTest { } 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 10d2ed0b88..a73baa6e9d 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 abstract class UnsupportedSQLParserParameterizedTest { 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); } } -- GitLab