66import java .sql .Timestamp ;
77import java .util .List ;
88import java .util .Objects ;
9+ import java .util .Optional ;
910
1011import org .apache .commons .lang3 .tuple .Pair ;
1112
1213// Only for partition values
1314public class EvalHelper {
1415
15- static Pair < ColumnRange , String > validateAndGetRange (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
16+ static LeafEvaluationResult validateAndGetRange (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
1617 var leftChild = (ColumnOp ) children .get (0 );
1718 var columnRange = leftChild .evalExpectColumnRange (ctx );
1819
1920 var rightChild = children .get (1 );
2021 var rightType = rightChild .evalExpectValueAndType (ctx ).getRight ();
2122 var rightVal = rightChild .evalExpectValueAndType (ctx ).getLeft ();
2223
23- return Pair .of (columnRange , rightVal );
24+ return LeafEvaluationResult . createFromRange ( Pair .of (columnRange , rightVal ) );
2425 }
2526
26- static Pair < Pair < ColumnRange , String >, Pair < Pair < DataType , String >, Pair < DataType , String >>> validateAndGetTypeAndValue (
27+ static LeafEvaluationResult validateAndGetTypeAndValue (
2728 List <LeafOp > children , EvalContext ctx ) throws PredicateException {
2829 var leftChild = children .get (0 );
2930 var leftType = leftChild .evalExpectValueAndType (ctx ).getRight ();
@@ -39,76 +40,84 @@ static Pair<Pair<ColumnRange, String>,Pair<Pair<DataType, String>, Pair<DataType
3940 }
4041
4142 if (leftVal == null && leftChild instanceof ColumnOp ){
42- return Pair . of ( validateAndGetRange (children , ctx ), null );
43+ return validateAndGetRange (children , ctx );
4344 }
4445
4546 // We throw an exception for nulls, which will skip filtering.
4647 if (leftVal == null || rightVal == null ) {
4748 throw new NullTypeException (leftChild , rightChild );
4849 }
49- return Pair . of ( null , Pair .of (Pair .of (leftType , leftVal ), Pair .of (rightType , rightVal )));
50+ return LeafEvaluationResult . createFromPartitionColumn ( Pair .of (Pair .of (leftType , leftVal ), Pair .of (rightType , rightVal )));
5051 }
5152
5253 // Implements "equal" between two leaf operations.
5354 static Boolean equal (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
5455
55- var columnRangeOrTypeAndValue = validateAndGetTypeAndValue (children , ctx );
56- if ( columnRangeOrTypeAndValue . getLeft () != null ) {
57- var columnRange = columnRangeOrTypeAndValue . getLeft () .getLeft ();
58- var value = columnRangeOrTypeAndValue . getLeft () .getRight ();
56+ var leafEvaluationResult = validateAndGetTypeAndValue (children , ctx );
57+ var rangeEvaluation = leafEvaluationResult . rangeEvaluationResult . map ( range -> {
58+ var columnRange = range .getLeft ();
59+ var value = range .getRight ();
5960 return columnRange .contains (value );
61+ });
62+ if (rangeEvaluation .isPresent ())
63+ return rangeEvaluation .get ();
64+ else if (leafEvaluationResult .partitionEvaluationResult .isPresent ()){
65+ var typesAndValues = leafEvaluationResult .partitionEvaluationResult .get ();
66+ var leftType = typesAndValues .getLeft ().getLeft ();
67+ var leftVal = typesAndValues .getLeft ().getRight ();
68+ var rightVal = typesAndValues .getRight ().getRight ();
69+
70+ if (BooleanType .BOOLEAN .equals (leftType )) {
71+ return Boolean .valueOf (leftVal ) == Boolean .valueOf (rightVal );
72+ } else if (IntegerType .INTEGER .equals (leftType )) {
73+ return Integer .parseInt (leftVal ) == Integer .parseInt (rightVal );
74+ } else if (LongType .LONG .equals (leftType )) {
75+ return Long .parseLong (leftVal ) == Long .parseLong (rightVal );
76+ } else if (StringType .STRING .equals (leftType )) {
77+ return leftVal .equals (rightVal );
78+ } else if (DateType .DATE .equals (leftType )) {
79+ return Date .valueOf (leftVal ).equals (Date .valueOf (rightVal ));
80+ }
81+ else
82+ throw new TypeNotSupportedException (leftType );
6083 }
61-
62-
63- var typesAndValues = columnRangeOrTypeAndValue .getRight ();
64- var leftType = typesAndValues .getLeft ().getLeft ();
65- var leftVal = typesAndValues .getLeft ().getRight ();
66- var rightVal = typesAndValues .getRight ().getRight ();
67-
68- if (BooleanType .BOOLEAN .equals (leftType )) {
69- return Boolean .valueOf (leftVal ) == Boolean .valueOf (rightVal );
70- } else if (IntegerType .INTEGER .equals (leftType )) {
71- return Integer .parseInt (leftVal ) == Integer .parseInt (rightVal );
72- } else if (LongType .LONG .equals (leftType )) {
73- return Long .parseLong (leftVal ) == Long .parseLong (rightVal );
74- } else if (StringType .STRING .equals (leftType )) {
75- return leftVal .equals (rightVal );
76- } else if (DateType .DATE .equals (leftType )) {
77- return Date .valueOf (leftVal ).equals (Date .valueOf (rightVal ));
78- }
79- else
80- throw new TypeNotSupportedException (leftType );
84+ else
85+ throw new PredicateException ();
8186 }
8287
83- // TODO: supported expressions; ie. check if column + constant
84- // TODO: handle column comparisons with literals
8588 static Boolean lessThan (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
8689
87-
88- var columnRangeOrTypeAndValue = validateAndGetTypeAndValue (children , ctx );
89- if (columnRangeOrTypeAndValue .getLeft () != null ) {
90- var columnRange = columnRangeOrTypeAndValue .getLeft ().getLeft ();
91- var value = columnRangeOrTypeAndValue .getLeft ().getRight ();
92- return columnRange .contains (value );
93- }
94-
95- var typesAndValues = columnRangeOrTypeAndValue .getRight ();
96- var leftType = typesAndValues .getLeft ().getLeft ();
97- var leftVal = typesAndValues .getLeft ().getRight ();
98- var rightVal = typesAndValues .getRight ().getRight ();
99-
100- if (IntegerType .INTEGER .equals (leftType )) {
101- return Integer .parseInt (leftVal ) < Integer .parseInt (rightVal );
102- } else if (LongType .LONG .equals (leftType )) {
103- return Long .parseLong (leftVal ) < Long .parseLong (rightVal );
104- } else if (StringType .STRING .equals (leftType )) {
105- return leftVal .compareTo (rightVal ) < 0 ;
106- } else if (DateType .DATE .equals (leftType )) {
107- return Date .valueOf (leftVal ).before (Date .valueOf (rightVal ));
90+ var leafEvaluationResult = validateAndGetTypeAndValue (children , ctx );
91+ var rangeEvaluation = leafEvaluationResult .rangeEvaluationResult .map (range -> {
92+ var columnRange = range .getLeft ();
93+ var value = range .getRight ();
94+ return columnRange .canBeLess (value );
95+ });
96+
97+ if (rangeEvaluation .isPresent ())
98+ return rangeEvaluation .get ();
99+ else if (leafEvaluationResult .partitionEvaluationResult .isPresent ()){
100+ var typesAndValues = leafEvaluationResult .partitionEvaluationResult .get ();
101+ var leftType = typesAndValues .getLeft ().getLeft ();
102+ var leftVal = typesAndValues .getLeft ().getRight ();
103+ var rightVal = typesAndValues .getRight ().getRight ();
104+
105+ if (IntegerType .INTEGER .equals (leftType )) {
106+ return Integer .parseInt (leftVal ) < Integer .parseInt (rightVal );
107+ } else if (LongType .LONG .equals (leftType )) {
108+ return Long .parseLong (leftVal ) < Long .parseLong (rightVal );
109+ } else if (StringType .STRING .equals (leftType )) {
110+ return leftVal .compareTo (rightVal ) < 0 ;
111+ } else if (DateType .DATE .equals (leftType )) {
112+ return Date .valueOf (leftVal ).before (Date .valueOf (rightVal ));
113+ }
114+ else
115+ throw new TypeNotSupportedException (leftType );
108116 }
109117 else
110- throw new TypeNotSupportedException ( leftType );
118+ throw new PredicateException ( );
111119 }
120+
112121 // Validates that the specified value is in the correct format.
113122 // Throws an exception otherwise.
114123 public static void validateValue (String value , DataType valueType ) {
0 commit comments