From 2862fd0d17c2464876b02dda49b116221b322b31 Mon Sep 17 00:00:00 2001 From: Niels Pardon Date: Thu, 17 Jul 2025 09:35:43 +0200 Subject: [PATCH 1/2] chore: use checkerframework @Nullable instead of JSR305 Signed-off-by: Niels Pardon --- core/build.gradle.kts | 2 +- .../main/java/io/substrait/extension/SimpleExtension.java | 8 +++----- isthmus/build.gradle.kts | 2 +- .../src/main/java/io/substrait/isthmus/TypeConverter.java | 2 +- .../main/java/io/substrait/isthmus/UserTypeMapper.java | 8 +++----- .../io/substrait/isthmus/expression/CallConverters.java | 5 ++--- .../test/java/io/substrait/isthmus/CalciteTypeTest.java | 2 +- .../java/io/substrait/isthmus/CustomFunctionTest.java | 2 +- 8 files changed, 13 insertions(+), 18 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 150bf8b2b..8149fd858 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,6 +15,7 @@ plugins { id("com.diffplug.spotless") version "6.19.0" id("com.gradleup.shadow") version "8.3.6" id("org.jreleaser") + id("org.checkerframework") version "0.6.56" } val stagingRepositoryUrl = uri(layout.buildDirectory.dir("staging-deploy")) @@ -121,7 +122,6 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-annotations:${JACKSON_VERSION}") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${JACKSON_VERSION}") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${JACKSON_VERSION}") - implementation("com.google.code.findbugs:jsr305:3.0.2") antlr("org.antlr:antlr4:${ANTLR_VERSION}") shadowImplementation("org.antlr:antlr4-runtime:${ANTLR_VERSION}") diff --git a/core/src/main/java/io/substrait/extension/SimpleExtension.java b/core/src/main/java/io/substrait/extension/SimpleExtension.java index 9f7d64e6b..421c90886 100644 --- a/core/src/main/java/io/substrait/extension/SimpleExtension.java +++ b/core/src/main/java/io/substrait/extension/SimpleExtension.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.annotation.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,12 +79,10 @@ public interface Argument { String toTypeString(); @JsonProperty() - @Nullable - String name(); + @Nullable String name(); @JsonProperty() - @Nullable - String description(); + @Nullable String description(); boolean required(); } diff --git a/isthmus/build.gradle.kts b/isthmus/build.gradle.kts index 64f9891a4..30d3b57ee 100644 --- a/isthmus/build.gradle.kts +++ b/isthmus/build.gradle.kts @@ -9,6 +9,7 @@ plugins { id("com.gradleup.shadow") version "8.3.6" id("com.google.protobuf") version "0.9.4" id("org.jreleaser") + id("org.checkerframework") version "0.6.56" } val stagingRepositoryUrl = uri(layout.buildDirectory.dir("staging-deploy")) @@ -139,7 +140,6 @@ dependencies { exclude("com.google.guava", "guava") .because("Brings in Guava for Android, which we don't want (and breaks multimaps).") } - implementation("com.google.code.findbugs:jsr305:3.0.2") implementation("org.immutables:value-annotations:${IMMUTABLES_VERSION}") implementation("org.slf4j:slf4j-api:${SLF4J_VERSION}") annotationProcessor("org.immutables:value:${IMMUTABLES_VERSION}") diff --git a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java index f94c63f49..f166ed43e 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java +++ b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java @@ -12,11 +12,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.sql.type.MapSqlType; import org.apache.calcite.sql.type.SqlTypeName; +import org.checkerframework.checker.nullness.qual.Nullable; public class TypeConverter { diff --git a/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java b/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java index 3394b05b1..045dddeeb 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java +++ b/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java @@ -1,8 +1,8 @@ package io.substrait.isthmus; import io.substrait.type.Type; -import javax.annotation.Nullable; import org.apache.calcite.rel.type.RelDataType; +import org.checkerframework.checker.nullness.qual.Nullable; /** Defines conversion of user-defined types between Substrait and Calcite */ public interface UserTypeMapper { @@ -10,13 +10,11 @@ public interface UserTypeMapper { * @param relDataType the Calcite {@link RelDataType} type to convert * @return the Substrait representation of the input type */ - @Nullable - Type toSubstrait(RelDataType relDataType); + @Nullable Type toSubstrait(RelDataType relDataType); /** * @param type the Subtrait {@link Type.UserDefined} type to convert * @return the Calcite {@link RelDataType} representing the input type */ - @Nullable - RelDataType toCalcite(Type.UserDefined type); + @Nullable RelDataType toCalcite(Type.UserDefined type); } diff --git a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java index f030b61da..6824e68b0 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java +++ b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java @@ -10,12 +10,12 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; -import javax.annotation.Nullable; import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexCall; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlKind; +import org.checkerframework.checker.nullness.qual.Nullable; public class CallConverters { @@ -146,8 +146,7 @@ public static List defaults(TypeConverter typeConverter) { public interface SimpleCallConverter extends CallConverter { - @Nullable - Expression apply(RexCall call, Function topLevelConverter); + @Nullable Expression apply(RexCall call, Function topLevelConverter); @Override default Optional convert( diff --git a/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java b/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java index 99a6aa79b..9837dc00a 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java @@ -8,9 +8,9 @@ import io.substrait.type.TypeCreator; import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.type.SqlTypeName; +import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java b/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java index 4772468ad..ff0b30a48 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java @@ -21,7 +21,6 @@ import io.substrait.type.TypeCreator; import java.io.IOException; import java.util.List; -import javax.annotation.Nullable; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; @@ -34,6 +33,7 @@ import org.apache.calcite.sql.type.SqlTypeFactoryImpl; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.tools.RelBuilder; +import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.jupiter.api.Test; /** Verify that custom functions can convert from Substrait to Calcite and back. */ From 145ae08b76d6205fc7a0f06590988bda23f212bb Mon Sep 17 00:00:00 2001 From: Niels Pardon Date: Wed, 23 Jul 2025 12:41:35 +0200 Subject: [PATCH 2/2] chore: use JSpecify instead of JSR305 Signed-off-by: Niels Pardon --- core/build.gradle.kts | 2 +- core/src/main/java/io/substrait/extension/SimpleExtension.java | 2 +- isthmus/build.gradle.kts | 2 +- isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java | 2 +- isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java | 2 +- .../io/substrait/isthmus/calcite/SubstraitOperatorTable.java | 2 +- .../java/io/substrait/isthmus/expression/CallConverters.java | 2 +- isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java | 2 +- isthmus/src/test/java/io/substrait/isthmus/ComplexSortTest.java | 2 +- .../src/test/java/io/substrait/isthmus/CustomFunctionTest.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 8149fd858..72cabd856 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,7 +15,6 @@ plugins { id("com.diffplug.spotless") version "6.19.0" id("com.gradleup.shadow") version "8.3.6" id("org.jreleaser") - id("org.checkerframework") version "0.6.56" } val stagingRepositoryUrl = uri(layout.buildDirectory.dir("staging-deploy")) @@ -122,6 +121,7 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-annotations:${JACKSON_VERSION}") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${JACKSON_VERSION}") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${JACKSON_VERSION}") + api("org.jspecify:jspecify:1.0.0") antlr("org.antlr:antlr4:${ANTLR_VERSION}") shadowImplementation("org.antlr:antlr4-runtime:${ANTLR_VERSION}") diff --git a/core/src/main/java/io/substrait/extension/SimpleExtension.java b/core/src/main/java/io/substrait/extension/SimpleExtension.java index 421c90886..517bc8fee 100644 --- a/core/src/main/java/io/substrait/extension/SimpleExtension.java +++ b/core/src/main/java/io/substrait/extension/SimpleExtension.java @@ -26,8 +26,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/isthmus/build.gradle.kts b/isthmus/build.gradle.kts index 30d3b57ee..131f43ee2 100644 --- a/isthmus/build.gradle.kts +++ b/isthmus/build.gradle.kts @@ -9,7 +9,6 @@ plugins { id("com.gradleup.shadow") version "8.3.6" id("com.google.protobuf") version "0.9.4" id("org.jreleaser") - id("org.checkerframework") version "0.6.56" } val stagingRepositoryUrl = uri(layout.buildDirectory.dir("staging-deploy")) @@ -150,6 +149,7 @@ dependencies { ) } testImplementation("com.google.protobuf:protobuf-java:${PROTOBUF_VERSION}") + api("org.jspecify:jspecify:1.0.0") } tasks { diff --git a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java index f166ed43e..c621425c8 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java +++ b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java @@ -16,7 +16,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.sql.type.MapSqlType; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; public class TypeConverter { diff --git a/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java b/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java index 045dddeeb..2c4665090 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java +++ b/isthmus/src/main/java/io/substrait/isthmus/UserTypeMapper.java @@ -2,7 +2,7 @@ import io.substrait.type.Type; import org.apache.calcite.rel.type.RelDataType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Defines conversion of user-defined types between Substrait and Calcite */ public interface UserTypeMapper { diff --git a/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java b/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java index c6cc29d6b..b363203e3 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java +++ b/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java @@ -15,7 +15,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.util.SqlOperatorTables; import org.apache.calcite.sql.validate.SqlNameMatcher; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Overrides SQL operator lookups to return Substrait specific functions variants (e.g. {@link diff --git a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java index 6824e68b0..5dbd88055 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java +++ b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java @@ -15,7 +15,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; public class CallConverters { diff --git a/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java b/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java index 9837dc00a..1d751e09e 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/CalciteTypeTest.java @@ -10,7 +10,7 @@ import java.util.List; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/isthmus/src/test/java/io/substrait/isthmus/ComplexSortTest.java b/isthmus/src/test/java/io/substrait/isthmus/ComplexSortTest.java index 3f7407530..dff92e557 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/ComplexSortTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/ComplexSortTest.java @@ -15,7 +15,7 @@ import org.apache.calcite.rel.externalize.RelWriterImpl; import org.apache.calcite.sql.SqlExplainLevel; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; public class ComplexSortTest extends PlanTestBase { diff --git a/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java b/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java index ff0b30a48..de63c38d1 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java @@ -33,7 +33,7 @@ import org.apache.calcite.sql.type.SqlTypeFactoryImpl; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.tools.RelBuilder; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; /** Verify that custom functions can convert from Substrait to Calcite and back. */