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

Refactor StandardSQLParserEngine and cacheEngine (#7914)

* Rename to getVisitorFacadeFactoryClass() in SQLParserConfiguration

* Refactor StandardSQLParserEngine and cacheEngine

* modify SQLParserEngine

* check style

* java doc
上级 14200b16
......@@ -44,8 +44,8 @@ import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngine;
import org.junit.runners.Parameterized.Parameters;
import java.io.File;
......@@ -80,8 +80,8 @@ public final class EncryptSQLRewriterParameterizedTest extends AbstractSQLRewrit
StandardSQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType() ? "SQL92" : getTestParameters().getDatabaseType());
ShardingSphereMetaData metaData = createShardingSphereMetaData();
ConfigurationProperties props = new ConfigurationProperties(ruleConfigurations.getProps());
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), getTestParameters().getInputParameters(), standardSqlParserEngine.parse(getTestParameters().getInputSQL(), false));
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
getTestParameters().getInputParameters(), standardSqlParserEngine.parseToSQLStatement(getTestParameters().getInputSQL(), false));
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
......
......@@ -47,8 +47,8 @@ import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngine;
import org.junit.runners.Parameterized.Parameters;
import java.io.File;
......@@ -83,12 +83,12 @@ public final class MixSQLRewriterParameterizedTest extends AbstractSQLRewriterPa
YamlRootRuleConfigurations ruleConfigurations = createRuleConfigurations();
Collection<ShardingSphereRule> rules = ShardingSphereRulesBuilder.build(
new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleConfigurations.getRules()), ruleConfigurations.getDataSources().keySet());
StandardSQLParserEngine standardSqlParserEngine =
StandardSQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType() ? "SQL92" : getTestParameters().getDatabaseType());
StandardSQLParserEngine standardSqlParserEngine = StandardSQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType()
? "SQL92" : getTestParameters().getDatabaseType());
ShardingSphereMetaData metaData = createShardingSphereMetaData();
ConfigurationProperties props = new ConfigurationProperties(ruleConfigurations.getProps());
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), getTestParameters().getInputParameters(), standardSqlParserEngine.parse(getTestParameters().getInputSQL(), false));
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
getTestParameters().getInputParameters(), standardSqlParserEngine.parseToSQLStatement(getTestParameters().getInputSQL(), false));
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
......
......@@ -47,8 +47,8 @@ import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngine;
import org.junit.runners.Parameterized.Parameters;
import java.io.File;
......@@ -87,8 +87,8 @@ public final class ShardingSQLRewriterParameterizedTest extends AbstractSQLRewri
StandardSQLParserEngineFactory.getSQLParserEngine(null == getTestParameters().getDatabaseType() ? "SQL92" : getTestParameters().getDatabaseType());
ShardingSphereMetaData metaData = createShardingSphereMetaData();
ConfigurationProperties props = new ConfigurationProperties(yamlRootRuleConfigs.getProps());
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), getTestParameters().getInputParameters(), standardSqlParserEngine.parse(getTestParameters().getInputSQL(), false));
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaData.getSchemaMetaData().getConfiguredSchemaMetaData(),
getTestParameters().getInputParameters(), standardSqlParserEngine.parseToSQLStatement(getTestParameters().getInputSQL(), false));
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), rules, Collections.emptyMap(), metaData);
RouteContext routeContext = new SQLRouteEngine(props, rules).route(logicSQL, schema);
......
......@@ -36,8 +36,8 @@ import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
import org.apache.shardingsphere.infra.schema.ShardingSphereSchema;
import org.apache.shardingsphere.sharding.route.engine.fixture.AbstractRoutingEngineTest;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngine;
import java.sql.Types;
import java.util.Arrays;
......@@ -60,7 +60,7 @@ public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
ConfigurationProperties props = new ConfigurationProperties(new Properties());
StandardSQLParserEngine standardSqlParserEngine = StandardSQLParserEngineFactory.getSQLParserEngine("MySQL");
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), parameters, standardSqlParserEngine.parse(sql, false));
metaData.getSchemaMetaData().getConfiguredSchemaMetaData(), parameters, standardSqlParserEngine.parseToSQLStatement(sql, false));
LogicSQL logicSQL = new LogicSQL(sqlStatementContext, sql, parameters);
ShardingSphereSchema schema = new ShardingSphereSchema("sharding_db", Collections.emptyList(), Collections.singleton(shardingRule), Collections.emptyMap(), metaData);
RouteContext result = new SQLRouteEngine(props, Collections.singletonList(shardingRule)).route(logicSQL, schema);
......
......@@ -139,7 +139,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
statements = new ArrayList<>();
parameterSets = new ArrayList<>();
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(schemaContexts.getDatabaseType()));
sqlStatement = sqlParserEngine.parse(sql, true);
sqlStatement = sqlParserEngine.parseToSQLStatement(sql, true);
parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
statementOption = returnGeneratedKeys ? new StatementOption(true) : new StatementOption(resultSetType, resultSetConcurrency, resultSetHoldability);
SQLExecutor sqlExecutor = new SQLExecutor(schemaContexts.getExecutorKernel(), connection.isHoldTransaction());
......
......@@ -307,7 +307,7 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
private LogicSQL createLogicSQL(final String sql) {
PhysicalSchemaMetaData schemaMetaData = schemaContexts.getDefaultSchema().getMetaData().getSchemaMetaData().getSchemaMetaData();
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(schemaContexts.getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(sql, false);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(sql, false);
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(schemaMetaData, Collections.emptyList(), sqlStatement);
return new LogicSQL(sqlStatementContext, sql, Collections.emptyList());
}
......
......@@ -60,7 +60,7 @@ public final class TextProtocolBackendHandlerFactory {
if (trimSQL.toUpperCase().startsWith(ShardingCTLBackendHandlerFactory.SCTL)) {
return ShardingCTLBackendHandlerFactory.newInstance(trimSQL, backendConnection);
}
SQLStatement sqlStatement = new ShardingSphereSQLParserEngine(databaseType.getName()).parse(sql, false);
SQLStatement sqlStatement = new ShardingSphereSQLParserEngine(databaseType.getName()).parseToSQLStatement(sql, false);
if (sqlStatement instanceof RDLStatement || sqlStatement instanceof CreateDatabaseStatement || sqlStatement instanceof DropDatabaseStatement) {
return new RDLBackendHandler(backendConnection, sqlStatement);
}
......
......@@ -87,7 +87,7 @@ public final class ShardingCTLExplainBackendHandler implements TextProtocolBacke
PhysicalSchemaMetaData schemaMetaData = schema.getMetaData().getSchemaMetaData().getSchemaMetaData();
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(explainStatement.getSql(), false);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(explainStatement.getSql(), false);
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(schemaMetaData, Collections.emptyList(), sqlStatement);
return new LogicSQL(sqlStatementContext, explainStatement.getSql(), Collections.emptyList());
}
......
......@@ -59,7 +59,7 @@ public final class MySQLComStmtExecuteExecutor implements QueryCommandExecutor {
public MySQLComStmtExecuteExecutor(final MySQLComStmtExecutePacket packet, final BackendConnection backendConnection) {
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(packet.getSql(), true);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(packet.getSql(), true);
databaseCommunicationEngine = DatabaseCommunicationEngineFactory.getInstance().newBinaryProtocolInstance(sqlStatement, packet.getSql(), packet.getParameters(), backendConnection);
}
......
......@@ -52,7 +52,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
public Collection<DatabasePacket<?>> execute() {
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(packet.getSql(), true);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(packet.getSql(), true);
if (!MySQLComStmtPrepareChecker.isStatementAllowed(sqlStatement)) {
throw new UnsupportedPreparedStatementException();
}
......
......@@ -56,7 +56,7 @@ public final class MySQLComFieldListPacketExecutor implements CommandExecutor {
String sql = String.format(SQL, packet.getTable(), schemaName);
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(sql, false);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(sql, false);
databaseCommunicationEngine = DatabaseCommunicationEngineFactory.getInstance().newTextProtocolInstance(sqlStatement, sql, backendConnection);
}
......
......@@ -73,7 +73,7 @@ public final class PostgreSQLComBindExecutor implements QueryCommandExecutor {
if (null != packet.getSql() && null != schema) {
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(packet.getSql(), true);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(packet.getSql(), true);
databaseCommunicationEngine =
DatabaseCommunicationEngineFactory.getInstance().newBinaryProtocolInstance(sqlStatement, packet.getSql(), packet.getParameters(), backendConnection);
} else {
......
......@@ -51,7 +51,7 @@ public final class PostgreSQLComParseExecutor implements CommandExecutor {
if (!packet.getSql().isEmpty()) {
ShardingSphereSQLParserEngine sqlParserEngine = new ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(ProxyContext.getInstance().getSchemaContexts().getDatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(packet.getSql(), true);
SQLStatement sqlStatement = sqlParserEngine.parseToSQLStatement(packet.getSql(), true);
binaryStatementRegistry.register(packet.getStatementId(), packet.getSql(), sqlStatement.getParameterCount(), packet.getBinaryStatementParameterTypes());
}
return Collections.singletonList(new PostgreSQLParseCompletePacket());
......
......@@ -18,15 +18,15 @@
package org.apache.shardingsphere.rdl.parser.engine;
import org.apache.shardingsphere.rdl.parser.engine.engine.RDLSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.statement.StatementSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
/**
* Sharding sphere SQL parser engine.
*/
public final class ShardingSphereSQLParserEngine implements StatementSQLParserEngine {
public final class ShardingSphereSQLParserEngine implements SQLParserEngine {
private final StandardSQLParserEngine standardSqlParserEngine;
......@@ -38,14 +38,14 @@ public final class ShardingSphereSQLParserEngine implements StatementSQLParserEn
}
@Override
public SQLStatement parse(final String sql, final boolean useCache) {
public SQLStatement parseToSQLStatement(final String sql, final boolean useCache) {
SQLStatement result;
try {
result = standardSqlParserEngine.parse(sql, useCache);
result = standardSqlParserEngine.parseToSQLStatement(sql, useCache);
// CHECKSTYLE:OFF
} catch (final Exception ex) {
// CHECKSTYLE:ON
result = rdlsqlParserEngine.parse(sql, useCache);
result = rdlsqlParserEngine.parseToSQLStatement(sql, useCache);
}
return result;
}
......
......@@ -21,7 +21,7 @@ import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.rdl.parser.engine.executor.RDLSQLParserExecutor;
import org.apache.shardingsphere.rdl.parser.sql.visitor.ShardingSphereVisitor;
import org.apache.shardingsphere.sql.parser.engine.statement.StatementSQLParserEngine;
import org.apache.shardingsphere.sql.parser.engine.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.hook.ParsingHookRegistry;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
......@@ -29,7 +29,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
* RDL SQL parser engine.
*/
@RequiredArgsConstructor
public final class RDLSQLParserEngine implements StatementSQLParserEngine {
public final class RDLSQLParserEngine implements SQLParserEngine {
private final ParsingHookRegistry parsingHookRegistry = ParsingHookRegistry.getInstance();
......@@ -41,7 +41,7 @@ public final class RDLSQLParserEngine implements StatementSQLParserEngine {
* @see <a href="https://github.com/apache/skywalking/blob/master/docs/en/guides/Java-Plugin-Development-Guide.md#user-content-plugin-development-guide">Plugin Development Guide</a>
*/
@Override
public SQLStatement parse(final String sql, final boolean useCache) {
public SQLStatement parseToSQLStatement(final String sql, final boolean useCache) {
parsingHookRegistry.start(sql);
try {
SQLStatement result = parse0(sql);
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sql.parser.engine;
package org.apache.shardingsphere.sql.parser.cache;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
......
......@@ -15,38 +15,36 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sql.parser.engine.ast;
package org.apache.shardingsphere.sql.parser.cache;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitorType;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* AST SQL parser engine factory.
* SQL Parsed result caches.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ASTSQLParserEngineFactory {
public final class SQLParsedResultCaches {
private static final Map<String, ASTSQLParserEngine> ENGINES = new ConcurrentHashMap<>();
private final Map<SQLVisitorType, SQLParsedResultCache> cacheMap = new ConcurrentHashMap<>();
/**
* Get SQL parser engine.
* Get SQL parsed result cache.
*
* @param databaseTypeName name of database type
* @return SQL parser engine
* @param type type
* @return SQL parsed result cache
*/
public static ASTSQLParserEngine getSQLParserEngine(final String databaseTypeName) {
if (ENGINES.containsKey(databaseTypeName)) {
return ENGINES.get(databaseTypeName);
public SQLParsedResultCache getCache(final SQLVisitorType type) {
if (cacheMap.containsKey(type)) {
return cacheMap.get(type);
}
synchronized (ENGINES) {
if (ENGINES.containsKey(databaseTypeName)) {
return ENGINES.get(databaseTypeName);
synchronized (cacheMap) {
if (cacheMap.containsKey(type)) {
return cacheMap.get(type);
}
ASTSQLParserEngine result = new ASTSQLParserEngine(databaseTypeName);
ENGINES.put(databaseTypeName, result);
SQLParsedResultCache result = new SQLParsedResultCache<>();
cacheMap.put(type, result);
return result;
}
}
......
......@@ -17,17 +17,19 @@
package org.apache.shardingsphere.sql.parser.engine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
/**
* SQL parser engine.
* Statement SQL parser engine.
*/
public interface SQLParserEngine<T> {
public interface SQLParserEngine {
/**
* Parse SQL.
*
* Parse to SQL Statement.
*
* @param sql SQL
* @param useCache use cache or not
* @return T
* @return SQL statement
*/
T parse(String sql, boolean useCache);
SQLStatement parseToSQLStatement(String sql, boolean useCache);
}
/*
* 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.sql.parser.engine.ast;
import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.shardingsphere.sql.parser.engine.SQLParsedResultCache;
import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
import org.apache.shardingsphere.sql.parser.engine.SQLParserEngine;
import java.util.Optional;
/**
* AST SQL parser engine.
*/
@RequiredArgsConstructor
public final class ASTSQLParserEngine implements SQLParserEngine<ParseTree> {
private final String databaseTypeName;
private final SQLParsedResultCache<ParseTree> cache = new SQLParsedResultCache<>();
@Override
public ParseTree parse(final String sql, final boolean useCache) {
if (useCache) {
Optional<ParseTree> parsedResult = cache.get(sql);
if (parsedResult.isPresent()) {
return parsedResult.get();
}
}
ParseTree result = new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode();
if (useCache) {
cache.put(sql, result);
}
return result;
}
}
......@@ -15,16 +15,18 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sql.parser.engine.statement.standard;
package org.apache.shardingsphere.sql.parser.engine.standard;
import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitorType;
import org.apache.shardingsphere.sql.parser.engine.SQLParsedResultCache;
import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCaches;
import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory;
import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule;
import org.apache.shardingsphere.sql.parser.engine.statement.StatementSQLParserEngine;
import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCache;
import org.apache.shardingsphere.sql.parser.engine.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.hook.ParsingHookRegistry;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
......@@ -34,26 +36,42 @@ import java.util.Optional;
* Standard SQL parser engine.
*/
@RequiredArgsConstructor
public final class StandardSQLParserEngine implements StatementSQLParserEngine {
public final class StandardSQLParserEngine implements SQLParserEngine {
private final String databaseTypeName;
private final SQLParsedResultCache<SQLStatement> cache = new SQLParsedResultCache<>();
private final SQLParsedResultCaches caches = new SQLParsedResultCaches();
private final ParsingHookRegistry parsingHookRegistry = ParsingHookRegistry.getInstance();
/**
* Parse to AST.
* @param sql SQL
* @param useCache use cache or not
* @return parse tree
*/
public ParseTree parseToAST(final String sql, final boolean useCache) {
Optional<ParseTree> parseTree = getCache(sql, useCache, SQLVisitorType.FORMAT);
if (parseTree.isPresent()) {
return parseTree.get();
}
ParseTree result = parse0(sql);
putCache(sql, result, useCache, SQLVisitorType.FORMAT);
return result;
}
// TODO check skywalking plugin
/*
/**
* To make sure SkyWalking will be available at the next release of ShardingSphere,
* a new plugin should be provided to SkyWalking project if this API changed.
*
* @see <a href="https://github.com/apache/skywalking/blob/master/docs/en/guides/Java-Plugin-Development-Guide.md#user-content-plugin-development-guide">Plugin Development Guide</a>
*/
@Override
public SQLStatement parse(final String sql, final boolean useCache) {
public SQLStatement parseToSQLStatement(final String sql, final boolean useCache) {
parsingHookRegistry.start(sql);
try {
SQLStatement result = parse0(sql, useCache);
SQLStatement result = parseToSQLStatement0(sql, useCache);
parsingHookRegistry.finishSuccess(result);
return result;
// CHECKSTYLE:OFF
......@@ -64,19 +82,45 @@ public final class StandardSQLParserEngine implements StatementSQLParserEngine {
}
}
private SQLStatement parse0(final String sql, final boolean useCache) {
/**
* Parse.
*
* @param sql SQL
* @param visitor visitor
* @return object
*/
public Object parse(final String sql, final ParseTreeVisitor visitor) {
return parse0(sql).accept(visitor);
}
private SQLStatement parseToSQLStatement0(final String sql, final boolean useCache) {
Optional<SQLStatement> statement = getCache(sql, useCache, SQLVisitorType.STATEMENT);
if (statement.isPresent()) {
return statement.get();
}
ParseTree parseTree = parse0(sql);
ParseTreeVisitor visitor = SQLVisitorFactory.newInstance(databaseTypeName, SQLVisitorType.STATEMENT, SQLVisitorRule.valueOf(parseTree.getClass()));
SQLStatement result = (SQLStatement) parseTree.accept(visitor);
putCache(sql, result, useCache, SQLVisitorType.STATEMENT);
return result;
}
private Optional getCache(final String sql, final boolean useCache, final SQLVisitorType type) {
if (useCache) {
Optional<SQLStatement> cachedSQLStatement = cache.get(sql);
if (cachedSQLStatement.isPresent()) {
return cachedSQLStatement.get();
}
SQLParsedResultCache cache = caches.getCache(type);
return cache.get(sql);
}
ParseTree parseTree = new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode();
SQLStatement result =
(SQLStatement) SQLVisitorFactory.newInstance(databaseTypeName, SQLVisitorType.STATEMENT, SQLVisitorRule.valueOf(parseTree.getClass())).visit(parseTree);
return Optional.empty();
}
private void putCache(final String sql, final Object parsedResult, final boolean useCache, final SQLVisitorType type) {
if (useCache) {
cache.put(sql, result);
SQLParsedResultCache cache = caches.getCache(type);
cache.put(sql, parsedResult);
}
return result;
}
private ParseTree parse0(final String sql) {
return new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode();
}
}
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.sql.parser.engine.statement.standard;
package org.apache.shardingsphere.sql.parser.engine.standard;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
......@@ -33,7 +33,7 @@ public final class StandardSQLParserEngineFactory {
/**
* Get SQL parser engine.
*
*x
* @param databaseTypeName name of database type
* @return SQL parser engine
*/
......
/*
* 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.sql.parser.engine.statement;
import org.apache.shardingsphere.sql.parser.engine.SQLParserEngine;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
/**
* Statement SQL parser engine.
*/
public interface StatementSQLParserEngine extends SQLParserEngine<SQLStatement> {
@Override
SQLStatement parse(String sql, boolean useCache);
}
......@@ -17,7 +17,7 @@
package org.apache.shardingsphere.sql.parser;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sql.parser.cache;
import org.apache.shardingsphere.sql.parser.engine.SQLParsedResultCache;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
import org.junit.Test;
......
......@@ -18,7 +18,7 @@
package org.apache.shardingsphere.test.sql.parser.parameterized.engine;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.SQLStatementAssert;
......@@ -78,7 +78,7 @@ public abstract class SQLParserParameterizedTest {
SQLParserTestCase expected = SQL_PARSER_TEST_CASES_REGISTRY.get(sqlCaseId);
String databaseType = "H2".equals(this.databaseType) ? "MySQL" : this.databaseType;
String sql = SQL_CASES_LOADER.getSQL(sqlCaseId, sqlCaseType, SQL_PARSER_TEST_CASES_REGISTRY.get(sqlCaseId).getParameters());
SQLStatement actual = StandardSQLParserEngineFactory.getSQLParserEngine(databaseType).parse(sql, false);
SQLStatement actual = StandardSQLParserEngineFactory.getSQLParserEngine(databaseType).parseToSQLStatement(sql, false);
SQLStatementAssert.assertIs(new SQLCaseAssertContext(sqlCaseId, sqlCaseType), actual, expected);
}
}
......@@ -18,7 +18,7 @@
package org.apache.shardingsphere.test.sql.parser.parameterized.engine;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.engine.statement.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.engine.standard.StandardSQLParserEngineFactory;
import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
import org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.sql.SQLCaseType;
import org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.sql.loader.SQLCasesLoader;
......@@ -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;
StandardSQLParserEngineFactory.getSQLParserEngine(databaseType).parse(sql, false);
StandardSQLParserEngineFactory.getSQLParserEngine(databaseType).parseToSQLStatement(sql, false);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册