You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/11/20 08:12:26 UTC

[shardingsphere] branch master updated: Use LoadingCache to simplify SQLStatementParserEngine (#8239)

This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 5917780  Use LoadingCache to simplify SQLStatementParserEngine (#8239)
5917780 is described below

commit 59177804f5876542dcc560170e5c1986754f6210
Author: Liang Zhang <te...@163.com>
AuthorDate: Fri Nov 20 16:12:11 2020 +0800

    Use LoadingCache to simplify SQLStatementParserEngine (#8239)
---
 .../parser/cache/SQLStatementCacheBuilder.java     | 44 ++++++++++++++++++++++
 .../parser/cache/SQLStatementCacheLoader.java      | 20 +++++-----
 .../infra/parser/sql/SQLStatementParserEngine.java | 37 +++++-------------
 ...Engine.java => SQLStatementParserExecutor.java} | 32 +++-------------
 .../parser/core/cache/ParseTreeCacheLoader.java    |  4 +-
 5 files changed, 72 insertions(+), 65 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
new file mode 100644
index 0000000..ae40647
--- /dev/null
+++ b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
@@ -0,0 +1,44 @@
+/*
+ * 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.infra.parser.cache;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.LoadingCache;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+
+/**
+ * SQL statement cache builder.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SQLStatementCacheBuilder {
+    
+    /**
+     * Build SQL statement cache.
+     *
+     * @param option cache option
+     * @param databaseType database type
+     * @return built SQL statement cache
+     */
+    public static LoadingCache<String, SQLStatement> build(final CacheOption option, final String databaseType) {
+        return CacheBuilder.newBuilder().softValues()
+                .initialCapacity(option.getInitialCapacity()).maximumSize(option.getMaximumSize()).concurrencyLevel(option.getConcurrencyLevel()).build(new SQLStatementCacheLoader(databaseType));
+    }
+}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
similarity index 60%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java
copy to shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
index 2804e8a..d7fa9d0 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
@@ -15,28 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core.cache;
+package org.apache.shardingsphere.infra.parser.cache;
 
 import com.google.common.cache.CacheLoader;
-import org.antlr.v4.runtime.tree.ParseTree;
-import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
+import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserExecutor;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import javax.annotation.ParametersAreNonnullByDefault;
 
 /**
- * Parse tree cache loader.
+ * SQL statement cache loader.
  */
-public final class ParseTreeCacheLoader extends CacheLoader<String, ParseTree> {
+public final class SQLStatementCacheLoader extends CacheLoader<String, SQLStatement> {
     
-    private final SQLParserExecutor sqlParserExecutor;
+    private final SQLStatementParserExecutor sqlStatementParserExecutor;
     
-    public ParseTreeCacheLoader(final String databaseType) {
-        sqlParserExecutor = new SQLParserExecutor(databaseType);
+    public SQLStatementCacheLoader(final String databaseType) {
+        sqlStatementParserExecutor = new SQLStatementParserExecutor(databaseType);
     }
     
     @ParametersAreNonnullByDefault
     @Override
-    public ParseTree load(final String key) {
-        return sqlParserExecutor.parse(key);
+    public SQLStatement load(final String sql) {
+        return sqlStatementParserExecutor.parse(sql);
     }
 }
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 6fc46aa..43549fa 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
@@ -17,28 +17,24 @@
 
 package org.apache.shardingsphere.infra.parser.sql;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import org.apache.shardingsphere.sql.parser.api.SQLParserEngine;
-import org.apache.shardingsphere.sql.parser.api.SQLVisitorEngine;
+import com.google.common.cache.LoadingCache;
+import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
-import java.util.Optional;
-
 /**
  * SQL statement parser engine.
  */
 public final class SQLStatementParserEngine {
     
-    private final SQLParserEngine parserEngine;
-    
-    private final SQLVisitorEngine visitorEngine;
+    private final SQLStatementParserExecutor sqlStatementParserExecutor;
     
-    private final Cache<String, SQLStatement> cache = CacheBuilder.newBuilder().softValues().initialCapacity(2000).maximumSize(65535).build();
+    private final LoadingCache<String, SQLStatement> sqlStatementCache;
     
-    public SQLStatementParserEngine(final String databaseTypeName) {
-        parserEngine = new SQLParserEngine(databaseTypeName);
-        visitorEngine = new SQLVisitorEngine(databaseTypeName, "STATEMENT");
+    public SQLStatementParserEngine(final String databaseType) {
+        sqlStatementParserExecutor = new SQLStatementParserExecutor(databaseType);
+        // TODO use props to configure cache option
+        sqlStatementCache = SQLStatementCacheBuilder.build(new CacheOption(2000, 65535L, 4), databaseType);
     }
     
     /**
@@ -49,19 +45,6 @@ public final class SQLStatementParserEngine {
      * @return SQL statement
      */
     public SQLStatement parse(final String sql, final boolean useCache) {
-        if (!useCache) {
-            return parse(sql);
-        }
-        Optional<SQLStatement> statement = Optional.ofNullable(cache.getIfPresent(sql));
-        if (statement.isPresent()) {
-            return statement.get();
-        }
-        SQLStatement result = parse(sql);
-        cache.put(sql, result);
-        return result;
-    }
-    
-    private SQLStatement parse(final String sql) {
-        return visitorEngine.visit(parserEngine.parse(sql, false));
+        return useCache ? sqlStatementCache.getUnchecked(sql) : sqlStatementParserExecutor.parse(sql);
     }
 }
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/SQLStatementParserExecutor.java
similarity index 56%
copy from shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
copy to shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
index 6fc46aa..e42fd22 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/SQLStatementParserExecutor.java
@@ -17,51 +17,31 @@
 
 package org.apache.shardingsphere.infra.parser.sql;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
 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;
 
-import java.util.Optional;
-
 /**
- * SQL statement parser engine.
+ * SQL statement parser executor.
  */
-public final class SQLStatementParserEngine {
+public final class SQLStatementParserExecutor {
     
     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");
+    public SQLStatementParserExecutor(final String databaseType) {
+        parserEngine = new SQLParserEngine(databaseType);
+        visitorEngine = new SQLVisitorEngine(databaseType, "STATEMENT");
     }
     
     /**
      * Parse to SQL statement.
      *
      * @param sql SQL to be parsed
-     * @param useCache whether use cache
      * @return SQL statement
      */
-    public SQLStatement parse(final String sql, final boolean useCache) {
-        if (!useCache) {
-            return parse(sql);
-        }
-        Optional<SQLStatement> statement = Optional.ofNullable(cache.getIfPresent(sql));
-        if (statement.isPresent()) {
-            return statement.get();
-        }
-        SQLStatement result = parse(sql);
-        cache.put(sql, result);
-        return result;
-    }
-    
-    private SQLStatement parse(final String sql) {
+    public SQLStatement parse(final String sql) {
         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/core/cache/ParseTreeCacheLoader.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java
index 2804e8a..76adf6c 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/cache/ParseTreeCacheLoader.java
@@ -36,7 +36,7 @@ public final class ParseTreeCacheLoader extends CacheLoader<String, ParseTree> {
     
     @ParametersAreNonnullByDefault
     @Override
-    public ParseTree load(final String key) {
-        return sqlParserExecutor.parse(key);
+    public ParseTree load(final String sql) {
+        return sqlParserExecutor.parse(sql);
     }
 }