2
2
3
3
import io .whitefox .core .ColumnRange ;
4
4
import io .whitefox .core .types .*;
5
+ import org .apache .commons .lang3 .tuple .Pair ;
6
+
5
7
import java .sql .Date ;
6
8
import java .sql .Timestamp ;
7
9
import java .util .List ;
@@ -13,100 +15,84 @@ public class EvalHelper {
13
15
private static LeafEvaluationResult validateAndGetRange (
14
16
ColumnOp columnChild , LiteralOp literalChild , EvalContext ctx ) throws PredicateException {
15
17
var columnRange = columnChild .evalExpectColumnRange (ctx );
16
- var rightVal = literalChild .evalExpectValueAndType (ctx ).getLeft ();
18
+ var rightVal = literalChild .evalExpectValueAndType (ctx ).getSingleValue ();
17
19
18
20
return LeafEvaluationResult .createFromRange (new RangeEvaluationResult (columnRange , rightVal ));
19
21
}
20
22
21
23
private static LeafEvaluationResult validateAndGetTypeAndValue (
22
- List <LeafOp > children , EvalContext ctx ) throws PredicateException {
23
- var leftChild = children .get (0 );
24
- var leftType = leftChild .evalExpectValueAndType (ctx ).getRight ();
25
- var leftVal = leftChild .evalExpectValueAndType (ctx ).getLeft ();
26
-
27
- var rightChild = children .get (1 );
28
- var rightType = rightChild .evalExpectValueAndType (ctx ).getRight ();
29
- var rightVal = rightChild .evalExpectValueAndType (ctx ).getLeft ();
24
+ ColumnOp columnOp , LiteralOp literalOp , EvalContext ctx ) throws PredicateException {
25
+ var columnType = columnOp .evalExpectValueAndType (ctx ).getValueType ();
26
+ var columnValue = columnOp .evalExpectValueAndType (ctx ).getSingleValue ();
27
+
28
+ var literalType = literalOp .evalExpectValueAndType (ctx ).getValueType ();
29
+ var literalValue = literalOp .evalExpectValueAndType (ctx ).getSingleValue ();
30
30
// If the types don't match, it implies a malformed predicate tree.
31
31
// We simply throw an exception, which will cause filtering to be skipped.
32
- if (!Objects .equals (leftType , rightType )) {
33
- throw new TypeMismatchException (leftType , rightType );
34
- }
35
-
36
- if (leftVal == null && leftChild instanceof ColumnOp ) {
37
- return validateAndGetRange ((ColumnOp ) leftChild , (LiteralOp ) rightChild , ctx );
32
+ if (!Objects .equals (columnType , literalType )) {
33
+ throw new TypeMismatchException (columnType , literalType );
38
34
}
39
35
40
- // maybe better to enforce the Equal/LessThan... to explicitly require a column child and
41
- // literal child
42
- if (rightVal == null && rightChild instanceof ColumnOp ) {
43
- return validateAndGetRange ((ColumnOp ) rightChild , (LiteralOp ) leftChild , ctx );
36
+ if (columnValue == null ) {
37
+ return validateAndGetRange (columnOp , literalOp , ctx );
44
38
}
45
39
46
40
// We throw an exception for nulls, which will skip filtering.
47
- if (leftVal == null || rightVal == null ) {
48
- throw new NullTypeException (leftChild , rightChild );
41
+ if (literalValue == null ) {
42
+ throw new NullTypeException (columnOp , literalOp );
49
43
}
44
+
50
45
return LeafEvaluationResult .createFromPartitionColumn (new PartitionEvaluationResult (
51
- new ColumnRange (leftVal , leftType ), new ColumnRange (rightVal , rightType )));
46
+ new ColumnRange (columnValue , columnType ), literalValue ));
47
+ }
48
+
49
+ private static Pair <ColumnOp , LiteralOp > arrangeChildren (List <LeafOp > children ) {
50
+ if (children .get (0 ) instanceof ColumnOp )
51
+ return Pair .of ((ColumnOp ) children .get (0 ), (LiteralOp ) children .get (1 ));
52
+ else
53
+ return Pair .of ((ColumnOp ) children .get (1 ), (LiteralOp ) children .get (0 ));
52
54
}
53
55
54
56
// Implements "equal" between two leaf operations.
55
57
static Boolean equal (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
58
+ var columnOp = arrangeChildren (children ).getLeft ();
59
+ var literalOp = arrangeChildren (children ).getRight ();
60
+
61
+ var leafEvaluationResult = validateAndGetTypeAndValue (columnOp , literalOp , ctx );
56
62
57
- var leafEvaluationResult = validateAndGetTypeAndValue ( children , ctx );
58
- var rangeEvaluation = leafEvaluationResult .rangeEvaluationResult .map ( range -> {
59
- var columnRange = range .getColumnRange ();
60
- var value = range .getValue ();
63
+ if ( leafEvaluationResult . rangeEvaluationResult . isPresent ()){
64
+ var evaluationResult = leafEvaluationResult .rangeEvaluationResult .get ();
65
+ var columnRange = evaluationResult .getColumnRange ();
66
+ var value = evaluationResult .getValue ();
61
67
return columnRange .contains (value );
62
- });
63
- if ( rangeEvaluation . isPresent ()) return rangeEvaluation . get ();
68
+ }
69
+
64
70
else if (leafEvaluationResult .partitionEvaluationResult .isPresent ()) {
65
- var typesAndValues = leafEvaluationResult .partitionEvaluationResult .get ();
66
- var leftType = typesAndValues .getPartitionValue ().getValueType ();
67
- var leftVal = typesAndValues .getPartitionValue ().getOnlyValue ();
68
- var rightVal = typesAndValues .getLiteralValue ().getOnlyValue ();
69
-
70
- // we fear no exception here since it is validated before
71
- if (BooleanType .BOOLEAN .equals (leftType )) {
72
- return Boolean .valueOf (leftVal ) == Boolean .valueOf (rightVal );
73
- } else if (IntegerType .INTEGER .equals (leftType )) {
74
- return Integer .parseInt (leftVal ) == Integer .parseInt (rightVal );
75
- } else if (LongType .LONG .equals (leftType )) {
76
- return Long .parseLong (leftVal ) == Long .parseLong (rightVal );
77
- } else if (StringType .STRING .equals (leftType )) {
78
- return leftVal .equals (rightVal );
79
- } else if (DateType .DATE .equals (leftType )) {
80
- return Date .valueOf (leftVal ).equals (Date .valueOf (rightVal ));
81
- } else throw new TypeNotSupportedException (leftType );
71
+ var evaluationResult = leafEvaluationResult .partitionEvaluationResult .get ();
72
+ var literalValue = evaluationResult .getLiteralValue ();
73
+
74
+ return evaluationResult .getPartitionValue ().contains (literalValue );
82
75
} else throw new PredicateColumnEvaluationException (ctx );
76
+
83
77
}
84
78
85
79
static Boolean lessThan (List <LeafOp > children , EvalContext ctx ) throws PredicateException {
80
+ var columnOp = arrangeChildren (children ).getLeft ();
81
+ var literalOp = arrangeChildren (children ).getRight ();
86
82
87
- var leafEvaluationResult = validateAndGetTypeAndValue (children , ctx );
88
- var rangeEvaluation = leafEvaluationResult .rangeEvaluationResult .map (range -> {
89
- var columnRange = range .getColumnRange ();
90
- var value = range .getValue ();
91
- return columnRange .canBeLess (value );
92
- });
83
+ var leafEvaluationResult = validateAndGetTypeAndValue (columnOp , literalOp , ctx );
93
84
94
- if (rangeEvaluation .isPresent ()) return rangeEvaluation .get ();
85
+ if (leafEvaluationResult .rangeEvaluationResult .isPresent ()){
86
+ var evaluationResult = leafEvaluationResult .rangeEvaluationResult .get ();
87
+ var columnRange = evaluationResult .getColumnRange ();
88
+ var value = evaluationResult .getValue ();
89
+ return columnRange .canBeLess (value );
90
+ }
95
91
else if (leafEvaluationResult .partitionEvaluationResult .isPresent ()) {
96
- var typesAndValues = leafEvaluationResult .partitionEvaluationResult .get ();
97
- var leftType = typesAndValues .getPartitionValue ().getValueType ();
98
- var leftVal = typesAndValues .getPartitionValue ().getOnlyValue ();
99
- var rightVal = typesAndValues .getLiteralValue ().getOnlyValue ();
100
-
101
- if (IntegerType .INTEGER .equals (leftType )) {
102
- return Integer .parseInt (leftVal ) < Integer .parseInt (rightVal );
103
- } else if (LongType .LONG .equals (leftType )) {
104
- return Long .parseLong (leftVal ) < Long .parseLong (rightVal );
105
- } else if (StringType .STRING .equals (leftType )) {
106
- return leftVal .compareTo (rightVal ) < 0 ;
107
- } else if (DateType .DATE .equals (leftType )) {
108
- return Date .valueOf (leftVal ).before (Date .valueOf (rightVal ));
109
- } else throw new TypeNotSupportedException (leftType );
92
+ var evaluationResult = leafEvaluationResult .partitionEvaluationResult .get ();
93
+ var literalValue = evaluationResult .getLiteralValue ();
94
+
95
+ return evaluationResult .getPartitionValue ().canBeLess (literalValue );
110
96
} else throw new PredicateColumnEvaluationException (ctx );
111
97
}
112
98
0 commit comments