Skip to content

Commit 209b6b7

Browse files
authored
Merge pull request #20 from sidhant92/develop
Default Field Support
2 parents de0161e + 8636afe commit 209b6b7

File tree

6 files changed

+54
-13
lines changed

6 files changed

+54
-13
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ sourceCompatibility = 1.8
2222
targetCompatibility = 1.8
2323

2424
group 'com.github.sidhant92'
25-
version = "1.0.1"
25+
version = "1.1.0"
2626

2727
apply plugin: "com.dipien.semantic-version"
2828

src/main/java/com/github/sidhant92/boolparser/application/BooleanExpressionEvaluator.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@ public BooleanExpressionEvaluator(final BoolExpressionParser boolExpressionParse
3434
operatorService = new OperatorService();
3535
}
3636

37-
public Try<Boolean> evaluate(final String expression, final Map<String, Object> data) {
38-
final Try<Node> tokenOptional = boolExpressionParser.parseExpression(expression);
37+
public Try<Boolean> evaluate(final String expression, final Map<String, Object> data, final String defaultField) {
38+
final Try<Node> tokenOptional = boolExpressionParser.parseExpression(expression, defaultField);
3939
return tokenOptional.map(node -> evaluateToken(node, data));
4040
}
4141

42+
public Try<Boolean> evaluate(final String expression, final Map<String, Object> data) {
43+
return evaluate(expression, data, null);
44+
}
45+
4246
private boolean evaluateToken(final Node node, final Map<String, Object> data) {
4347
switch (node.getTokenType()) {
4448
case COMPARISON:

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<Node> parseExpression(final String expression);
12+
13+
Try<Node> parseExpression(final String expression, final String defaultField);
1214
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,30 @@ public BoolParser(final int maxCacheSize) {
2828
this.cache = Caffeine.newBuilder().maximumSize(maxCacheSize).build();
2929
}
3030

31+
@Override
32+
public Try<Node> parseExpression(final String expression, final String defaultField) {
33+
return Try.of(() -> getNode(expression, defaultField));
34+
}
35+
3136
@Override
3237
public Try<Node> parseExpression(final String expression) {
33-
return Try.of(() -> getNode(expression));
38+
return Try.of(() -> getNode(expression, null));
3439
}
3540

36-
private Node getNode(final String expression) {
41+
private Node getNode(final String expression, final String defaultField) {
3742
if (useCache) {
38-
return cache.get(expression, this::parse);
43+
return cache.get(expression, ex -> parse(ex, defaultField));
3944
}
40-
return parse(expression);
45+
return parse(expression, defaultField);
4146
}
4247

43-
private Node parse(final String expression) {
48+
private Node parse(final String expression, final String defaultField) {
4449
final BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression));
4550
final CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer);
4651
final BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream);
4752
final ParseTree parseTree = filterParser.parse();
4853

49-
final BooleanFilterListener listener = new BooleanFilterListener();
54+
final BooleanFilterListener listener = new BooleanFilterListener(defaultField);
5055
parseTreeWalker.walk(listener, parseTree);
5156

5257
return listener.getNode();

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.github.sidhant92.boolparser.parser.antlr;
22

33
import java.util.List;
4+
import java.util.Objects;
45
import java.util.Stack;
56
import java.util.stream.Collectors;
7+
import org.apache.commons.lang3.StringUtils;
68
import org.apache.commons.lang3.tuple.Pair;
79
import com.github.sidhant92.boolparser.constant.DataType;
810
import com.github.sidhant92.boolparser.constant.LogicalOperationType;
@@ -25,7 +27,10 @@ public class BooleanFilterListener extends BooleanExpressionBaseListener {
2527

2628
private org.antlr.v4.runtime.Token lastToken;
2729

28-
public BooleanFilterListener() {
30+
private String defaultField;
31+
32+
public BooleanFilterListener(final String defaultField) {
33+
this.defaultField = defaultField;
2934
this.node = null;
3035
this.lastToken = null;
3136
this.currentNodes = new Stack<>();
@@ -37,7 +42,7 @@ public Node getNode() {
3742

3843
@Override
3944
public void exitComparatorExpression(BooleanExpressionParser.ComparatorExpressionContext ctx) {
40-
final String variableName = ctx.left.getText();
45+
final String variableName = getField(ctx.left.getText());
4146
final DataType dataType = getDataType(ctx.right.getStart());
4247
final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
4348
currentNodes.add(new ComparisonNode(variableName, ValueUtils.convertValue(ctx.right.getText(), dataType), operator, dataType));
@@ -46,7 +51,7 @@ public void exitComparatorExpression(BooleanExpressionParser.ComparatorExpressio
4651

4752
@Override
4853
public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) {
49-
final String field = ctx.field.getText();
54+
final String field = getField(ctx.field.getText());
5055
final DataType lowerDataType = getDataType(ctx.lower.start);
5156
final Object lowerValue = ValueUtils.convertValue(ctx.lower.start.getText(), lowerDataType);
5257
final DataType upperDataType = getDataType(ctx.upper.start);
@@ -57,7 +62,7 @@ public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) {
5762

5863
@Override
5964
public void exitInExpression(BooleanExpressionParser.InExpressionContext ctx) {
60-
final String field = ctx.field.getText();
65+
final String field = getField(ctx.field.getText());
6166
final List<Pair<DataType, Object>> items = ctx.data.children
6267
.stream()
6368
.filter(child -> child instanceof BooleanExpressionParser.TypesContext)
@@ -71,6 +76,13 @@ public void exitInExpression(BooleanExpressionParser.InExpressionContext ctx) {
7176
super.exitInExpression(ctx);
7277
}
7378

79+
private String getField(final String field) {
80+
if (Objects.isNull(defaultField)) {
81+
return field;
82+
}
83+
return StringUtils.isBlank(field) ? defaultField : field;
84+
}
85+
7486
private DataType getDataType(final org.antlr.v4.runtime.Token token) {
7587
switch (token.getType()) {
7688
case BooleanExpressionLexer.DECIMAL:

src/test/java/com/github/sidhant92/boolparser/application/BooleanExpressionEvaluatorTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,4 +419,22 @@ public void testStringEqualityWithQuotes() {
419419
assertTrue(booleanOptional.isSuccess());
420420
assertTrue(booleanOptional.get());
421421
}
422+
423+
@Test
424+
public void testDefaultFieldTrue() {
425+
final Map<String, Object> data = new HashMap<>();
426+
data.put("age", 19);
427+
final Try<Boolean> booleanOptional = booleanExpressionEvaluator.evaluate(">= 18 AND < 20", data, "age");
428+
assertTrue(booleanOptional.isSuccess());
429+
assertTrue(booleanOptional.get());
430+
}
431+
432+
@Test
433+
public void testDefaultFieldFalse() {
434+
final Map<String, Object> data = new HashMap<>();
435+
data.put("age", 17);
436+
final Try<Boolean> booleanOptional = booleanExpressionEvaluator.evaluate(">= 18 AND < 20", data, "age");
437+
assertTrue(booleanOptional.isSuccess());
438+
assertFalse(booleanOptional.get());
439+
}
422440
}

0 commit comments

Comments
 (0)