Skip to content

Commit 11ef05b

Browse files
committed
WIP: checker
1 parent 8d75683 commit 11ef05b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+206
-118
lines changed

core/src/main/java/org/apache/calcite/adapter/clone/ListTable.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public Type getElementType() {
7373
return elementType;
7474
}
7575

76-
public Expression getExpression() {
76+
public @org.checkerframework.checker.nullness.qual.Nullable Expression getExpression() {
7777
return expression;
7878
}
7979

core/src/main/java/org/apache/calcite/materialize/MaterializationService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ public Type getElementType() {
384384
return Object.class;
385385
}
386386

387-
public Expression getExpression() {
387+
public @org.checkerframework.checker.nullness.qual.Nullable Expression getExpression() {
388388
throw new UnsupportedOperationException();
389389
}
390390

core/src/main/java/org/apache/calcite/schema/impl/AbstractTableQueryable.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public AbstractTableQueryable(QueryProvider queryProvider,
5050
this.tableName = tableName;
5151
}
5252

53-
public Expression getExpression() {
53+
public @org.checkerframework.checker.nullness.qual.Nullable Expression getExpression() {
5454
return table.getExpression(schema, tableName, Queryable.class);
5555
}
5656

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ bouncycastle.version=1.60
7272
cassandra-all.version=3.11.2
7373
cassandra-driver-core.version=3.6.0
7474
cassandra-unit.version=3.5.0.1
75-
checkerframework.version=3.3.0
75+
checkerframework.version=3.4.0
7676
chinook-data-hsqldb.version=0.1
7777
commons-codec.version=1.12
7878
commons-dbcp2.version=2.6.0

linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import org.apache.calcite.linq4j.tree.Expression;
2020

21+
import org.checkerframework.checker.nullness.qual.Nullable;
22+
2123
import java.lang.reflect.Type;
2224
import java.util.Iterator;
2325

@@ -51,7 +53,7 @@ public Type getElementType() {
5153
return elementType;
5254
}
5355

54-
public Expression getExpression() {
56+
public @Nullable Expression getExpression() {
5557
return expression;
5658
}
5759

linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.apache.calcite.linq4j.function.Predicate1;
3434
import org.apache.calcite.linq4j.function.Predicate2;
3535

36+
import org.checkerframework.checker.nullness.qual.NonNull;
37+
import org.checkerframework.checker.nullness.qual.Nullable;
38+
3639
import java.math.BigDecimal;
3740
import java.util.Collection;
3841
import java.util.Comparator;
@@ -69,7 +72,7 @@ protected OrderedEnumerable<T> getThisOrdered() {
6972
return this;
7073
}
7174

72-
public <R> R foreach(Function1<T, R> func) {
75+
public <@Nullable R> R foreach(Function1<T, R> func) {
7376
R result = null;
7477
try (Enumerator<T> enumerator = enumerator()) {
7578
while (enumerator.moveNext()) {
@@ -241,7 +244,7 @@ public T first(Predicate1<T> predicate) {
241244
return EnumerableDefaults.first(getThis(), predicate);
242245
}
243246

244-
public T firstOrDefault() {
247+
public @Nullable T firstOrDefault() {
245248
return EnumerableDefaults.firstOrDefault(getThis());
246249
}
247250

linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.apache.calcite.linq4j.function.Predicate2;
3434
import org.apache.calcite.linq4j.tree.FunctionExpression;
3535

36+
import org.checkerframework.checker.nullness.qual.NonNull;
37+
3638
import java.math.BigDecimal;
3739
import java.util.Comparator;
3840

linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java

+33-21
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
import com.google.common.collect.Sets;
4242

4343
import org.apiguardian.api.API;
44+
import org.checkerframework.checker.nullness.qual.NonNull;
45+
import org.checkerframework.checker.nullness.qual.Nullable;
46+
import org.checkerframework.framework.qual.DefaultQualifier;
47+
import org.checkerframework.framework.qual.TypeUseLocation;
4448

4549
import java.math.BigDecimal;
4650
import java.util.AbstractList;
@@ -70,6 +74,14 @@
7074
/**
7175
* Default implementations of methods in the {@link Enumerable} interface.
7276
*/
77+
@DefaultQualifier(
78+
value = Nullable.class,
79+
locations = TypeUseLocation.UPPER_BOUND
80+
)
81+
@DefaultQualifier(
82+
value = Nullable.class,
83+
locations = TypeUseLocation.LOWER_BOUND
84+
)
7385
public abstract class EnumerableDefaults {
7486

7587
/**
@@ -625,7 +637,7 @@ public static <TSource> TSource first(Enumerable<TSource> enumerable,
625637
* Returns the first element of a sequence, or a
626638
* default value if the sequence contains no elements.
627639
*/
628-
public static <TSource> TSource firstOrDefault(
640+
public static <@Nullable TSource> TSource firstOrDefault(
629641
Enumerable<TSource> enumerable) {
630642
try (Enumerator<TSource> os = enumerable.enumerator()) {
631643
if (os.moveNext()) {
@@ -640,7 +652,7 @@ public static <TSource> TSource firstOrDefault(
640652
* satisfies a condition or a default value if no such element is
641653
* found.
642654
*/
643-
public static <TSource> TSource firstOrDefault(Enumerable<TSource> enumerable,
655+
public static <@Nullable TSource> TSource firstOrDefault(Enumerable<TSource> enumerable,
644656
Predicate1<TSource> predicate) {
645657
for (TSource o : enumerable) {
646658
if (predicate.apply(o)) {
@@ -1225,7 +1237,7 @@ public static <TSource, TInner, TKey, TResult> Enumerable<TResult> hashJoin(
12251237
Function1<TSource, TKey> outerKeySelector,
12261238
Function1<TInner, TKey> innerKeySelector,
12271239
Function2<TSource, TInner, TResult> resultSelector,
1228-
EqualityComparer<TKey> comparer, boolean generateNullsOnLeft,
1240+
@Nullable EqualityComparer<TKey> comparer, boolean generateNullsOnLeft,
12291241
boolean generateNullsOnRight) {
12301242
return hashEquiJoin_(
12311243
outer,
@@ -1248,7 +1260,7 @@ public static <TSource, TInner, TKey, TResult> Enumerable<TResult> hashJoin(
12481260
Function1<TSource, TKey> outerKeySelector,
12491261
Function1<TInner, TKey> innerKeySelector,
12501262
Function2<TSource, TInner, TResult> resultSelector,
1251-
EqualityComparer<TKey> comparer, boolean generateNullsOnLeft,
1263+
@Nullable EqualityComparer<TKey> comparer, boolean generateNullsOnLeft,
12521264
boolean generateNullsOnRight,
12531265
Predicate2<TSource, TInner> predicate) {
12541266
if (predicate == null) {
@@ -1293,7 +1305,7 @@ public Enumerator<TResult> enumerator() {
12931305
return new Enumerator<TResult>() {
12941306
Enumerator<TSource> outers = outer.enumerator();
12951307
Enumerator<TInner> inners = Linq4j.emptyEnumerator();
1296-
Set<TKey> unmatchedKeys =
1308+
@Nullable Set<TKey> unmatchedKeys =
12971309
generateNullsOnLeft
12981310
? new HashSet<>(innerLookup.keySet())
12991311
: null;
@@ -1397,7 +1409,7 @@ public Enumerator<TResult> enumerator() {
13971409
return new Enumerator<TResult>() {
13981410
Enumerator<TSource> outers = outer.enumerator();
13991411
Enumerator<TInner> inners = Linq4j.emptyEnumerator();
1400-
List<TInner> innersUnmatched =
1412+
@Nullable List<TInner> innersUnmatched =
14011413
generateNullsOnLeft
14021414
? new ArrayList<>(innerToLookUp.toList())
14031415
: null;
@@ -1491,10 +1503,10 @@ public static <TSource, TInner, TResult> Enumerable<TResult> correlateJoin(
14911503
return new AbstractEnumerable<TResult>() {
14921504
public Enumerator<TResult> enumerator() {
14931505
return new Enumerator<TResult>() {
1494-
private Enumerator<TSource> outerEnumerator = outer.enumerator();
1495-
private Enumerator<TInner> innerEnumerator;
1496-
TSource outerValue;
1497-
TInner innerValue;
1506+
private final Enumerator<TSource> outerEnumerator = outer.enumerator();
1507+
private @Nullable Enumerator<TInner> innerEnumerator;
1508+
@Nullable TSource outerValue;
1509+
@Nullable TInner innerValue;
14981510
int state = 0; // 0 -- moving outer, 1 moving inner;
14991511

15001512
public TResult current() {
@@ -1629,19 +1641,19 @@ public static <TSource, TInner, TResult> Enumerable<TResult> correlateBatchJoin(
16291641
final JoinType joinType,
16301642
final Enumerable<TSource> outer,
16311643
final Function1<List<TSource>, Enumerable<TInner>> inner,
1632-
final Function2<TSource, TInner, TResult> resultSelector,
1633-
final Predicate2<TSource, TInner> predicate,
1644+
final Function2<@Nullable TSource, @Nullable TInner, @Nullable TResult> resultSelector,
1645+
final Predicate2<@Nullable TSource, @Nullable TInner> predicate,
16341646
final int batchSize) {
16351647
return new AbstractEnumerable<TResult>() {
16361648
@Override public Enumerator<TResult> enumerator() {
16371649
return new Enumerator<TResult>() {
1638-
Enumerator<TSource> outerEnumerator = outer.enumerator();
1639-
List<TSource> outerValues = new ArrayList<>(batchSize);
1640-
List<TInner> innerValues = new ArrayList<>();
1641-
TSource outerValue;
1642-
TInner innerValue;
1643-
Enumerable<TInner> innerEnumerable;
1644-
Enumerator<TInner> innerEnumerator;
1650+
final Enumerator<TSource> outerEnumerator = outer.enumerator();
1651+
final List<TSource> outerValues = new ArrayList<>(batchSize);
1652+
final List<TInner> innerValues = new ArrayList<>();
1653+
@Nullable TSource outerValue;
1654+
@Nullable TInner innerValue;
1655+
@Nullable Enumerable<TInner> innerEnumerable;
1656+
@Nullable Enumerator<TInner> innerEnumerator;
16451657
boolean innerEnumHasNext = false;
16461658
boolean atLeastOneResult = false;
16471659
int i = -1; // outer position
@@ -1875,7 +1887,7 @@ public Enumerator<TSource> enumerator() {
18751887
// moment when we are sure
18761888
// that it will be really needed, i.e. when the first outer
18771889
// enumerator item is processed
1878-
final Supplier<Lookup<TKey, TInner>> innerLookup = Suppliers.memoize(
1890+
final Supplier<Lookup<TKey, @NonNull TInner>> innerLookup = Suppliers.memoize(
18791891
() ->
18801892
comparer == null
18811893
? inner.toLookup(innerKeySelector)
@@ -1911,7 +1923,7 @@ private static <TSource, TInner, TKey> Enumerable<TSource> semiEquiJoin_(
19111923
final Enumerable<TSource> outer, final Enumerable<TInner> inner,
19121924
final Function1<TSource, TKey> outerKeySelector,
19131925
final Function1<TInner, TKey> innerKeySelector,
1914-
final EqualityComparer<TKey> comparer,
1926+
final @Nullable EqualityComparer<TKey> comparer,
19151927
final boolean anti) {
19161928
return new AbstractEnumerable<TSource>() {
19171929
public Enumerator<TSource> enumerator() {

linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
import org.apache.calcite.linq4j.tree.Expression;
3535
import org.apache.calcite.linq4j.tree.FunctionExpression;
3636

37+
import org.checkerframework.checker.nullness.qual.NonNull;
38+
import org.checkerframework.checker.nullness.qual.Nullable;
39+
3740
import java.lang.reflect.Type;
3841
import java.math.BigDecimal;
3942
import java.util.Comparator;
@@ -49,10 +52,10 @@ class EnumerableQueryable<T> extends DefaultEnumerable<T>
4952
private final QueryProvider provider;
5053
private final Class<T> elementType;
5154
private final Enumerable<T> enumerable;
52-
private final Expression expression;
55+
private final @Nullable Expression expression;
5356

5457
EnumerableQueryable(QueryProvider provider, Class<T> elementType,
55-
Expression expression, Enumerable<T> enumerable) {
58+
@Nullable Expression expression, Enumerable<T> enumerable) {
5659
this.enumerable = enumerable;
5760
this.elementType = elementType;
5861
this.provider = provider;
@@ -167,7 +170,7 @@ public Type getElementType() {
167170
return elementType;
168171
}
169172

170-
public Expression getExpression() {
173+
public @Nullable Expression getExpression() {
171174
return expression;
172175
}
173176

linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.apache.calcite.linq4j.function.Predicate1;
3434
import org.apache.calcite.linq4j.function.Predicate2;
3535

36+
import org.checkerframework.checker.nullness.qual.Nullable;
37+
3638
import java.math.BigDecimal;
3739
import java.util.Collection;
3840
import java.util.Comparator;
@@ -344,14 +346,14 @@ Enumerable<TSource> except(Enumerable<TSource> enumerable1,
344346
* Returns the first element of a sequence, or a
345347
* default value if the sequence contains no elements.
346348
*/
347-
TSource firstOrDefault();
349+
@Nullable TSource firstOrDefault();
348350

349351
/**
350352
* Returns the first element of the sequence that
351353
* satisfies a condition or a default value if no such element is
352354
* found.
353355
*/
354-
TSource firstOrDefault(Predicate1<TSource> predicate);
356+
@Nullable TSource firstOrDefault(Predicate1<TSource> predicate);
355357

356358
/**
357359
* Groups the elements of a sequence according to a

linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
import org.apache.calcite.linq4j.function.Function1;
2020

21+
import org.checkerframework.checker.nullness.NullnessUtil;
22+
import org.checkerframework.checker.nullness.qual.Nullable;
23+
2124
import java.lang.reflect.Method;
2225
import java.util.ArrayList;
2326
import java.util.Arrays;
@@ -28,6 +31,8 @@
2831
import java.util.Objects;
2932
import java.util.RandomAccess;
3033

34+
import static org.checkerframework.checker.nullness.NullnessUtil.castNonNull;
35+
3136
/**
3237
* Utility and factory methods for Linq4j.
3338
*/
@@ -36,7 +41,7 @@ private Linq4j() {}
3641

3742
private static final Object DUMMY = new Object();
3843

39-
public static Method getMethod(String className, String methodName,
44+
public static @Nullable Method getMethod(String className, String methodName,
4045
Class... parameterTypes) {
4146
try {
4247
return Class.forName(className).getMethod(methodName, parameterTypes);
@@ -423,7 +428,7 @@ public static <T> T requireNonNull(T o) {
423428
}
424429

425430
/** Closes an iterator, if it can be closed. */
426-
private static <T> void closeIterator(Iterator<T> iterator) {
431+
private static <T> void closeIterator(Iterator<? extends T> iterator) {
427432
if (iterator instanceof AutoCloseable) {
428433
try {
429434
((AutoCloseable) iterator).close();
@@ -441,7 +446,7 @@ private static <T> void closeIterator(Iterator<T> iterator) {
441446
@SuppressWarnings("unchecked")
442447
static class IterableEnumerator<T> implements Enumerator<T> {
443448
private final Iterable<? extends T> iterable;
444-
Iterator<? extends T> iterator;
449+
@Nullable Iterator<? extends T> iterator;
445450
T current;
446451

447452
IterableEnumerator(Iterable<? extends T> iterable) {
@@ -458,7 +463,7 @@ public T current() {
458463
}
459464

460465
public boolean moveNext() {
461-
if (iterator.hasNext()) {
466+
if (castNonNull(iterator).hasNext()) {
462467
current = iterator.next();
463468
return true;
464469
}
@@ -644,7 +649,7 @@ public void close() {
644649
/** Enumerator that returns one null element.
645650
*
646651
* @param <E> element type */
647-
private static class SingletonNullEnumerator<E> implements Enumerator<E> {
652+
private static class SingletonNullEnumerator<@Nullable E> implements Enumerator<E> {
648653
int i = 0;
649654

650655
public E current() {

linq4j/src/main/java/org/apache/calcite/linq4j/MemoryEnumerator.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
*/
1717
package org.apache.calcite.linq4j;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.util.concurrent.atomic.AtomicInteger;
2022

2123
/**
2224
* Enumerator that keeps some recent and some "future" values.
2325
*
2426
* @param <E> Row value
2527
*/
26-
public class MemoryEnumerator<E> implements Enumerator<MemoryFactory.Memory<E>> {
28+
public class MemoryEnumerator<@Nullable E> implements Enumerator<MemoryFactory.Memory<E>> {
2729
private final Enumerator<E> enumerator;
2830
private final MemoryFactory<E> memoryFactory;
2931
private final AtomicInteger prevCounter;

linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ public Type getElementType() {
12021202
return original.getElementType();
12031203
}
12041204

1205-
public Expression getExpression() {
1205+
public @org.checkerframework.checker.nullness.qual.Nullable Expression getExpression() {
12061206
return original.getExpression();
12071207
}
12081208

0 commit comments

Comments
 (0)