55import com .github .sidhant92 .boolparser .constant .ContainerDataType ;
66import com .github .sidhant92 .boolparser .constant .DataType ;
77import com .github .sidhant92 .boolparser .constant .Operator ;
8+ import com .github .sidhant92 .boolparser .domain .ArrayNode ;
89import com .github .sidhant92 .boolparser .domain .BooleanNode ;
910import com .github .sidhant92 .boolparser .domain .InNode ;
1011import com .github .sidhant92 .boolparser .domain .NumericRangeNode ;
1112import com .github .sidhant92 .boolparser .domain .ComparisonNode ;
1213import com .github .sidhant92 .boolparser .domain .Node ;
1314import com .github .sidhant92 .boolparser .domain .UnaryNode ;
1415import com .github .sidhant92 .boolparser .exception .DataNotFoundException ;
16+ import com .github .sidhant92 .boolparser .exception .HeterogeneousArrayException ;
1517import com .github .sidhant92 .boolparser .exception .InvalidUnaryOperand ;
1618import com .github .sidhant92 .boolparser .operator .OperatorService ;
1719import com .github .sidhant92 .boolparser .parser .BoolExpressionParser ;
@@ -51,6 +53,8 @@ private boolean evaluateToken(final Node node, final Map<String, Object> data) {
5153 return evaluateNumericRangeToken ((NumericRangeNode ) node , data );
5254 case IN :
5355 return evaluateInToken ((InNode ) node , data );
56+ case ARRAY :
57+ return evaluateArrayToken ((ArrayNode ) node , data );
5458 case UNARY :
5559 return evaluateUnaryToken ((UnaryNode ) node , data );
5660 case BOOLEAN :
@@ -62,15 +66,15 @@ private boolean evaluateToken(final Node node, final Map<String, Object> data) {
6266
6367 private boolean evaluateComparisonToken (final ComparisonNode comparisonToken , final Map <String , Object > data ) {
6468 final Object fieldData = ValueUtils .getValueFromMap (comparisonToken .getField (), data ).orElseThrow (DataNotFoundException ::new );
65- return operatorService .evaluate (comparisonToken .getOperator (), ContainerDataType .primitive , comparisonToken .getDataType (), fieldData ,
69+ return operatorService .evaluate (comparisonToken .getOperator (), ContainerDataType .PRIMITIVE , comparisonToken .getDataType (), fieldData ,
6670 comparisonToken .getValue ());
6771 }
6872
6973 private boolean evaluateNumericRangeToken (final NumericRangeNode numericRangeToken , final Map <String , Object > data ) {
7074 final Object fieldData = ValueUtils .getValueFromMap (numericRangeToken .getField (), data ).orElseThrow (DataNotFoundException ::new );
71- return operatorService .evaluate (Operator .GREATER_THAN_EQUAL , ContainerDataType .primitive , numericRangeToken .getFromDataType (), fieldData ,
75+ return operatorService .evaluate (Operator .GREATER_THAN_EQUAL , ContainerDataType .PRIMITIVE , numericRangeToken .getFromDataType (), fieldData ,
7276 numericRangeToken .getFromValue ()) && operatorService .evaluate (Operator .LESS_THAN_EQUAL ,
73- ContainerDataType .primitive ,
77+ ContainerDataType .PRIMITIVE ,
7478 numericRangeToken .getToDataType (), fieldData ,
7579 numericRangeToken .getToValue ());
7680 }
@@ -81,7 +85,21 @@ private boolean evaluateInToken(final InNode inToken, final Map<String, Object>
8185 final Object [] values = inToken .getItems ()
8286 .stream ()
8387 .map (Pair ::getRight ).toArray ();
84- return operatorService .evaluate (Operator .IN , ContainerDataType .primitive , dataType , fieldData , values );
88+ return operatorService .evaluate (Operator .IN , ContainerDataType .PRIMITIVE , dataType , fieldData , values );
89+ }
90+
91+ private boolean evaluateArrayToken (final ArrayNode arrayNode , final Map <String , Object > data ) {
92+ final Object fieldData = ValueUtils .getValueFromMap (arrayNode .getField (), data ).orElseThrow (DataNotFoundException ::new );
93+ if (arrayNode .getItems ()
94+ .stream ()
95+ .map (Pair ::getLeft ).distinct ().count () > 1 ) {
96+ throw new HeterogeneousArrayException ();
97+ }
98+ final DataType dataType = arrayNode .getItems ().get (0 ).getLeft ();
99+ final Object [] values = arrayNode .getItems ()
100+ .stream ()
101+ .map (Pair ::getRight ).toArray ();
102+ return operatorService .evaluate (arrayNode .getOperator (), ContainerDataType .LIST , dataType , fieldData , values );
85103 }
86104
87105 private boolean evaluateUnaryToken (final UnaryNode unaryToken , final Map <String , Object > data ) {
0 commit comments