This is an automated email from the ASF dual-hosted git repository. chengzhang 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 b06bfdc0631 Update cache option when getSQLStatementParserEngine. (#35371) b06bfdc0631 is described below commit b06bfdc06312152e6d7e7c47d863bd8c21bda738 Author: Cong Hu <iamhuc...@gmail.com> AuthorDate: Mon May 12 14:41:38 2025 +0800 Update cache option when getSQLStatementParserEngine. (#35371) --- .../infra/parser/cache/CacheManager.java} | 26 ++++++++++++---------- .../parser/cache/SQLStatementCacheBuilder.java | 8 ++++--- .../parser/cache/SQLStatementCacheLoader.java | 9 ++++++++ .../infra/parser/sql/SQLStatementParserEngine.java | 21 +++++++++++++---- .../sql/SQLStatementParserEngineFactory.java | 3 +-- .../parser/sql/SQLStatementParserExecutor.java | 9 ++++++++ .../parser/cache/SQLStatementCacheBuilderTest.java | 3 +-- .../sql/SQLStatementParserEngineFactoryTest.java | 3 +-- .../sql/parser/api/SQLParserEngine.java | 9 ++++++++ 9 files changed, 66 insertions(+), 25 deletions(-) diff --git a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java similarity index 60% copy from infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java copy to infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java index 63d78242d37..379cd075f53 100644 --- a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java @@ -17,19 +17,21 @@ package org.apache.shardingsphere.infra.parser.cache; +import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.LoadingCache; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.sql.parser.api.CacheOption; -import org.junit.jupiter.api.Test; +import lombok.Getter; +import lombok.RequiredArgsConstructor; -import static org.hamcrest.CoreMatchers.isA; -import static org.hamcrest.MatcherAssert.assertThat; - -class SQLStatementCacheBuilderTest { +/** + * Cache manager. + * @param <K> the type of keys maintained by this cache + * @param <V> the type of mapped values + */ +@RequiredArgsConstructor +@Getter +public class CacheManager<K, V> { + + private final LoadingCache<K, V> cache; - @Test - void assertBuild() { - assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class, "SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)), isA(LoadingCache.class)); - } + private final CacheLoader<K, V> cacheLoader; } diff --git a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java index 648a453764b..c28195f092b 100644 --- a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java @@ -39,9 +39,11 @@ public final class SQLStatementCacheBuilder { * @param databaseType database type * @return built SQL statement cache */ - public static LoadingCache<String, SQLStatement> build(final DatabaseType databaseType, final CacheOption sqlStatementCacheOption, + public static CacheManager<String, SQLStatement> build(final DatabaseType databaseType, final CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) { - return Caffeine.newBuilder().softValues().initialCapacity(sqlStatementCacheOption.getInitialCapacity()).maximumSize(sqlStatementCacheOption.getMaximumSize()) - .build(new SQLStatementCacheLoader(databaseType, parseTreeCacheOption)); + SQLStatementCacheLoader sqlStatementCacheLoader = new SQLStatementCacheLoader(databaseType, parseTreeCacheOption); + LoadingCache<String, SQLStatement> loadingCache = + Caffeine.newBuilder().softValues().initialCapacity(sqlStatementCacheOption.getInitialCapacity()).maximumSize(sqlStatementCacheOption.getMaximumSize()).build(sqlStatementCacheLoader); + return new CacheManager<>(loadingCache, sqlStatementCacheLoader); } } diff --git a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java index 3df17d6031e..f4df2c4a584 100644 --- a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java @@ -36,6 +36,15 @@ public final class SQLStatementCacheLoader implements CacheLoader<String, SQLSta sqlStatementParserExecutor = new SQLStatementParserExecutor(databaseType, parseTreeCacheOption); } + /** + * Update cache option. + * + * @param parseTreeCacheOption parse tree cache option + */ + public void updateCacheOption(final CacheOption parseTreeCacheOption) { + sqlStatementParserExecutor.updateCacheOption(parseTreeCacheOption); + } + @ParametersAreNonnullByDefault @Override public SQLStatement load(final String sql) { diff --git a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java index 48bcefc3fc9..72313e24e16 100644 --- a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java @@ -17,10 +17,11 @@ package org.apache.shardingsphere.infra.parser.sql; -import com.github.benmanes.caffeine.cache.LoadingCache; import lombok.Getter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.parser.cache.CacheManager; import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder; +import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader; import org.apache.shardingsphere.sql.parser.api.CacheOption; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; @@ -31,7 +32,7 @@ public final class SQLStatementParserEngine { private final SQLStatementParserExecutor sqlStatementParserExecutor; - private final LoadingCache<String, SQLStatement> sqlStatementCache; + private final CacheManager<String, SQLStatement> sqlStatementCacheManager; @Getter private final CacheOption sqlStatementCacheOption; @@ -41,11 +42,23 @@ public final class SQLStatementParserEngine { public SQLStatementParserEngine(final DatabaseType databaseType, final CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) { sqlStatementParserExecutor = new SQLStatementParserExecutor(databaseType, parseTreeCacheOption); - sqlStatementCache = SQLStatementCacheBuilder.build(databaseType, sqlStatementCacheOption, parseTreeCacheOption); + sqlStatementCacheManager = SQLStatementCacheBuilder.build(databaseType, sqlStatementCacheOption, parseTreeCacheOption); this.sqlStatementCacheOption = sqlStatementCacheOption; this.parseTreeCacheOption = parseTreeCacheOption; } + /** + * Update cache option. + * + * @param sqlStatementCacheOption SQL statement cache option + * @param parseTreeCacheOption parse tree cache option + */ + public void updateCacheOption(final CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) { + sqlStatementCacheManager.getCache().policy().eviction().ifPresent(eviction -> eviction.setMaximum(sqlStatementCacheOption.getMaximumSize())); + ((SQLStatementCacheLoader) sqlStatementCacheManager.getCacheLoader()).updateCacheOption(parseTreeCacheOption); + sqlStatementParserExecutor.updateCacheOption(parseTreeCacheOption); + } + /** * Parse to SQL statement. * @@ -54,6 +67,6 @@ public final class SQLStatementParserEngine { * @return SQL statement */ public SQLStatement parse(final String sql, final boolean useCache) { - return useCache ? sqlStatementCache.get(sql) : sqlStatementParserExecutor.parse(sql); + return useCache ? sqlStatementCacheManager.getCache().get(sql) : sqlStatementParserExecutor.parse(sql); } } diff --git a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java index 923fb8facc4..b58c83e849b 100644 --- a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java @@ -46,8 +46,7 @@ public final class SQLStatementParserEngineFactory { if (null == result) { result = ENGINES.computeIfAbsent(databaseType, key -> new SQLStatementParserEngine(key, sqlStatementCacheOption, parseTreeCacheOption)); } else if (!result.getSqlStatementCacheOption().equals(sqlStatementCacheOption) || !result.getParseTreeCacheOption().equals(parseTreeCacheOption)) { - result = new SQLStatementParserEngine(databaseType, sqlStatementCacheOption, parseTreeCacheOption); - ENGINES.put(databaseType, result); + result.updateCacheOption(sqlStatementCacheOption, parseTreeCacheOption); } return result; } diff --git a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java index def8e58a088..2ce64f66c62 100644 --- a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java +++ b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java @@ -37,6 +37,15 @@ public final class SQLStatementParserExecutor { visitorEngine = new SQLStatementVisitorEngine(databaseType); } + /** + * Update cache option. + * + * @param parseTreeCacheOption parse tree cache option + */ + public void updateCacheOption(final CacheOption parseTreeCacheOption) { + parserEngine.updateCacheOption(parseTreeCacheOption); + } + /** * Parse to SQL statement. * diff --git a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java index 63d78242d37..6739dd1eb0b 100644 --- a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java +++ b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.infra.parser.cache; -import com.github.benmanes.caffeine.cache.LoadingCache; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.api.CacheOption; @@ -30,6 +29,6 @@ class SQLStatementCacheBuilderTest { @Test void assertBuild() { - assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class, "SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)), isA(LoadingCache.class)); + assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class, "SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)), isA(CacheManager.class)); } } diff --git a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java index 0f56b81c6fe..58c4dc7dbe3 100644 --- a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java +++ b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java @@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.api.CacheOption; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertSame; class SQLStatementParserEngineFactoryTest { @@ -33,7 +32,7 @@ class SQLStatementParserEngineFactoryTest { void assertGetSQLStatementParserEngineNotSame() { SQLStatementParserEngine before = SQLStatementParserEngineFactory.getSQLStatementParserEngine(databaseType, new CacheOption(2000, 65535L), new CacheOption(64, 1024L)); SQLStatementParserEngine after = SQLStatementParserEngineFactory.getSQLStatementParserEngine(databaseType, new CacheOption(2000, 65535L), new CacheOption(128, 1024L)); - assertNotSame(before, after); + assertSame(before, after); } @Test diff --git a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java index 9b3929ee8dd..3f6917c4d1c 100644 --- a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java +++ b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java @@ -42,6 +42,15 @@ public final class SQLParserEngine { this(TypedSPILoader.getService(DatabaseType.class, databaseType), cacheOption); } + /** + * Update cache option. + * + * @param cacheOption cache option + */ + public void updateCacheOption(final CacheOption cacheOption) { + parseTreeCache.policy().eviction().ifPresent(eviction -> eviction.setMaximum(cacheOption.getMaximumSize())); + } + /** * Parse SQL. *