diff --git a/build.gradle b/build.gradle index 4b3783c..a34b52d 100644 --- a/build.gradle +++ b/build.gradle @@ -31,8 +31,6 @@ repositories { } dependencies { - testImplementation group: 'junit', name: 'junit', version: '4.12' - implementation 'ch.qos.logback:logback-classic:1.2.3' implementation 'ch.qos.logback.contrib:logback-json-classic:0.1.5' implementation 'ch.qos.logback.contrib:logback-jackson:0.1.5' @@ -40,10 +38,9 @@ dependencies { implementation 'org.apache.maven:maven-artifact:3.5.2' implementation 'org.antlr:antlr4-runtime:4.11.1' implementation 'io.vavr:vavr:0.10.4' - testImplementation 'org.openjdk.jmh:jmh-core:1.35' - testImplementation 'org.openjdk.jmh:jmh-generator-annprocess:1.35' - + implementation 'com.github.ben-manes.caffeine:caffeine:2.9.3' implementation 'org.projectlombok:lombok:1.18.26' + annotationProcessor 'org.projectlombok:lombok:1.18.26' testAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.36' @@ -53,6 +50,7 @@ dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.4.2' testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.3.3' testImplementation group: 'org.mock-server', name: 'mockserver-junit-jupiter', version: '5.10.0' + testImplementation group: 'junit', name: 'junit', version: '4.12' } test { diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BoolParser.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BoolParser.java index 89e0a66..a7209e2 100644 --- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BoolParser.java +++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BoolParser.java @@ -3,25 +3,48 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import com.github.sidhant92.boolparser.domain.Token; import com.github.sidhant92.boolparser.parser.BoolExpressionParser; import io.vavr.control.Try; public class BoolParser implements BoolExpressionParser { + private boolean useCache; + + private Cache cache; + + private final ParseTreeWalker parseTreeWalker = new ParseTreeWalker(); + + public BoolParser() { + } + + public BoolParser(final int maxCacheSize) { + this.useCache = true; + this.cache = Caffeine.newBuilder().maximumSize(maxCacheSize).build(); + } + @Override public Try parseExpression(final String expression) { return Try.of(() -> getNode(expression)); } private Token getNode(final String expression) { + if (useCache) { + return cache.get(expression, this::parse); + } + return parse(expression); + } + + private Token parse(final String expression) { BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression)); CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer); BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream); BooleanExpressionParser.ParseContext filterContext = filterParser.parse(); - ParseTreeWalker parseTreeWalker = new ParseTreeWalker(); final BooleanFilterListener listener = new BooleanFilterListener(); parseTreeWalker.walk(listener, filterContext); + return listener.getNode(); } } diff --git a/src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java index 85f0054..76ba452 100644 --- a/src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java +++ b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java @@ -104,7 +104,7 @@ public void testSingleDecimalToken() { @Test public void testSingleIntRangeToken() { - final Try nodeOptional = boolExpressionBoolParser.parseExpression("age: 18 TO 44"); + final Try nodeOptional = boolExpressionBoolParser.parseExpression("age 18 TO 44"); assertTrue(nodeOptional.isSuccess()); assertEquals(nodeOptional.get().getTokenType().name(), TokenType.NUMERIC_RANGE.name()); verifyNumericRangeToken((NumericRangeToken) nodeOptional.get(), "age", 18, 44); @@ -120,7 +120,7 @@ public void testGreaterThan() { @Test public void testSingleDecimalRangeToken() { - final Try nodeOptional = boolExpressionBoolParser.parseExpression("age: 18.4 TO 44.2"); + final Try nodeOptional = boolExpressionBoolParser.parseExpression("age 18.4 TO 44.2"); assertTrue(nodeOptional.isSuccess()); assertEquals(nodeOptional.get().getTokenType().name(), TokenType.NUMERIC_RANGE.name()); verifyNumericRangeToken((NumericRangeToken) nodeOptional.get(), "age", 18.4, 44.2); diff --git a/src/test/java/com/github/sidhant92/boolparser/application/EvaluationBenchmarkService.java b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/EvaluationBenchmarkService.java similarity index 92% rename from src/test/java/com/github/sidhant92/boolparser/application/EvaluationBenchmarkService.java rename to src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/EvaluationBenchmarkService.java index 20e6bc4..42f1f80 100644 --- a/src/test/java/com/github/sidhant92/boolparser/application/EvaluationBenchmarkService.java +++ b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/EvaluationBenchmarkService.java @@ -1,4 +1,4 @@ -package com.github.sidhant92.boolparser.application; +package com.github.sidhant92.boolparser.parser.antlr.benchmark; import java.io.IOException; import java.util.Map; @@ -15,6 +15,7 @@ import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; +import com.github.sidhant92.boolparser.application.BooleanExpressionEvaluator; import com.github.sidhant92.boolparser.parser.antlr.BoolParser; import com.github.sidhant92.boolparser.provider.BoolParserDataProvider; import lombok.SneakyThrows; diff --git a/src/test/java/com/github/sidhant92/boolparser/application/ParserBenchmarkService.java b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/ParserBenchmarkService.java similarity index 96% rename from src/test/java/com/github/sidhant92/boolparser/application/ParserBenchmarkService.java rename to src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/ParserBenchmarkService.java index bff7f65..b7f964a 100644 --- a/src/test/java/com/github/sidhant92/boolparser/application/ParserBenchmarkService.java +++ b/src/test/java/com/github/sidhant92/boolparser/parser/antlr/benchmark/ParserBenchmarkService.java @@ -1,4 +1,4 @@ -package com.github.sidhant92.boolparser.application; +package com.github.sidhant92.boolparser.parser.antlr.benchmark; import java.io.IOException; import java.util.Map;