Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,16 @@ 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'
implementation 'net.logstash.logback:logstash-logback-encoder:5.2'
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'

Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Token> 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<Token> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public void testSingleDecimalToken() {

@Test
public void testSingleIntRangeToken() {
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age: 18 TO 44");
final Try<Token> 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);
Expand All @@ -120,7 +120,7 @@ public void testGreaterThan() {

@Test
public void testSingleDecimalRangeToken() {
final Try<Token> nodeOptional = boolExpressionBoolParser.parseExpression("age: 18.4 TO 44.2");
final Try<Token> 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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down