You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by tw...@apache.org on 2020/06/24 13:10:31 UTC

[flink] branch release-1.11 updated: [FLINK-18425][table] Convert object arrays to primitive arrays in GenericArrayData

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 <tw...@apache.org>
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