Skip to content

Commit c9045a6

Browse files
authored
Merge pull request #41 from sidhant92/array_math_functions
Support for null check
2 parents 4491a78 + 31d79ad commit c9045a6

File tree

6 files changed

+61
-4
lines changed

6 files changed

+61
-4
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import java.util.List;
44
import java.util.Map;
5+
import java.util.Optional;
56
import java.util.stream.Collectors;
67
import com.github.sidhant92.boolparser.constant.ContainerDataType;
78
import com.github.sidhant92.boolparser.constant.DataType;
89
import com.github.sidhant92.boolparser.constant.Operator;
10+
import com.github.sidhant92.boolparser.domain.FieldNode;
911
import com.github.sidhant92.boolparser.domain.logical.ArrayNode;
1012
import com.github.sidhant92.boolparser.domain.logical.BooleanNode;
1113
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
@@ -69,9 +71,11 @@ private boolean evaluateToken(final Node node, final Map<String, Object> data) {
6971
}
7072

7173
private boolean evaluateComparisonToken(final ComparisonNode comparisonToken, final Map<String, Object> data) {
72-
final Object fieldData = ValueUtils.getValueFromMap(comparisonToken.getField(), data)
73-
.orElseThrow(() -> new DataNotFoundException(comparisonToken.getField()));
74-
final Object value = comparisonToken.getValue() instanceof ArithmeticBaseNode ? arithmeticExpressionEvaluator.evaluate(
74+
final Optional<Object> fieldDataOptional = ValueUtils.getValueFromMap(comparisonToken.getField(), data);
75+
76+
final Object fieldData = comparisonToken.isNullCheck() ? fieldDataOptional.orElse("null") : fieldDataOptional.orElseThrow(
77+
() -> new DataNotFoundException(comparisonToken.getField()));
78+
final Object value = comparisonToken.isNullCheck() ? "null" : comparisonToken.getValue() instanceof ArithmeticBaseNode ? arithmeticExpressionEvaluator.evaluate(
7579
comparisonToken.getValue(), data) : comparisonToken.getValue();
7680
return operatorService.evaluateLogicalOperator(comparisonToken.getOperator(), ContainerDataType.PRIMITIVE, comparisonToken.getDataType(),
7781
fieldData, value);

src/main/java/com/github/sidhant92/boolparser/constant/Operator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.sidhant92.boolparser.constant;
22

3+
import java.util.Arrays;
4+
import java.util.List;
35
import java.util.Optional;
46
import com.github.sidhant92.boolparser.operator.logical.AbstractOperator;
57
import com.github.sidhant92.boolparser.operator.OperatorFactory;
@@ -49,4 +51,8 @@ public static Optional<Operator> getOperatorFromSymbol(final String symbol) {
4951
.map(com.github.sidhant92.boolparser.operator.arithmetic.AbstractOperator::getOperator)
5052
.findFirst();
5153
}
54+
55+
public static List<Operator> getEqualityOperators() {
56+
return Arrays.asList(EQUALS, NOT_EQUAL);
57+
}
5258
}

src/main/java/com/github/sidhant92/boolparser/domain/FieldNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@ public class FieldNode extends ArithmeticBaseNode {
1818
public NodeType getTokenType() {
1919
return NodeType.FIELD;
2020
}
21+
22+
public boolean isNull() {
23+
return this.field.equalsIgnoreCase("null");
24+
}
2125
}

src/main/java/com/github/sidhant92/boolparser/domain/logical/ComparisonNode.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.sidhant92.boolparser.constant.DataType;
44
import com.github.sidhant92.boolparser.constant.NodeType;
55
import com.github.sidhant92.boolparser.constant.Operator;
6+
import com.github.sidhant92.boolparser.domain.FieldNode;
67
import lombok.AllArgsConstructor;
78
import lombok.Builder;
89
import lombok.Getter;
@@ -29,4 +30,8 @@ public class ComparisonNode extends Node {
2930
public NodeType getTokenType() {
3031
return NodeType.COMPARISON;
3132
}
33+
34+
public boolean isNullCheck() {
35+
return Operator.getEqualityOperators().contains(this.operator) && this.value instanceof FieldNode && ((FieldNode) this.value).isNull();
36+
}
3237
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.sidhant92.boolparser.parser.antlr;
22

3+
import java.util.Optional;
34
import com.github.benmanes.caffeine.cache.Cache;
45
import com.github.benmanes.caffeine.cache.Caffeine;
56
import com.github.sidhant92.boolparser.domain.logical.Node;
@@ -25,6 +26,7 @@ public Try<Node> parseExpression(final String expression) {
2526
}
2627

2728
private Node getNode(final String expression, final String defaultField) {
28-
return cache.get(expression, ex -> super.parse(ex, defaultField));
29+
final String cacheKey = expression + "_" + Optional.ofNullable(defaultField).orElse("");
30+
return cache.get(cacheKey, ex -> super.parse(ex, defaultField));
2931
}
3032
}

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,4 +586,40 @@ public void testComparisonWithArithmeticFalseCondition1() {
586586
assertTrue(booleanOptional.isSuccess());
587587
assertFalse(booleanOptional.get());
588588
}
589+
590+
@Test
591+
public void testNullCheck() {
592+
final Map<String, Object> data = new HashMap<>();
593+
data.put("a", 2.7);
594+
final Try<Boolean> resultOptional = booleanExpressionEvaluator.evaluate("b = null", data);
595+
assertTrue(resultOptional.isSuccess());
596+
assertEquals(resultOptional.get(), true);
597+
}
598+
599+
@Test
600+
public void testNullCheck1() {
601+
final Map<String, Object> data = new HashMap<>();
602+
data.put("a", 2.7);
603+
final Try<Boolean> resultOptional = booleanExpressionEvaluator.evaluate("a = null", data);
604+
assertTrue(resultOptional.isSuccess());
605+
assertEquals(resultOptional.get(), false);
606+
}
607+
608+
@Test
609+
public void testNotNullCheck() {
610+
final Map<String, Object> data = new HashMap<>();
611+
data.put("a", 2.7);
612+
final Try<Boolean> resultOptional = booleanExpressionEvaluator.evaluate("a != null", data);
613+
assertTrue(resultOptional.isSuccess());
614+
assertEquals(resultOptional.get(), true);
615+
}
616+
617+
@Test
618+
public void testBooleanNullCheck() {
619+
final Map<String, Object> data = new HashMap<>();
620+
data.put("a", 3);
621+
final Try<Boolean> resultOptional = booleanExpressionEvaluator.evaluate("b = null && a > 2", data);
622+
assertTrue(resultOptional.isSuccess());
623+
assertEquals(resultOptional.get(), true);
624+
}
589625
}

0 commit comments

Comments
 (0)