Skip to content

Commit a6678da

Browse files
committed
WIP: linq4j nullability
1 parent 4ea00da commit a6678da

Some content is hidden

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

54 files changed

+277
-170
lines changed

linq4j/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ dependencies {
1919

2020
implementation("com.google.guava:guava")
2121
implementation("org.apache.calcite.avatica:avatica-core")
22+
implementation("org.checkerframework:checker-qual")
2223
}

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

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

1919
import com.google.common.base.Preconditions;
2020

21+
import org.checkerframework.checker.nullness.qual.Nullable;
22+
2123
/**
2224
* Represents an integer in modular arithmetic.
2325
* Its {@code value} is between 0 and {@code m - 1} for some modulus {@code m}.
@@ -35,7 +37,7 @@ class ModularInteger {
3537
this.modulus = modulus;
3638
}
3739

38-
@Override public boolean equals(Object obj) {
40+
@Override public boolean equals(@Nullable Object obj) {
3941
return obj == this
4042
|| obj instanceof ModularInteger
4143
&& value == ((ModularInteger) obj).value

linq4j/src/main/java/org/apache/calcite/linq4j/tree/AbstractNode.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Type;
2022
import java.util.Objects;
2123

@@ -70,12 +72,12 @@ public Node accept(Shuttle shuttle) {
7072
"visit not supported: " + getClass() + ":" + nodeType);
7173
}
7274

73-
public Object evaluate(Evaluator evaluator) {
75+
public @Nullable Object evaluate(Evaluator evaluator) {
7476
throw new RuntimeException(
7577
"evaluation not supported: " + getClass() + ":" + nodeType);
7678
}
7779

78-
@Override public boolean equals(Object o) {
80+
@Override public boolean equals(@Nullable Object o) {
7981
if (this == o) {
8082
return true;
8183
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ArrayLengthRecordField.java

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

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Array;
2022
import java.lang.reflect.Type;
2123
import java.util.Objects;
@@ -58,7 +60,7 @@ public Type getDeclaringClass() {
5860
return clazz;
5961
}
6062

61-
@Override public boolean equals(Object o) {
63+
@Override public boolean equals(@Nullable Object o) {
6264
if (this == o) {
6365
return true;
6466
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/BinaryExpression.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Type;
2022
import java.util.Objects;
2123

@@ -44,7 +46,7 @@ public class BinaryExpression extends Expression {
4446
return visitor.visit(this, expression0, expression1);
4547
}
4648

47-
public <R> R accept(Visitor<R> visitor) {
49+
public <@Nullable R> R accept(Visitor<R> visitor) {
4850
return visitor.visit(this);
4951
}
5052

@@ -88,8 +90,7 @@ public Object evaluate(Evaluator evaluator) {
8890
throw cannotEvaluate();
8991
}
9092
case Equal:
91-
return expression0.evaluate(evaluator)
92-
.equals(expression1.evaluate(evaluator));
93+
return Objects.equals(expression0.evaluate(evaluator), expression1.evaluate(evaluator));
9394
case GreaterThan:
9495
switch (primitive) {
9596
case INT:
@@ -241,7 +242,7 @@ private double evaluateDouble(Expression expression, Evaluator evaluator) {
241242
return ((Number) expression.evaluate(evaluator)).doubleValue();
242243
}
243244

244-
@Override public boolean equals(Object o) {
245+
@Override public boolean equals(@Nullable Object o) {
245246
if (this == o) {
246247
return true;
247248
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockBuilder.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Modifier;
2022
import java.lang.reflect.Type;
2123
import java.util.ArrayList;
@@ -41,7 +43,7 @@ public class BlockBuilder {
4143
new HashMap<>();
4244

4345
private final boolean optimizing;
44-
private final BlockBuilder parent;
46+
private final @Nullable BlockBuilder parent;
4547

4648
private static final Shuttle OPTIMIZE_SHUTTLE = new OptimizeShuttle();
4749

@@ -66,7 +68,7 @@ public BlockBuilder(boolean optimizing) {
6668
*
6769
* @param optimizing Whether to eliminate common sub-expressions
6870
*/
69-
public BlockBuilder(boolean optimizing, BlockBuilder parent) {
71+
public BlockBuilder(boolean optimizing, @Nullable BlockBuilder parent) {
7072
this.optimizing = optimizing;
7173
this.parent = parent;
7274
}
@@ -85,7 +87,7 @@ public void clear() {
8587
* (possibly a variable) that represents the result of the newly added
8688
* block.
8789
*/
88-
public Expression append(String name, BlockStatement block) {
90+
public @Nullable Expression append(String name, BlockStatement block) {
8991
return append(name, block, true);
9092
}
9193

@@ -99,7 +101,7 @@ public Expression append(String name, BlockStatement block) {
99101
* a variable. Do not do this if the expression has
100102
* side-effects or a time-dependent value.
101103
*/
102-
public Expression append(String name, BlockStatement block,
104+
public @Nullable Expression append(String name, BlockStatement block,
103105
boolean optimize) {
104106
if (statements.size() > 0) {
105107
Statement lastStatement = statements.get(statements.size() - 1);
@@ -184,7 +186,7 @@ public Expression append(String name, Expression expression) {
184186
/**
185187
* Appends an expression to a list of statements, if it is not null.
186188
*/
187-
public Expression appendIfNotNull(String name, Expression expression) {
189+
public @Nullable Expression appendIfNotNull(String name, @Nullable Expression expression) {
188190
if (expression == null) {
189191
return null;
190192
}
@@ -283,7 +285,7 @@ private Expression normalizeDeclaration(DeclarationStatement decl) {
283285
* @param expr expression to test
284286
* @return existing ParameterExpression or null
285287
*/
286-
public DeclarationStatement getComputedExpression(Expression expr) {
288+
public @Nullable DeclarationStatement getComputedExpression(Expression expr) {
287289
if (parent != null) {
288290
DeclarationStatement decl = parent.getComputedExpression(expr);
289291
if (decl != null) {

linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockStatement.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Type;
2022
import java.util.HashSet;
2123
import java.util.List;
@@ -61,7 +63,7 @@ private boolean distinctVariables(boolean fail) {
6163
return shuttle.visit(this, newStatements);
6264
}
6365

64-
public <R> R accept(Visitor<R> visitor) {
66+
public <@Nullable R> R accept(Visitor<R> visitor) {
6567
return visitor.visit(this);
6668
}
6769

@@ -77,15 +79,15 @@ public <R> R accept(Visitor<R> visitor) {
7779
writer.end("}\n");
7880
}
7981

80-
@Override public Object evaluate(Evaluator evaluator) {
82+
@Override public @Nullable Object evaluate(Evaluator evaluator) {
8183
Object o = null;
8284
for (Statement statement : statements) {
8385
o = statement.evaluate(evaluator);
8486
}
8587
return o;
8688
}
8789

88-
@Override public boolean equals(Object o) {
90+
@Override public boolean equals(@Nullable Object o) {
8991
if (this == o) {
9092
return true;
9193
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/CatchBlock.java

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

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

2123
/**
@@ -31,7 +33,7 @@ public CatchBlock(ParameterExpression parameter,
3133
this.body = body;
3234
}
3335

34-
@Override public boolean equals(Object o) {
36+
@Override public boolean equals(@Nullable Object o) {
3537
if (this == o) {
3638
return true;
3739
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Modifier;
2022
import java.lang.reflect.Type;
2123
import java.util.List;
@@ -66,11 +68,11 @@ public ClassDeclaration accept(Shuttle shuttle) {
6668
return shuttle.visit(this, members1);
6769
}
6870

69-
public <R> R accept(Visitor<R> visitor) {
71+
public <@Nullable R> R accept(Visitor<R> visitor) {
7072
return visitor.visit(this);
7173
}
7274

73-
@Override public boolean equals(Object o) {
75+
@Override public boolean equals(@Nullable Object o) {
7476
if (this == o) {
7577
return true;
7678
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclarationFinder.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

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

21+
import org.checkerframework.checker.nullness.qual.Nullable;
22+
2123
import java.lang.reflect.Constructor;
2224
import java.lang.reflect.InvocationTargetException;
2325
import java.util.ArrayList;
@@ -30,7 +32,7 @@
3032
* created for optimizing a new expression tree.
3133
*/
3234
public class ClassDeclarationFinder extends Shuttle {
33-
protected final ClassDeclarationFinder parent;
35+
protected final @Nullable ClassDeclarationFinder parent;
3436

3537
/**
3638
* The list of new final static fields to be added to the current class.
@@ -254,7 +256,7 @@ protected boolean isConstant(Iterable<? extends Expression> list) {
254256
* @param expression input expression
255257
* @return always returns null
256258
*/
257-
protected ParameterExpression findDeclaredExpression(Expression expression) {
259+
protected @Nullable ParameterExpression findDeclaredExpression(Expression expression) {
258260
return null;
259261
}
260262

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Type;
2022
import java.util.List;
2123
import java.util.Objects;
@@ -41,7 +43,7 @@ public ConditionalExpression(List<Node> expressionList, Type type) {
4143
this.expressionList = expressionList;
4244
}
4345

44-
public <R> R accept(Visitor<R> visitor) {
46+
public <@Nullable R> R accept(Visitor<R> visitor) {
4547
return visitor.visit(this);
4648
}
4749

@@ -59,7 +61,7 @@ public <R> R accept(Visitor<R> visitor) {
5961
}
6062
}
6163

62-
@Override public boolean equals(Object o) {
64+
@Override public boolean equals(@Nullable Object o) {
6365
if (this == o) {
6466
return true;
6567
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalStatement.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.util.List;
2022
import java.util.Objects;
2123

@@ -46,7 +48,7 @@ public ConditionalStatement(List<Node> expressionList) {
4648
return shuttle.visit(this, list);
4749
}
4850

49-
public <R> R accept(Visitor<R> visitor) {
51+
public <@Nullable R> R accept(Visitor<R> visitor) {
5052
return visitor.visit(this);
5153
}
5254

@@ -72,7 +74,7 @@ private static <E> E last(List<E> collection) {
7274
return collection.get(collection.size() - 1);
7375
}
7476

75-
@Override public boolean equals(Object o) {
77+
@Override public boolean equals(@Nullable Object o) {
7678
if (this == o) {
7779
return true;
7880
}

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.apache.calcite.linq4j.tree;
1818

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
import java.lang.reflect.Constructor;
2022
import java.lang.reflect.Field;
2123
import java.lang.reflect.Type;
@@ -32,9 +34,9 @@
3234
* Represents an expression that has a constant value.
3335
*/
3436
public class ConstantExpression extends Expression {
35-
public final Object value;
37+
public final @Nullable Object value;
3638

37-
public ConstantExpression(Type type, Object value) {
39+
public ConstantExpression(Type type, @Nullable Object value) {
3840
super(ExpressionType.Constant, type);
3941
this.value = value;
4042
if (value != null) {
@@ -54,15 +56,15 @@ public ConstantExpression(Type type, Object value) {
5456
}
5557
}
5658

57-
public Object evaluate(Evaluator evaluator) {
59+
public @Nullable Object evaluate(Evaluator evaluator) {
5860
return value;
5961
}
6062

6163
@Override public Expression accept(Shuttle shuttle) {
6264
return shuttle.visit(this);
6365
}
6466

65-
public <R> R accept(Visitor<R> visitor) {
67+
public <@Nullable R> R accept(Visitor<R> visitor) {
6668
return visitor.visit(this);
6769
}
6870

@@ -77,7 +79,7 @@ public <R> R accept(Visitor<R> visitor) {
7779
}
7880

7981
private static ExpressionWriter write(ExpressionWriter writer,
80-
final Object value, Type type) {
82+
final Object value, @Nullable Type type) {
8183
if (value == null) {
8284
return writer.append("null");
8385
}
@@ -328,7 +330,7 @@ private static void escapeString(StringBuilder buf, String s) {
328330
buf.append('"');
329331
}
330332

331-
@Override public boolean equals(Object o) {
333+
@Override public boolean equals(@Nullable Object o) {
332334
// REVIEW: Should constants with the same value and different type
333335
// (e.g. 3L and 3) be considered equal.
334336
if (this == o) {

linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantUntypedNull.java

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

19+
import org.checkerframework.checker.nullness.qual.Nullable;
20+
1921
/**
2022
* Represents a constant null of unknown type
2123
* Java allows type inference for such nulls, thus "null" cannot always be
@@ -36,7 +38,7 @@ private ConstantUntypedNull() {
3638
writer.append("null");
3739
}
3840

39-
@Override public boolean equals(Object o) {
41+
@Override public boolean equals(@Nullable Object o) {
4042
return o == INSTANCE;
4143
}
4244

0 commit comments

Comments
 (0)