1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.parser.sql;
19
20 import lombok.Getter;
21 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
22 import org.apache.shardingsphere.infra.parser.cache.CacheManager;
23 import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder;
24 import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader;
25 import org.apache.shardingsphere.sql.parser.engine.api.CacheOption;
26 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
27
28
29
30
31 public final class SQLStatementParserEngine {
32
33 private final SQLStatementParserExecutor sqlStatementParserExecutor;
34
35 private final CacheManager<String, SQLStatement> sqlStatementCacheManager;
36
37 @Getter
38 private final CacheOption sqlStatementCacheOption;
39
40 @Getter
41 private final CacheOption parseTreeCacheOption;
42
43 public SQLStatementParserEngine(final DatabaseType databaseType, final CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) {
44 sqlStatementParserExecutor = new SQLStatementParserExecutor(databaseType, parseTreeCacheOption);
45 sqlStatementCacheManager = SQLStatementCacheBuilder.build(databaseType, sqlStatementCacheOption, parseTreeCacheOption);
46 this.sqlStatementCacheOption = sqlStatementCacheOption;
47 this.parseTreeCacheOption = parseTreeCacheOption;
48 }
49
50
51
52
53
54
55
56 public void updateCacheOption(final CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) {
57 sqlStatementCacheManager.getCache().policy().eviction().ifPresent(eviction -> eviction.setMaximum(sqlStatementCacheOption.getMaximumSize()));
58 ((SQLStatementCacheLoader) sqlStatementCacheManager.getCacheLoader()).updateCacheOption(parseTreeCacheOption);
59 sqlStatementParserExecutor.updateCacheOption(parseTreeCacheOption);
60 }
61
62
63
64
65
66
67
68
69 public SQLStatement parse(final String sql, final boolean useCache) {
70 return useCache ? sqlStatementCacheManager.getCache().get(sql) : sqlStatementParserExecutor.parse(sql);
71 }
72 }