Skip to content

Commit 9164c92

Browse files
committed
unary token support
1 parent 5c775a1 commit 9164c92

3 files changed

Lines changed: 55 additions & 4 deletions

File tree

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.github.sidhant92.boolparser.domain.NumericToken;
1212
import com.github.sidhant92.boolparser.domain.StringToken;
1313
import com.github.sidhant92.boolparser.domain.Token;
14+
import com.github.sidhant92.boolparser.domain.UnaryToken;
15+
import com.github.sidhant92.boolparser.exception.InvalidUnaryOperand;
1416
import com.github.sidhant92.boolparser.operator.OperatorService;
1517
import com.github.sidhant92.boolparser.parser.BoolExpressionParser;
1618
import io.vavr.control.Try;
@@ -46,6 +48,8 @@ private boolean evaluateToken(final Token token, final Map<String, Object> data)
4648
return evaluateNumericRangeToken((NumericRangeToken) token, data);
4749
case IN:
4850
return evaluateInToken((InToken) token, data);
51+
case UNARY:
52+
return evaluateUnaryToken((UnaryToken) token, data);
4953
case BOOLEAN:
5054
return evaluateBooleanNode((BooleanToken) token, data);
5155
default:
@@ -90,11 +94,24 @@ private boolean evaluateInToken(final InToken inToken, final Map<String, Object>
9094
final DataType dataType = inToken.getItems().get(0).getLeft();
9195
final Object[] values = inToken.getItems()
9296
.stream()
93-
.map(Pair::getRight)
94-
.toArray();
97+
.map(Pair::getRight).toArray();
9598
return operatorService.evaluate(Operator.IN, ContainerDataType.primitive, dataType, fieldData, values);
9699
}
97100

101+
private boolean evaluateUnaryToken(final UnaryToken unaryToken, final Map<String, Object> data) {
102+
if (unaryToken.getDataType().equals(DataType.BOOLEAN)) {
103+
return (boolean) unaryToken.getValue();
104+
}
105+
if (checkFieldDataMissing(unaryToken.getValue().toString(), data)) {
106+
return false;
107+
}
108+
final Object fieldValue = data.get(unaryToken.getValue().toString());
109+
if (!(fieldValue instanceof Boolean)) {
110+
throw new InvalidUnaryOperand();
111+
}
112+
return (boolean) fieldValue;
113+
}
114+
98115
private boolean evaluateBooleanNode(final BooleanToken booleanToken, final Map<String, Object> data) {
99116
switch (booleanToken.getOperator()) {
100117
case AND:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.github.sidhant92.boolparser.exception;
2+
3+
public class InvalidUnaryOperand extends RuntimeException {
4+
@Override
5+
public String getMessage() {
6+
return "Invalid operand data type in unary expression";
7+
}
8+
}

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import static org.junit.jupiter.api.Assertions.assertTrue;
55
import java.util.HashMap;
66
import java.util.Map;
7-
import java.util.Optional;
87
import org.junit.jupiter.api.Test;
9-
import com.github.sidhant92.boolparser.parser.BoolExpressionParser;
8+
import com.github.sidhant92.boolparser.exception.InvalidUnaryOperand;
109
import com.github.sidhant92.boolparser.parser.antlr.BoolParser;
1110
import io.vavr.control.Try;
1211

@@ -18,6 +17,33 @@ public class BooleanExpressionEvaluatorTest {
1817
private final BooleanExpressionEvaluator booleanExpressionEvaluator = new BooleanExpressionEvaluator(new BoolParser());
1918

2019

20+
@Test
21+
public void testUnaryExpressionWithField() {
22+
final Map<String, Object> data = new HashMap<>();
23+
data.put("is_allowed", true);
24+
final Try<Boolean> booleanOptional = booleanExpressionEvaluator.evaluate("not is_allowed", data);
25+
assertTrue(booleanOptional.isSuccess());
26+
assertFalse(booleanOptional.get());
27+
}
28+
29+
@Test
30+
public void testUnaryExpressionWithBoolean() {
31+
final Map<String, Object> data = new HashMap<>();
32+
data.put("is_allowed", true);
33+
final Try<Boolean> booleanOptional = booleanExpressionEvaluator.evaluate("not false", data);
34+
assertTrue(booleanOptional.isSuccess());
35+
assertTrue(booleanOptional.get());
36+
}
37+
38+
@Test
39+
public void testInvalidUnaryOperation() {
40+
final Map<String, Object> data = new HashMap<>();
41+
data.put("is_allowed", 123);
42+
final Try<Boolean> booleanOptional = booleanExpressionEvaluator.evaluate("not is_allowed", data);
43+
assertTrue(booleanOptional.isFailure());
44+
assertTrue(booleanOptional.getCause() instanceof InvalidUnaryOperand);
45+
}
46+
2147
@Test
2248
public void testSimpleTrueCorrectExpression() {
2349
final Map<String, Object> data = new HashMap<>();

0 commit comments

Comments
 (0)