Skip to content

Commit 39a7eff

Browse files
committed
[CALCITE-4199] Add nullability annotations
1 parent 9d048fd commit 39a7eff

File tree

924 files changed

+11284
-7030
lines changed

Some content is hidden

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

924 files changed

+11284
-7030
lines changed

core/src/main/java/org/apache/calcite/DataContext.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import com.google.common.base.CaseFormat;
2727

28+
import org.checkerframework.checker.nullness.qual.Nullable;
29+
2830
import java.io.InputStream;
2931
import java.io.OutputStream;
3032
import java.lang.reflect.Modifier;
@@ -42,17 +44,17 @@ public interface DataContext {
4244
/**
4345
* Returns a sub-schema with a given name, or null.
4446
*/
45-
SchemaPlus getRootSchema();
47+
@Nullable SchemaPlus getRootSchema();
4648

4749
/**
4850
* Returns the type factory.
4951
*/
50-
JavaTypeFactory getTypeFactory();
52+
@Nullable JavaTypeFactory getTypeFactory();
5153

5254
/**
5355
* Returns the query provider.
5456
*/
55-
QueryProvider getQueryProvider();
57+
@Nullable QueryProvider getQueryProvider();
5658

5759
/**
5860
* Returns a context variable.
@@ -62,7 +64,7 @@ public interface DataContext {
6264
*
6365
* @param name Name of variable
6466
*/
65-
Object get(String name);
67+
@Nullable Object get(String name);
6668

6769
/** Variable that may be asked for in a call to {@link DataContext#get}. */
6870
enum Variable {

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

+24-22
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import com.google.common.base.Supplier;
4242
import com.google.common.collect.ImmutableList;
4343

44+
import org.checkerframework.checker.nullness.qual.Nullable;
45+
4446
import java.lang.reflect.Array;
4547
import java.lang.reflect.Type;
4648
import java.util.AbstractList;
@@ -82,9 +84,9 @@ class ArrayTable extends AbstractQueryableTable implements ScannableTable {
8284
return Statistics.of(content.size, keys, content.collations);
8385
}
8486

85-
@Override public Enumerable<Object[]> scan(DataContext root) {
86-
return new AbstractEnumerable<Object[]>() {
87-
@Override public Enumerator<Object[]> enumerator() {
87+
@Override public Enumerable<@Nullable Object[]> scan(DataContext root) {
88+
return new AbstractEnumerable<@Nullable Object[]>() {
89+
@Override public Enumerator<@Nullable Object[]> enumerator() {
8890
final Content content = supplier.get();
8991
return content.arrayEnumerator();
9092
}
@@ -225,7 +227,7 @@ public static List asList(final Representation representation,
225227
// Cache size. It might be expensive to compute.
226228
final int size = representation.size(dataSet);
227229
return new AbstractList() {
228-
@Override public Object get(int index) {
230+
@Override public @Nullable Object get(int index) {
229231
return representation.getObject(dataSet, index);
230232
}
231233

@@ -243,9 +245,9 @@ public interface Representation {
243245

244246
/** Converts a value set into a compact representation. If
245247
* {@code sources} is not null, permutes. */
246-
Object freeze(ColumnLoader.ValueSet valueSet, int[] sources);
248+
Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources);
247249

248-
Object getObject(Object dataSet, int ordinal);
250+
@Nullable Object getObject(Object dataSet, int ordinal);
249251
int getInt(Object dataSet, int ordinal);
250252

251253
/** Creates a data set that is the same as a given data set
@@ -277,7 +279,7 @@ public static class ObjectArray implements Representation {
277279
return RepresentationType.OBJECT_ARRAY;
278280
}
279281

280-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
282+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
281283
// We assume the values have been canonized.
282284
final List<Comparable> list = permuteList(valueSet.values, sources);
283285
return list.toArray(new Comparable[0]);
@@ -334,7 +336,7 @@ public static class PrimitiveArray implements Representation {
334336
return RepresentationType.PRIMITIVE_ARRAY;
335337
}
336338

337-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
339+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
338340
//noinspection unchecked
339341
return primitive.toArray2(
340342
permuteList((List) valueSet.values, sources));
@@ -344,7 +346,7 @@ public static class PrimitiveArray implements Representation {
344346
return primitive.permute(dataSet, sources);
345347
}
346348

347-
@Override public Object getObject(Object dataSet, int ordinal) {
349+
@Override public @Nullable Object getObject(Object dataSet, int ordinal) {
348350
return p.arrayItem(dataSet, ordinal);
349351
}
350352

@@ -375,7 +377,7 @@ public static class PrimitiveDictionary implements Representation {
375377
return RepresentationType.PRIMITIVE_DICTIONARY;
376378
}
377379

378-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
380+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
379381
throw new UnsupportedOperationException(); // TODO:
380382
}
381383

@@ -423,7 +425,7 @@ public static class ObjectDictionary implements Representation {
423425
return RepresentationType.OBJECT_DICTIONARY;
424426
}
425427

426-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
428+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
427429
final int n = valueSet.map.keySet().size();
428430
int extra = valueSet.containsNull ? 1 : 0;
429431
Comparable[] codeValues =
@@ -486,7 +488,7 @@ public static class StringDictionary implements Representation {
486488
return RepresentationType.STRING_DICTIONARY;
487489
}
488490

489-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
491+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
490492
throw new UnsupportedOperationException(); // TODO:
491493
}
492494

@@ -524,7 +526,7 @@ public static class ByteStringDictionary implements Representation {
524526
return RepresentationType.BYTE_STRING_DICTIONARY;
525527
}
526528

527-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
529+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
528530
throw new UnsupportedOperationException(); // TODO:
529531
}
530532

@@ -565,7 +567,7 @@ public static class Constant implements Representation {
565567
return RepresentationType.CONSTANT;
566568
}
567569

568-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
570+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
569571
final int size = valueSet.values.size();
570572
return Pair.of(size == 0 ? null : valueSet.values.get(0), size);
571573
}
@@ -626,7 +628,7 @@ public static class BitSlicedPrimitiveArray implements Representation {
626628
return RepresentationType.BIT_SLICED_PRIMITIVE_ARRAY;
627629
}
628630

629-
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int[] sources) {
631+
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
630632
final int chunksPerWord = 64 / bitCount;
631633
final List<Comparable> valueList =
632634
permuteList(valueSet.values, sources);
@@ -783,7 +785,7 @@ public static void orLong(
783785
}
784786

785787
private static <E> List<E> permuteList(
786-
final List<E> list, final int[] sources) {
788+
final List<E> list, final int @Nullable [] sources) {
787789
if (sources == null) {
788790
return list;
789791
}
@@ -828,13 +830,13 @@ public <T> Enumerator<T> enumerator() {
828830
}
829831
}
830832

831-
public Enumerator<Object[]> arrayEnumerator() {
833+
public Enumerator<@Nullable Object[]> arrayEnumerator() {
832834
return new ArrayEnumerator(size, columns);
833835
}
834836

835837
/** Enumerator over a table with a single column; each element
836838
* returned is an object. */
837-
private static class ObjectEnumerator implements Enumerator<Object> {
839+
private static class ObjectEnumerator implements Enumerator<@Nullable Object> {
838840
final int rowCount;
839841
final Object dataSet;
840842
final Representation representation;
@@ -846,7 +848,7 @@ private static class ObjectEnumerator implements Enumerator<Object> {
846848
this.representation = column.representation;
847849
}
848850

849-
@Override public Object current() {
851+
@Override public @Nullable Object current() {
850852
return representation.getObject(dataSet, i);
851853
}
852854

@@ -864,7 +866,7 @@ private static class ObjectEnumerator implements Enumerator<Object> {
864866

865867
/** Enumerator over a table with more than one column; each element
866868
* returned is an array. */
867-
private static class ArrayEnumerator implements Enumerator<Object[]> {
869+
private static class ArrayEnumerator implements Enumerator<@Nullable Object[]> {
868870
final int rowCount;
869871
final List<Column> columns;
870872
int i = -1;
@@ -874,8 +876,8 @@ private static class ArrayEnumerator implements Enumerator<Object[]> {
874876
this.columns = columns;
875877
}
876878

877-
@Override public Object[] current() {
878-
Object[] objects = new Object[columns.size()];
879+
@Override public @Nullable Object[] current() {
880+
@Nullable Object[] objects = new Object[columns.size()];
879881
for (int j = 0; j < objects.length; j++) {
880882
final Column pair = columns.get(j);
881883
objects[j] = pair.representation.getObject(pair.dataSet, i);

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

+16-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.apache.calcite.rel.type.RelProtoDataType;
2828
import org.apache.calcite.util.Util;
2929

30+
import org.checkerframework.checker.nullness.qual.Nullable;
31+
3032
import java.lang.reflect.Type;
3133
import java.sql.Date;
3234
import java.sql.Time;
@@ -62,6 +64,7 @@ class ColumnLoader<T> {
6264
* @param sourceTable Source data
6365
* @param protoRowType Logical row type
6466
* @param repList Physical row types, or null if not known */
67+
@SuppressWarnings("method.invocation.invalid")
6568
ColumnLoader(JavaTypeFactory typeFactory,
6669
Enumerable<T> sourceTable,
6770
RelProtoDataType protoRowType,
@@ -195,7 +198,7 @@ private void load(final RelDataType elementType,
195198
// We have discovered a the first unique key in the table.
196199
sort[0] = pair.i;
197200
final Comparable[] values =
198-
valueSet.values.toArray(new Comparable[list.size()]);
201+
valueSet.values.toArray(new Comparable[0]);
199202
final Kev[] kevs = new Kev[list.size()];
200203
for (int i = 0; i < kevs.length; i++) {
201204
kevs[i] = new Kev(i, values[i]);
@@ -230,15 +233,16 @@ private void load(final RelDataType elementType,
230233
* value needs to be converted to a {@link Long}. Similarly
231234
* {@link java.sql.Date} and {@link java.sql.Time} values to
232235
* {@link Integer}. */
233-
private static List wrap(ColumnMetaData.Rep rep, List list,
236+
private static List<? extends @Nullable Object> wrap(ColumnMetaData.Rep rep, List<?> list,
234237
RelDataType type) {
235238
switch (type.getSqlTypeName()) {
236239
case TIMESTAMP:
237240
switch (rep) {
238241
case OBJECT:
239242
case JAVA_SQL_TIMESTAMP:
240-
return Util.transform(list,
243+
final List<@Nullable Long> longs = Util.transform((List<@Nullable Timestamp>) list,
241244
(Timestamp t) -> t == null ? null : t.getTime());
245+
return longs;
242246
default:
243247
break;
244248
}
@@ -247,7 +251,7 @@ private static List wrap(ColumnMetaData.Rep rep, List list,
247251
switch (rep) {
248252
case OBJECT:
249253
case JAVA_SQL_TIME:
250-
return Util.transform(list, (Time t) -> t == null
254+
return Util.transform((List<@Nullable Time>) list, (Time t) -> t == null
251255
? null
252256
: (int) (t.getTime() % DateTimeUtils.MILLIS_PER_DAY));
253257
default:
@@ -258,9 +262,10 @@ private static List wrap(ColumnMetaData.Rep rep, List list,
258262
switch (rep) {
259263
case OBJECT:
260264
case JAVA_SQL_DATE:
261-
return Util.transform(list, (Date d) -> d == null
262-
? null
263-
: (int) (d.getTime() / DateTimeUtils.MILLIS_PER_DAY));
265+
return Util.<@Nullable Date, @Nullable Integer>transform(
266+
(List<@Nullable Date>) list, (Date d) -> d == null
267+
? null
268+
: (int) (d.getTime() / DateTimeUtils.MILLIS_PER_DAY));
264269
default:
265270
break;
266271
}
@@ -279,15 +284,15 @@ static class ValueSet {
279284
final Class clazz;
280285
final Map<Comparable, Comparable> map = new HashMap<>();
281286
final List<Comparable> values = new ArrayList<>();
282-
Comparable min;
283-
Comparable max;
287+
@Nullable Comparable min;
288+
@Nullable Comparable max;
284289
boolean containsNull;
285290

286291
ValueSet(Class clazz) {
287292
this.clazz = clazz;
288293
}
289294

290-
void add(Comparable e) {
295+
void add(@Nullable Comparable e) {
291296
if (e != null) {
292297
final Comparable old = e;
293298
e = map.get(e);
@@ -367,7 +372,7 @@ private long toLong(Object o) {
367372
}
368373
}
369374

370-
private boolean canBeLong(Object o) {
375+
private boolean canBeLong(@Nullable Object o) {
371376
return o instanceof Boolean
372377
|| o instanceof Character
373378
|| o instanceof Number;

core/src/main/java/org/apache/calcite/adapter/enumerable/AggAddContext.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.apache.calcite.linq4j.tree.Expression;
2020
import org.apache.calcite.rex.RexNode;
2121

22+
import org.checkerframework.checker.nullness.qual.Nullable;
23+
2224
import java.util.List;
2325

2426
/**
@@ -41,7 +43,7 @@ public interface AggAddContext extends AggResultContext {
4143
* Returns {@link org.apache.calcite.rex.RexNode} representation of the
4244
* filter, or null.
4345
*/
44-
RexNode rexFilterArgument();
46+
@Nullable RexNode rexFilterArgument();
4547

4648
/**
4749
* Returns Linq4j form of arguments.

core/src/main/java/org/apache/calcite/adapter/enumerable/AggImpState.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.apache.calcite.linq4j.tree.Expression;
2020
import org.apache.calcite.rel.core.AggregateCall;
2121

22+
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
23+
2224
import java.util.List;
2325

2426
/**
@@ -28,21 +30,21 @@ public class AggImpState {
2830
public final int aggIdx;
2931
public final AggregateCall call;
3032
public final AggImplementor implementor;
31-
public AggContext context;
32-
public Expression result;
33-
public List<Expression> state;
34-
public Expression accumulatorAdder;
33+
public @MonotonicNonNull AggContext context;
34+
public @MonotonicNonNull Expression result;
35+
public @MonotonicNonNull List<Expression> state;
36+
public @MonotonicNonNull Expression accumulatorAdder;
3537

3638
public AggImpState(int aggIdx, AggregateCall call, boolean windowContext) {
3739
this.aggIdx = aggIdx;
3840
this.call = call;
39-
this.implementor =
40-
RexImpTable.INSTANCE.get(call.getAggregation(), windowContext);
41+
AggImplementor implementor = RexImpTable.INSTANCE.get(call.getAggregation(), windowContext);
4142
if (implementor == null) {
4243
throw new IllegalArgumentException(
4344
"Unable to get aggregate implementation for aggregate "
4445
+ call.getAggregation()
4546
+ (windowContext ? " in window context" : ""));
4647
}
48+
this.implementor = implementor;
4749
}
4850
}

core/src/main/java/org/apache/calcite/adapter/enumerable/AggResultContext.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.apache.calcite.linq4j.tree.Expression;
2020
import org.apache.calcite.rel.core.AggregateCall;
2121

22+
import org.checkerframework.checker.nullness.qual.Nullable;
23+
2224
/**
2325
* Information for a call to
2426
* {@link AggImplementor#implementResult(AggContext, AggResultContext)}
@@ -32,7 +34,7 @@ public interface AggResultContext extends NestedBlockBuilder, AggResetContext {
3234
* accumulator were aggregated. Most aggregate functions depend on only the
3335
* accumulator, but quasi-aggregate functions such as GROUPING access at the
3436
* key. */
35-
Expression key();
37+
@Nullable Expression key();
3638

3739
/** Returns an expression that references the {@code i}th field of the key,
3840
* cast to the appropriate type. */

0 commit comments

Comments
 (0)