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);
     }
 }