This is an automated email from the ASF dual-hosted git repository.
twalthr pushed a commit to branch release-1.11
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-1.11 by this push:
new a05972f [FLINK-18425][table] Convert object arrays to primitive
arrays in GenericArrayData
a05972f is described below
commit a05972f98d3b939857d0c0911f68d97186d1cada
Author: Timo Walther <[email protected]>
AuthorDate: Wed Jun 24 10:27:47 2020 +0200
[FLINK-18425][table] Convert object arrays to primitive arrays in
GenericArrayData
This closes #12762.
---
.../apache/flink/table/data/GenericArrayData.java | 57 +++++++++++++++++++---
.../flink/table/data/binary/BinaryArrayData.java | 2 +-
.../table/data/DataStructureConvertersTest.java | 12 ++++-
3 files changed, 62 insertions(+), 9 deletions(-)
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericArrayData.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericArrayData.java
index 0809012..9406056 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericArrayData.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericArrayData.java
@@ -244,39 +244,82 @@ public final class GenericArrayData implements ArrayData {
// Conversion Utilities
//
------------------------------------------------------------------------------------------
+ private boolean anyNull() {
+ for (Object element : (Object[]) array) {
+ if (element == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void checkNoNull() {
+ if (anyNull()) {
+ throw new RuntimeException("Primitive array must not
contain a null value.");
+ }
+ }
+
@Override
public boolean[] toBooleanArray() {
- return (boolean[]) array;
+ if (isPrimitiveArray) {
+ return (boolean[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Boolean[]) array);
}
@Override
public byte[] toByteArray() {
- return (byte[]) array;
+ if (isPrimitiveArray) {
+ return (byte[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Byte[]) array);
}
@Override
public short[] toShortArray() {
- return (short[]) array;
+ if (isPrimitiveArray) {
+ return (short[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Short[]) array);
}
@Override
public int[] toIntArray() {
- return (int[]) array;
+ if (isPrimitiveArray) {
+ return (int[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Integer[]) array);
}
@Override
public long[] toLongArray() {
- return (long[]) array;
+ if (isPrimitiveArray) {
+ return (long[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Long[]) array);
}
@Override
public float[] toFloatArray() {
- return (float[]) array;
+ if (isPrimitiveArray) {
+ return (float[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Float[]) array);
}
@Override
public double[] toDoubleArray() {
- return (double[]) array;
+ if (isPrimitiveArray) {
+ return (double[]) array;
+ }
+ checkNoNull();
+ return ArrayUtils.toPrimitive((Double[]) array);
}
}
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/binary/BinaryArrayData.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/binary/BinaryArrayData.java
index 40526d5..06374d0 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/binary/BinaryArrayData.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/binary/BinaryArrayData.java
@@ -434,7 +434,7 @@ public final class BinaryArrayData extends BinarySection
implements ArrayData, T
private void checkNoNull() {
if (anyNull()) {
- throw new RuntimeException("Array can not have null
value!");
+ throw new RuntimeException("Primitive array must not
contain a null value.");
}
}
diff --git
a/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/data/DataStructureConvertersTest.java
b/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/data/DataStructureConvertersTest.java
index a74517c..610d53c 100644
---
a/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/data/DataStructureConvertersTest.java
+++
b/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/data/DataStructureConvertersTest.java
@@ -198,10 +198,20 @@ public class DataStructureConvertersTest {
.convertedTo(Long.class, 123L),
TestSpec
- .forDataType(ARRAY(BOOLEAN()))
+ .forDataType(ARRAY(BOOLEAN().notNull()))
.convertedTo(boolean[].class, new
boolean[]{true, false, true, true})
.convertedTo(ArrayData.class, new
GenericArrayData(new boolean[]{true, false, true, true})),
+ TestSpec
+ .forDataType(ARRAY(BOOLEAN()))
+ .convertedTo(Boolean[].class, new
Boolean[]{true, null, true, true})
+ .convertedTo(ArrayData.class, new
GenericArrayData(new Boolean[]{true, null, true, true})),
+
+ TestSpec
+ .forDataType(ARRAY(INT().notNull()))
+ .convertedTo(int[].class, new int[]{1, 2, 3, 4})
+ .convertedTo(Integer[].class, new Integer[]{1,
2, 3, 4}),
+
// arrays of TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT,
DOUBLE are skipped for simplicity
TestSpec