LuciferYang commented on code in PR #18413:
URL: https://github.com/apache/iceberg/pull/18413#discussion_r4237058245
##########
api/src/test/java/org/apache/iceberg/expressions/TestExpressionUtil.java:
##########
@@ -188,6 +188,79 @@ public void testSanitizeNotIn() {
.isEqualTo("test NOT IN ((2-digit-int), (3-digit-int))");
}
+ @Test
+ public void testSanitizeBoundIn() {
+ Expression in = Binder.bind(STRUCT, Expressions.in("id", 1L, 2L), true);
+ assertEquals(
+ Expressions.in("id", "(1-digit-int)", "(1-digit-int)"),
ExpressionUtil.sanitize(in));
+ assertThat(ExpressionUtil.toSanitizedString(in))
+ .isEqualTo("id IN ((1-digit-int), (1-digit-int))");
+
+ Expression notIn = Binder.bind(STRUCT, Expressions.notIn("id", 1L, 2L),
true);
+ assertEquals(
+ Expressions.notIn("id", "(1-digit-int)", "(1-digit-int)"),
ExpressionUtil.sanitize(notIn));
+ assertThat(ExpressionUtil.toSanitizedString(notIn))
+ .isEqualTo("id NOT IN ((1-digit-int), (1-digit-int))");
+ }
+
+ @Test
+ public void testSanitizeInWithStructUsesColumnType() {
+ // timestamp values passed as micros are only recognized as timestamps
after binding
+ long ninetyMinutesAgo =
+
DateTimeUtil.microsFromTimestamptz(OffsetDateTime.now().minusMinutes(90));
+ long ninetyOneMinutesAgo =
+
DateTimeUtil.microsFromTimestamptz(OffsetDateTime.now().minusMinutes(91));
+ Expression in = Expressions.in("ts", ninetyMinutesAgo,
ninetyOneMinutesAgo);
+
+ assertEquals(
+ Expressions.in("ts", "(timestamp-1-hours-ago)",
"(timestamp-1-hours-ago)"),
+ ExpressionUtil.sanitize(STRUCT, in, true));
+ assertThat(ExpressionUtil.toSanitizedString(STRUCT, in, true))
+ .isEqualTo("ts IN ((timestamp-1-hours-ago), (timestamp-1-hours-ago))");
+
+ Expression filter =
+ Expressions.and(
+ Expressions.greaterThan("ts", ninetyMinutesAgo),
Expressions.in("id", 1L, 2L));
+ assertThat(ExpressionUtil.toSanitizedString(STRUCT, filter, true))
+ .isEqualTo("(ts > (timestamp-1-hours-ago) AND id IN ((1-digit-int),
(1-digit-int)))");
+ }
+
+ @Test
+ public void testSanitizeBoundTimestampNanoIn() {
+ String ninetyMinutesAgo =
+ OffsetDateTime.now()
+ .minusMinutes(90)
+ .atZoneSameInstant(ZoneOffset.UTC)
+ .toLocalDateTime()
+ .toString();
+ String ninetyOneMinutesAgo =
+ OffsetDateTime.now()
+ .minusMinutes(91)
+ .atZoneSameInstant(ZoneOffset.UTC)
+ .toLocalDateTime()
+ .toString();
+ Expression in =
+ Binder.bind(STRUCT, Expressions.in("tsns", ninetyMinutesAgo,
ninetyOneMinutesAgo), true);
+
+ assertEquals(
+ Expressions.in("tsns", "(timestamp-1-hours-ago)",
"(timestamp-1-hours-ago)"),
+ ExpressionUtil.sanitize(in));
+ assertThat(ExpressionUtil.toSanitizedString(in))
+ .isEqualTo("tsns IN ((timestamp-1-hours-ago),
(timestamp-1-hours-ago))");
+ }
+
+ @Test
+ public void testSanitizeBoundDateIn() {
+ String lastWeek = LocalDate.now(ZoneOffset.UTC).minusWeeks(1).toString();
+ String twoWeeksAgo =
LocalDate.now(ZoneOffset.UTC).minusWeeks(2).toString();
Review Comment:
Thanks, applied in b59dbc8.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]