|
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 | + public BoolParser() { |
| 20 | + } |
| 21 | + |
| 22 | + public BoolParser(final int maxCacheSize) { |
| 23 | + this.useCache = true; |
| 24 | + this.cache = Caffeine.newBuilder().maximumSize(maxCacheSize).build(); |
| 25 | + } |
| 26 | + |
11 | 27 | @Override |
12 | 28 | public Try<Token> parseExpression(final String expression) { |
13 | 29 | return Try.of(() -> getNode(expression)); |
14 | 30 | } |
15 | 31 |
|
16 | 32 | private Token getNode(final String expression) { |
| 33 | + if (useCache) { |
| 34 | + return cache.get(expression, this::parse); |
| 35 | + } |
| 36 | + return parse(expression); |
| 37 | + } |
| 38 | + |
| 39 | + private Token parse(final String expression) { |
17 | 40 | BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression)); |
18 | 41 | CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer); |
19 | 42 | BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream); |
20 | 43 | BooleanExpressionParser.ParseContext filterContext = filterParser.parse(); |
21 | 44 |
|
22 | | - ParseTreeWalker parseTreeWalker = new ParseTreeWalker(); |
23 | 45 | final BooleanFilterListener listener = new BooleanFilterListener(); |
24 | 46 | parseTreeWalker.walk(listener, filterContext); |
| 47 | + |
25 | 48 | return listener.getNode(); |
26 | 49 | } |
27 | 50 | } |
0 commit comments