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