This is an automated email from the ASF dual-hosted git repository.
gangwu pushed a commit to branch parquet-1.16.x
in repository https://gitbox.apache.org/repos/asf/parquet-java.git
The following commit(s) were added to refs/heads/parquet-1.16.x by this push:
new 0e279eff8 Add comparator for `UnknownLogicalType` (#3292) (#3295)
0e279eff8 is described below
commit 0e279eff80cba89ef7a67c4e8da412e140480335
Author: Gang Wu <[email protected]>
AuthorDate: Sat Aug 30 14:19:33 2025 +0800
Add comparator for `UnknownLogicalType` (#3292) (#3295)
This was missing, which caused exceptions. This PR adds them
including a test.
It takes the comparator of the underlying physical type, but it
should always compare two null values:
https://github.com/apache/parquet-format/blob/471d33a3c9d46e05b8a189437a9364f959f93f09/LogicalTypes.md?plain=1#L887-L892
Co-authored-by: Fokko Driesprong <[email protected]>
---
.../org/apache/parquet/schema/PrimitiveType.java | 24 ++++++++++++++++++++++
.../parquet/schema/TestPrimitiveComparator.java | 23 +++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git
a/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java
b/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java
index 6beff4da9..944cfb58e 100644
--- a/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java
+++ b/parquet-column/src/main/java/org/apache/parquet/schema/PrimitiveType.java
@@ -119,6 +119,12 @@ public final class PrimitiveType extends Type {
LogicalTypeAnnotation.TimestampLogicalTypeAnnotation
timestampLogicalType) {
return of(PrimitiveComparator.SIGNED_INT64_COMPARATOR);
}
+
+ @Override
+ public Optional<PrimitiveComparator> visit(
+ LogicalTypeAnnotation.UnknownLogicalTypeAnnotation
unknownLogicalTypeAnnotation) {
+ return of(PrimitiveComparator.SIGNED_INT64_COMPARATOR);
+ }
})
.orElseThrow(() -> new ShouldNeverHappenException(
"No comparator logic implemented for INT64 logical type: " +
logicalType));
@@ -183,6 +189,12 @@ public final class PrimitiveType extends Type {
}
return empty();
}
+
+ @Override
+ public Optional<PrimitiveComparator> visit(
+ LogicalTypeAnnotation.UnknownLogicalTypeAnnotation
unknownLogicalTypeAnnotation) {
+ return of(PrimitiveComparator.SIGNED_INT32_COMPARATOR);
+ }
})
.orElseThrow(() -> new ShouldNeverHappenException(
"No comparator logic implemented for INT32 logical type: " +
logicalType));
@@ -283,6 +295,12 @@ public final class PrimitiveType extends Type {
LogicalTypeAnnotation.GeographyLogicalTypeAnnotation
geographyLogicalType) {
return
of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR);
}
+
+ @Override
+ public Optional<PrimitiveComparator> visit(
+ LogicalTypeAnnotation.UnknownLogicalTypeAnnotation
unknownLogicalTypeAnnotation) {
+ return
of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR);
+ }
})
.orElseThrow(() -> new ShouldNeverHappenException(
"No comparator logic implemented for BINARY logical type: " +
logicalType));
@@ -417,6 +435,12 @@ public final class PrimitiveType extends Type {
LogicalTypeAnnotation.Float16LogicalTypeAnnotation
float16LogicalType) {
return of(PrimitiveComparator.BINARY_AS_FLOAT16_COMPARATOR);
}
+
+ @Override
+ public Optional<PrimitiveComparator> visit(
+ LogicalTypeAnnotation.UnknownLogicalTypeAnnotation
unknownLogicalTypeAnnotation) {
+ return
of(PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR);
+ }
})
.orElseThrow(() -> new ShouldNeverHappenException(
"No comparator logic implemented for FIXED_LEN_BYTE_ARRAY
logical type: "
diff --git
a/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java
b/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java
index d3d1b15bc..8fb53aca0 100644
---
a/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java
+++
b/parquet-column/src/test/java/org/apache/parquet/schema/TestPrimitiveComparator.java
@@ -100,6 +100,29 @@ public class TestPrimitiveComparator {
checkThrowingUnsupportedException(comparator, Integer.TYPE);
}
+ @Test
+ public void testUnknownLogicalTypeComparator() {
+ PrimitiveType.PrimitiveTypeName[] types = new
PrimitiveType.PrimitiveTypeName[] {
+ PrimitiveType.PrimitiveTypeName.BOOLEAN,
+ PrimitiveType.PrimitiveTypeName.BINARY,
+ PrimitiveType.PrimitiveTypeName.INT32,
+ PrimitiveType.PrimitiveTypeName.INT64,
+ PrimitiveType.PrimitiveTypeName.FLOAT,
+ PrimitiveType.PrimitiveTypeName.DOUBLE,
+ PrimitiveType.PrimitiveTypeName.INT96,
+ PrimitiveType.PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY
+ };
+
+ for (PrimitiveType.PrimitiveTypeName type : types) {
+ assertEquals(
+ new PrimitiveType(Type.Repetition.REQUIRED, type, "vo")
+ .withLogicalTypeAnnotation(LogicalTypeAnnotation.unknownType())
+ .comparator()
+ .compare(null, null),
+ 0);
+ }
+ }
+
@Test
public void testSignedInt64Comparator() {
testInt64Comparator(