未验证 提交 e240277d 编写于 作者: J Juan Pan(Trista) 提交者: GitHub

New API for sql parser engine (#8008)

* New API for sql parser engine

* check style

* Add EXECUTORS
上级 400e32c6
......@@ -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<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 @@ 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));
}
}
......@@ -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<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);
}
}
......@@ -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 <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);
}
......
......@@ -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));
}
}
......@@ -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);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册