|
11 | 11 | import com.github.sidhant92.boolparser.domain.NumericToken; |
12 | 12 | import com.github.sidhant92.boolparser.domain.StringToken; |
13 | 13 | import com.github.sidhant92.boolparser.domain.Token; |
| 14 | +import com.github.sidhant92.boolparser.domain.UnaryToken; |
| 15 | +import com.github.sidhant92.boolparser.exception.InvalidUnaryOperand; |
14 | 16 | import com.github.sidhant92.boolparser.operator.OperatorService; |
15 | 17 | import com.github.sidhant92.boolparser.parser.BoolExpressionParser; |
16 | 18 | import io.vavr.control.Try; |
@@ -46,6 +48,8 @@ private boolean evaluateToken(final Token token, final Map<String, Object> data) |
46 | 48 | return evaluateNumericRangeToken((NumericRangeToken) token, data); |
47 | 49 | case IN: |
48 | 50 | return evaluateInToken((InToken) token, data); |
| 51 | + case UNARY: |
| 52 | + return evaluateUnaryToken((UnaryToken) token, data); |
49 | 53 | case BOOLEAN: |
50 | 54 | return evaluateBooleanNode((BooleanToken) token, data); |
51 | 55 | default: |
@@ -90,11 +94,24 @@ private boolean evaluateInToken(final InToken inToken, final Map<String, Object> |
90 | 94 | final DataType dataType = inToken.getItems().get(0).getLeft(); |
91 | 95 | final Object[] values = inToken.getItems() |
92 | 96 | .stream() |
93 | | - .map(Pair::getRight) |
94 | | - .toArray(); |
| 97 | + .map(Pair::getRight).toArray(); |
95 | 98 | return operatorService.evaluate(Operator.IN, ContainerDataType.primitive, dataType, fieldData, values); |
96 | 99 | } |
97 | 100 |
|
| 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 | + |
98 | 115 | private boolean evaluateBooleanNode(final BooleanToken booleanToken, final Map<String, Object> data) { |
99 | 116 | switch (booleanToken.getOperator()) { |
100 | 117 | case AND: |
|
0 commit comments