26
26
import org .apache .iceberg .transforms .Transform ;
27
27
import org .apache .iceberg .transforms .Transforms ;
28
28
import org .apache .iceberg .types .Types ;
29
+ import org .apache .iceberg .util .NaNUtil ;
29
30
30
31
/**
31
32
* Factory methods for creating {@link Expression expressions}.
@@ -140,50 +141,62 @@ public static <T> UnboundPredicate<T> notNaN(UnboundTerm<T> expr) {
140
141
}
141
142
142
143
public static <T > UnboundPredicate <T > lessThan (String name , T value ) {
144
+ validateInput ("lessThan" , value );
143
145
return new UnboundPredicate <>(Expression .Operation .LT , ref (name ), value );
144
146
}
145
147
146
148
public static <T > UnboundPredicate <T > lessThan (UnboundTerm <T > expr , T value ) {
149
+ validateInput ("lessThan" , value );
147
150
return new UnboundPredicate <>(Expression .Operation .LT , expr , value );
148
151
}
149
152
150
153
public static <T > UnboundPredicate <T > lessThanOrEqual (String name , T value ) {
154
+ validateInput ("lessThanOrEqual" , value );
151
155
return new UnboundPredicate <>(Expression .Operation .LT_EQ , ref (name ), value );
152
156
}
153
157
154
158
public static <T > UnboundPredicate <T > lessThanOrEqual (UnboundTerm <T > expr , T value ) {
159
+ validateInput ("lessThanOrEqual" , value );
155
160
return new UnboundPredicate <>(Expression .Operation .LT_EQ , expr , value );
156
161
}
157
162
158
163
public static <T > UnboundPredicate <T > greaterThan (String name , T value ) {
164
+ validateInput ("greaterThan" , value );
159
165
return new UnboundPredicate <>(Expression .Operation .GT , ref (name ), value );
160
166
}
161
167
162
168
public static <T > UnboundPredicate <T > greaterThan (UnboundTerm <T > expr , T value ) {
169
+ validateInput ("greaterThan" , value );
163
170
return new UnboundPredicate <>(Expression .Operation .GT , expr , value );
164
171
}
165
172
166
173
public static <T > UnboundPredicate <T > greaterThanOrEqual (String name , T value ) {
174
+ validateInput ("greaterThanOrEqual" , value );
167
175
return new UnboundPredicate <>(Expression .Operation .GT_EQ , ref (name ), value );
168
176
}
169
177
170
178
public static <T > UnboundPredicate <T > greaterThanOrEqual (UnboundTerm <T > expr , T value ) {
179
+ validateInput ("greaterThanOrEqual" , value );
171
180
return new UnboundPredicate <>(Expression .Operation .GT_EQ , expr , value );
172
181
}
173
182
174
183
public static <T > UnboundPredicate <T > equal (String name , T value ) {
184
+ validateInput ("equal" , value );
175
185
return new UnboundPredicate <>(Expression .Operation .EQ , ref (name ), value );
176
186
}
177
187
178
188
public static <T > UnboundPredicate <T > equal (UnboundTerm <T > expr , T value ) {
189
+ validateInput ("equal" , value );
179
190
return new UnboundPredicate <>(Expression .Operation .EQ , expr , value );
180
191
}
181
192
182
193
public static <T > UnboundPredicate <T > notEqual (String name , T value ) {
194
+ validateInput ("notEqual" , value );
183
195
return new UnboundPredicate <>(Expression .Operation .NOT_EQ , ref (name ), value );
184
196
}
185
197
186
198
public static <T > UnboundPredicate <T > notEqual (UnboundTerm <T > expr , T value ) {
199
+ validateInput ("notEqual" , value );
187
200
return new UnboundPredicate <>(Expression .Operation .NOT_EQ , expr , value );
188
201
}
189
202
@@ -232,6 +245,7 @@ public static <T> UnboundPredicate<T> notIn(UnboundTerm<T> expr, Iterable<T> val
232
245
}
233
246
234
247
public static <T > UnboundPredicate <T > predicate (Operation op , String name , T value ) {
248
+ validateInput (op .toString (), value );
235
249
return predicate (op , name , Literals .from (value ));
236
250
}
237
251
@@ -243,6 +257,7 @@ public static <T> UnboundPredicate<T> predicate(Operation op, String name, Liter
243
257
}
244
258
245
259
public static <T > UnboundPredicate <T > predicate (Operation op , String name , Iterable <T > values ) {
260
+ validateInput (op .toString (), values );
246
261
return predicate (op , ref (name ), values );
247
262
}
248
263
@@ -254,9 +269,19 @@ public static <T> UnboundPredicate<T> predicate(Operation op, String name) {
254
269
}
255
270
256
271
private static <T > UnboundPredicate <T > predicate (Operation op , UnboundTerm <T > expr , Iterable <T > values ) {
272
+ validateInput (op .toString (), values );
257
273
return new UnboundPredicate <>(op , expr , values );
258
274
}
259
275
276
+ private static <T > void validateInput (String op , T value ) {
277
+ Preconditions .checkArgument (!NaNUtil .isNaN (value ), String .format ("Cannot create %s predicate with NaN" , op ));
278
+ }
279
+
280
+ private static <T > void validateInput (String op , Iterable <T > values ) {
281
+ Preconditions .checkArgument (Lists .newArrayList (values ).stream ().noneMatch (NaNUtil ::isNaN ),
282
+ String .format ("Cannot create %s predicate with NaN" , op ));
283
+ }
284
+
260
285
public static True alwaysTrue () {
261
286
return True .INSTANCE ;
262
287
}
0 commit comments