Skip to content

Commit e62e276

Browse files
committed
add caching option
1 parent 971dfd8 commit e62e276

4 files changed

Lines changed: 34 additions & 4 deletions

File tree

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
implementation 'org.apache.maven:maven-artifact:3.5.2'
4141
implementation 'org.antlr:antlr4-runtime:4.11.1'
4242
implementation 'io.vavr:vavr:0.10.4'
43+
implementation 'com.github.ben-manes.caffeine:caffeine:2.9.3'
4344

4445
compileOnly 'org.projectlombok:lombok:1.18.26'
4546
annotationProcessor 'org.projectlombok:lombok:1.18.26'

src/main/java/com/github/sidhant92/boolparser/parser/BoolExpressionParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@
99
*/
1010
public interface BoolExpressionParser {
1111
Try<Token> parseExpression(final String expression);
12+
13+
Try<Token> parseExpression(final String expression, final boolean useCache, final int maxCacheSize);
1214
}

src/main/java/com/github/sidhant92/boolparser/parser/antlr/BoolParser.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,52 @@
33
import org.antlr.v4.runtime.CharStreams;
44
import org.antlr.v4.runtime.CommonTokenStream;
55
import org.antlr.v4.runtime.tree.ParseTreeWalker;
6+
import com.github.benmanes.caffeine.cache.Cache;
7+
import com.github.benmanes.caffeine.cache.Caffeine;
68
import com.github.sidhant92.boolparser.domain.Token;
79
import com.github.sidhant92.boolparser.parser.BoolExpressionParser;
810
import io.vavr.control.Try;
911

1012
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+
1123
@Override
1224
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+
}
1334
return Try.of(() -> getNode(expression));
1435
}
1536

1637
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) {
1745
BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression));
1846
CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer);
1947
BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream);
2048
BooleanExpressionParser.ParseContext filterContext = filterParser.parse();
2149

22-
ParseTreeWalker parseTreeWalker = new ParseTreeWalker();
23-
final BooleanFilterListener listener = new BooleanFilterListener();
2450
parseTreeWalker.walk(listener, filterContext);
51+
2552
return listener.getNode();
2653
}
2754
}

src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void testSingleDecimalToken() {
104104

105105
@Test
106106
public void testSingleIntRangeToken() {
107-
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age: 18 TO 44");
107+
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age 18 TO 44");
108108
assertTrue(nodeOptional.isSuccess());
109109
assertEquals(nodeOptional.get().getTokenType().name(), TokenType.NUMERIC_RANGE.name());
110110
verifyNumericRangeToken((NumericRangeToken) nodeOptional.get(), "age", 18, 44);
@@ -120,7 +120,7 @@ public void testGreaterThan() {
120120

121121
@Test
122122
public void testSingleDecimalRangeToken() {
123-
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age: 18.4 TO 44.2");
123+
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age 18.4 TO 44.2");
124124
assertTrue(nodeOptional.isSuccess());
125125
assertEquals(nodeOptional.get().getTokenType().name(), TokenType.NUMERIC_RANGE.name());
126126
verifyNumericRangeToken((NumericRangeToken) nodeOptional.get(), "age", 18.4, 44.2);

0 commit comments

Comments
 (0)