This is an automated email from the ASF dual-hosted git repository.
huaxingao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new f5317674e2 Support for TIME, TIMESTAMPNTZ_NANO, UUID types in
Inclusive Metrics Evaluator (#13195)
f5317674e2 is described below
commit f5317674e2f7ce8eac54fb062073d33f833750ff
Author: Manikandan R <[email protected]>
AuthorDate: Thu Dec 11 23:03:10 2025 +0530
Support for TIME, TIMESTAMPNTZ_NANO, UUID types in Inclusive Metrics
Evaluator (#13195)
* Support for Variant TIME, TIMESTAMPNTZ_NANO, TIMESTAMPTZ_NANO & UUID
types in Inclusive Metrics Evaluator
* Used conversion maps to replace switch cases
* Used suppress warnings to ignore cyclomatic complexity for now. added to
do to fix this later using correct approach
* Addressed review comments
* Parameterized all timestamp related tests
* Added test case
* Addressed review comments. 1. Simplified conversions for timestamp,
timestampnano, date based on the conversions used in literals 2. Simplified the
tests
* test simplifications and cleanup
* Rebased. Variable renaming
* Fixed checkstyle warnings
* Added more test cases
* Combined tests by parameterizing with different params
* Use nested arguments
* Fixed checkstyle issues
* Addressed review comments
---------
Co-authored-by: mani <[email protected]>
---
.../iceberg/expressions/VariantExpressionUtil.java | 44 ++-
.../TestInclusiveMetricsEvaluatorWithExtract.java | 350 +++++++++++++++++++++
2 files changed, 390 insertions(+), 4 deletions(-)
diff --git
a/api/src/main/java/org/apache/iceberg/expressions/VariantExpressionUtil.java
b/api/src/main/java/org/apache/iceberg/expressions/VariantExpressionUtil.java
index dca11d5e46..daec5216f0 100644
---
a/api/src/main/java/org/apache/iceberg/expressions/VariantExpressionUtil.java
+++
b/api/src/main/java/org/apache/iceberg/expressions/VariantExpressionUtil.java
@@ -24,13 +24,11 @@ import java.util.Map;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
import org.apache.iceberg.types.Type;
import org.apache.iceberg.types.Types;
+import org.apache.iceberg.util.DateTimeUtil;
import org.apache.iceberg.variants.PhysicalType;
import org.apache.iceberg.variants.VariantValue;
class VariantExpressionUtil {
- // TODO: Implement PhysicalType.TIME
- // TODO: Implement PhysicalType.TIMESTAMPNTZ_NANO and
PhysicalType.TIMESTAMPTZ_NANO
- // TODO: Implement PhysicalType.UUID
private static final Map<Type, PhysicalType> NO_CONVERSION_NEEDED =
ImmutableMap.<Type, PhysicalType>builder()
.put(Types.IntegerType.get(), PhysicalType.INT32)
@@ -40,6 +38,10 @@ class VariantExpressionUtil {
.put(Types.DateType.get(), PhysicalType.DATE)
.put(Types.TimestampType.withoutZone(), PhysicalType.TIMESTAMPNTZ)
.put(Types.TimestampType.withZone(), PhysicalType.TIMESTAMPTZ)
+ .put(Types.TimestampNanoType.withoutZone(),
PhysicalType.TIMESTAMPNTZ_NANOS)
+ .put(Types.TimestampNanoType.withZone(),
PhysicalType.TIMESTAMPTZ_NANOS)
+ .put(Types.TimeType.get(), PhysicalType.TIME)
+ .put(Types.UUIDType.get(), PhysicalType.UUID)
.put(Types.StringType.get(), PhysicalType.STRING)
.put(Types.BinaryType.get(), PhysicalType.BINARY)
.put(Types.UnknownType.get(), PhysicalType.NULL)
@@ -47,7 +49,7 @@ class VariantExpressionUtil {
private VariantExpressionUtil() {}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({"unchecked", "CyclomaticComplexity"})
static <T> T castTo(VariantValue value, Type type) {
if (value == null) {
return null;
@@ -111,6 +113,40 @@ class VariantExpressionUtil {
}
break;
+ case TIMESTAMP:
+ if (value.type() == PhysicalType.TIMESTAMPTZ_NANOS
+ || value.type() == PhysicalType.TIMESTAMPNTZ_NANOS) {
+ return (T)
+ (Long) DateTimeUtil.nanosToMicros(((Number)
value.asPrimitive().get()).longValue());
+ } else if (value.type() == PhysicalType.DATE) {
+ return (T)
+ (Long)
+ DateTimeUtil.microsFromTimestamp(
+ DateTimeUtil.dateFromDays(((Number)
value.asPrimitive().get()).intValue())
+ .atStartOfDay());
+ }
+ break;
+ case TIMESTAMP_NANO:
+ if (value.type() == PhysicalType.TIMESTAMPTZ || value.type() ==
PhysicalType.TIMESTAMPNTZ) {
+ return (T)
+ (Long) DateTimeUtil.microsToNanos(((Number)
value.asPrimitive().get()).longValue());
+ } else if (value.type() == PhysicalType.DATE) {
+ return (T)
+ (Long)
+ DateTimeUtil.nanosFromTimestamp(
+ DateTimeUtil.dateFromDays(((Number)
value.asPrimitive().get()).intValue())
+ .atStartOfDay());
+ }
+ break;
+ case DATE:
+ if (value.type() == PhysicalType.TIMESTAMPTZ || value.type() ==
PhysicalType.TIMESTAMPNTZ) {
+ return (T)
+ (Integer) DateTimeUtil.microsToDays(((Number)
value.asPrimitive().get()).longValue());
+ } else if (value.type() == PhysicalType.TIMESTAMPTZ_NANOS
+ || value.type() == PhysicalType.TIMESTAMPNTZ_NANOS) {
+ return (T)
+ (Integer) DateTimeUtil.nanosToDays(((Number)
value.asPrimitive().get()).longValue());
+ }
}
return null;
diff --git
a/core/src/test/java/org/apache/iceberg/expressions/TestInclusiveMetricsEvaluatorWithExtract.java
b/core/src/test/java/org/apache/iceberg/expressions/TestInclusiveMetricsEvaluatorWithExtract.java
index c629270bbb..1ee0a7ac63 100644
---
a/core/src/test/java/org/apache/iceberg/expressions/TestInclusiveMetricsEvaluatorWithExtract.java
+++
b/core/src/test/java/org/apache/iceberg/expressions/TestInclusiveMetricsEvaluatorWithExtract.java
@@ -41,8 +41,10 @@ import static
org.apache.iceberg.types.Types.NestedField.required;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import org.apache.iceberg.DataFile;
import org.apache.iceberg.Schema;
import org.apache.iceberg.TestHelpers.Row;
@@ -52,10 +54,13 @@ import
org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
import org.apache.iceberg.relocated.com.google.common.collect.Lists;
import org.apache.iceberg.types.Types;
import org.apache.iceberg.types.Types.IntegerType;
+import org.apache.iceberg.variants.PhysicalType;
import org.apache.iceberg.variants.VariantTestUtil;
+import org.apache.iceberg.variants.VariantValue;
import org.apache.iceberg.variants.Variants;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.FieldSource;
public class TestInclusiveMetricsEvaluatorWithExtract {
@@ -683,4 +688,349 @@ public class TestInclusiveMetricsEvaluatorWithExtract {
.as("Should read: id above upper bound (85 > 79, 86 > 79)")
.isTrue();
}
+
+ private static final List<Arguments> DATEANDTIMESTAMPTYPESEQPARAMETERS =
+ List.of(
+ Arguments.of(
+ Types.TimestampNanoType.withoutZone().toString(),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456789",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-21T00:00:01.123456789",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456789",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ false),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-03-21T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-03-31T00:00:00.000000000",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ false)),
+ Arguments.of(
+ Types.DateType.get().toString(),
+ Arguments.of(
+ "1970-01-11",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-31",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-21",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-31",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-04-01",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-11",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-31",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-21",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-31",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-04-01",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ false)),
+ Arguments.of(
+ Types.TimestampType.withoutZone().toString(),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-21T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ true),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"),
+ false),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ false),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-03-21T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-03-31T00:00:00.000000",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ true),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"),
+ false)));
+
+ @ParameterizedTest
+ @FieldSource("DATEANDTIMESTAMPTYPESEQPARAMETERS")
+ public void testDateAndTimestampTypesEq(String variantType, Arguments args) {
+ // lower bounds
+ Map<Integer, ByteBuffer> lowerBounds =
+ ImmutableMap.of(
+ 2,
+ VariantTestUtil.variantBuffer(
+ Map.of("$['event_timestamp']", (VariantValue) args.get()[1])));
+ // upper bounds
+ Map<Integer, ByteBuffer> upperBounds =
+ ImmutableMap.of(
+ 2,
+ VariantTestUtil.variantBuffer(
+ Map.of("$['event_timestamp']", (VariantValue) args.get()[2])));
+
+ DataFile file =
+ new TestDataFile("file.parquet", Row.of(), 50, null, null, null,
lowerBounds, upperBounds);
+ Expression expr = equal(extract("variant", "$.event_timestamp",
variantType), args.get()[0]);
+ assertThat(shouldRead(expr, file)).isEqualTo(args.get()[3]);
+ }
+
+ private static final List<Arguments> DATEANDTIMESTAMPTYPESNOTEQPARAMETERS =
+ List.of(
+ Arguments.of(
+ Types.TimestampNanoType.withoutZone().toString(),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-01T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-03-01T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456789",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31"))),
+ Arguments.of(
+ Types.DateType.get().toString(),
+ Arguments.of(
+ "1970-01-31",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-01",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-31",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-04-01",
+ Variants.ofIsoTimestampntz("1970-01-31T00:00:01.123456"),
+ Variants.ofIsoTimestampntz("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-01-11",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-01",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-01-31",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-31",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-04-01",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"))),
+ Arguments.of(
+ Types.TimestampType.withoutZone().toString(),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-03-01T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456",
+ Variants.ofIsoDate("1970-01-31"),
+ Variants.ofIsoDate("1970-03-31")),
+ Arguments.of(
+ "1970-01-11T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-01-31T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-01T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-03-31T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456")),
+ Arguments.of(
+ "1970-04-01T00:00:01.123456",
+
Variants.ofIsoTimestampntzNanos("1970-01-31T00:00:01.123456"),
+
Variants.ofIsoTimestampntzNanos("1970-03-31T00:00:01.123456"))));
+
+ @ParameterizedTest
+ @FieldSource("DATEANDTIMESTAMPTYPESNOTEQPARAMETERS")
+ public void testDateAndTimestampTypesNotEq(String variantType, Arguments
args) {
+ // lower bounds
+ Map<Integer, ByteBuffer> lowerBounds =
+ ImmutableMap.of(
+ 2,
+ VariantTestUtil.variantBuffer(
+ Map.of("$['event_timestamp']", (VariantValue) args.get()[1])));
+ // upper bounds
+ Map<Integer, ByteBuffer> upperBounds =
+ ImmutableMap.of(
+ 2,
+ VariantTestUtil.variantBuffer(
+ Map.of("$['event_timestamp']", (VariantValue) args.get()[2])));
+
+ DataFile file =
+ new TestDataFile("file.parquet", Row.of(), 50, null, null, null,
lowerBounds, upperBounds);
+ Expression expr = notEqual(extract("variant", "$.event_timestamp",
variantType), args.get()[0]);
+ assertThat(shouldRead(expr, file)).as("Should read: many possible
timestamps" + expr).isTrue();
+ }
+
+ @Test
+ public void testUUIDEq() {
+ UUID uuid = UUID.randomUUID();
+ // lower bounds
+ Map<Integer, ByteBuffer> lowerBounds =
+ ImmutableMap.of(
+ 2, VariantTestUtil.variantBuffer(Map.of("$['event_uuid']",
Variants.ofUUID(uuid))));
+ // upper bounds
+ Map<Integer, ByteBuffer> upperBounds =
+ ImmutableMap.of(
+ 2, VariantTestUtil.variantBuffer(Map.of("$['event_uuid']",
Variants.ofUUID(uuid))));
+ DataFile file =
+ new TestDataFile("file.parquet", Row.of(), 50, null, null, null,
lowerBounds, upperBounds);
+ Expression expr = equal(extract("variant", "$.event_uuid",
PhysicalType.UUID.name()), uuid);
+ assertThat(shouldRead(expr, file)).as("Should read: many possible UUIDs" +
expr).isTrue();
+ }
}