package org.jdbi.v3.core.statement;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.stats.CacheStats;
import org.jdbi.v3.meta.Beta;
abstract class CachingSqlParser implements SqlParser {
private final LoadingCache<String, ParsedSql> parsedSqlCache;
CachingSqlParser() {
this(Caffeine.newBuilder()
.maximumSize(1_000));
}
CachingSqlParser(Caffeine<Object, Object> cache) {
parsedSqlCache = cache.build(this::internalParse);
}
@Override
public ParsedSql parse(String sql, StatementContext ctx) {
try {
return parsedSqlCache.get(sql);
} catch (IllegalArgumentException e) {
throw new UnableToCreateStatementException("Exception parsing for named parameter replacement", e, ctx);
}
}
@Beta
public CacheStats cacheStats() {
return parsedSqlCache.stats();
}
abstract ParsedSql internalParse(String sql);
}