Skip to content

Commit

Permalink
New API for sql parser engine (#8008)
Browse files Browse the repository at this point in the history
* New API for sql parser engine

* check style

* Add EXECUTORS
  • Loading branch information
tristaZero authored Nov 2, 2020
1 parent 400e32c commit e240277
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
*
Expand All @@ -58,7 +62,6 @@ public SQLStatement parse(final String sql, final boolean useCache) {
}

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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -85,7 +84,6 @@ public final void assertSupportedSQL() {
}

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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@ protected static Collection<Object[]> getTestParameters(final String databaseTyp
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);
}
}

0 comments on commit e240277

Please sign in to comment.