|
3 | 3 | import org.antlr.v4.runtime.CharStreams; |
4 | 4 | import org.antlr.v4.runtime.CommonTokenStream; |
5 | 5 | import org.antlr.v4.runtime.tree.ParseTreeWalker; |
| 6 | +import com.github.benmanes.caffeine.cache.Cache; |
| 7 | +import com.github.benmanes.caffeine.cache.Caffeine; |
6 | 8 | import com.github.sidhant92.boolparser.domain.Token; |
7 | 9 | import com.github.sidhant92.boolparser.parser.BoolExpressionParser; |
8 | 10 | import io.vavr.control.Try; |
9 | 11 |
|
10 | 12 | public class BoolParser implements BoolExpressionParser { |
| 13 | + private boolean useCache; |
| 14 | + |
| 15 | + private Cache<String, Token> cache; |
| 16 | + |
| 17 | + private final ParseTreeWalker parseTreeWalker = new ParseTreeWalker(); |
| 18 | + |
| 19 | + private final BooleanFilterListener listener = new BooleanFilterListener(); |
| 20 | + |
| 21 | + private static final int MAX_CACHE_SIZE = 500; |
| 22 | + |
11 | 23 | @Override |
12 | 24 | public Try<Token> parseExpression(final String expression) { |
| 25 | + return parseExpression(expression, false, MAX_CACHE_SIZE); |
| 26 | + } |
| 27 | + |
| 28 | + @Override |
| 29 | + public Try<Token> parseExpression(final String expression, final boolean useCache, final int maxCacheSize) { |
| 30 | + this.useCache = useCache; |
| 31 | + if (useCache) { |
| 32 | + this.cache = Caffeine.newBuilder().maximumSize(maxCacheSize).build(); |
| 33 | + } |
13 | 34 | return Try.of(() -> getNode(expression)); |
14 | 35 | } |
15 | 36 |
|
16 | 37 | private Token getNode(final String expression) { |
| 38 | + if (useCache) { |
| 39 | + return cache.get(expression, this::parse); |
| 40 | + } |
| 41 | + return parse(expression); |
| 42 | + } |
| 43 | + |
| 44 | + private Token parse(final String expression) { |
17 | 45 | BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression)); |
18 | 46 | CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer); |
19 | 47 | BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream); |
20 | 48 | BooleanExpressionParser.ParseContext filterContext = filterParser.parse(); |
21 | 49 |
|
22 | | - ParseTreeWalker parseTreeWalker = new ParseTreeWalker(); |
23 | | - final BooleanFilterListener listener = new BooleanFilterListener(); |
24 | 50 | parseTreeWalker.walk(listener, filterContext); |
| 51 | + |
25 | 52 | return listener.getNode(); |
26 | 53 | } |
27 | 54 | } |
0 commit comments