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

Reply via email to