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/05/05 06:28:21 UTC

[flink] branch master updated: [FLINK-17489][core] Support any kind of array in StringUtils.arrayAwareToString()

This is an automated email from the ASF dual-hosted git repository.

twalthr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 7b2f000  [FLINK-17489][core] Support any kind of array in StringUtils.arrayAwareToString()
7b2f000 is described below

commit 7b2f000da12d719752444544c37933e53b41d573
Author: Timo Walther <tw...@apache.org>
AuthorDate: Fri May 1 13:03:14 2020 +0200

    [FLINK-17489][core] Support any kind of array in StringUtils.arrayAwareToString()
    
    This closes #11969.
---
 .../java/org/apache/flink/util/StringUtils.java    | 78 ++--------------------
 .../org/apache/flink/util/StringUtilsTest.java     | 32 +++++----
 .../apache/flink/table/data/GenericRowData.java    |  4 +-
 .../table/expressions/ValueLiteralExpression.java  |  4 +-
 .../apache/flink/table/utils/EncodingUtils.java    |  6 --
 .../org/apache/flink/table/utils/PrintUtils.java   | 10 +--
 .../planner/runtime/stream/sql/FunctionITCase.java |  4 +-
 .../flink/table/planner/utils/RowDataTestUtil.java |  4 +-
 .../table/planner/runtime/utils/TestSinkUtil.scala |  6 +-
 .../flink/table/data/BoxedWrapperRowData.java      |  4 +-
 10 files changed, 42 insertions(+), 110 deletions(-)

diff --git a/flink-core/src/main/java/org/apache/flink/util/StringUtils.java b/flink-core/src/main/java/org/apache/flink/util/StringUtils.java
index 397c5a9..fa591d3 100644
--- a/flink-core/src/main/java/org/apache/flink/util/StringUtils.java
+++ b/flink-core/src/main/java/org/apache/flink/util/StringUtils.java
@@ -101,82 +101,14 @@ public final class StringUtils {
 	}
 
 	/**
-	 * This method calls {@link Object#toString()} on the given object, unless the
-	 * object is an array. In that case, it will use the {@link #arrayToString(Object)}
-	 * method to create a string representation of the array that includes all contained
-	 * elements.
+	 * Converts the given object into a string representation by calling {@link Object#toString()}
+	 * and formatting (possibly nested) arrays and {@code null}.
 	 *
-	 * @param o The object for which to create the string representation.
-	 * @return The string representation of the object.
+	 * <p>See {@link Arrays#deepToString(Object[])} for more information about the used format.
 	 */
 	public static String arrayAwareToString(Object o) {
-		if (o == null) {
-			return "null";
-		}
-		if (o.getClass().isArray()) {
-			return arrayToString(o);
-		}
-
-		return o.toString();
-	}
-
-	/**
-	 * Returns a string representation of the given array. This method takes an Object
-	 * to allow also all types of primitive type arrays.
-	 *
-	 * @param array The array to create a string representation for.
-	 * @return The string representation of the array.
-	 * @throws IllegalArgumentException If the given object is no array.
-	 */
-	public static String arrayToString(Object array) {
-		if (array == null) {
-			throw new NullPointerException();
-		}
-
-		if (array instanceof int[]) {
-			return Arrays.toString((int[]) array);
-		}
-		if (array instanceof long[]) {
-			return Arrays.toString((long[]) array);
-		}
-		// for array of byte array
-		if (array instanceof byte[][]) {
-			byte[][] b = (byte[][]) array;
-			String[] strs = new String[b.length];
-
-			for (int i = 0; i < b.length; i++) {
-				strs[i] = Arrays.toString(b[i]);
-			}
-
-			return Arrays.toString(strs);
-		}
-		if (array instanceof byte[]) {
-			return Arrays.toString((byte[]) array);
-		}
-		if (array instanceof double[]) {
-			return Arrays.toString((double[]) array);
-		}
-		if (array instanceof float[]) {
-			return Arrays.toString((float[]) array);
-		}
-		if (array instanceof boolean[]) {
-			return Arrays.toString((boolean[]) array);
-		}
-		if (array instanceof char[]) {
-			return Arrays.toString((char[]) array);
-		}
-		if (array instanceof short[]) {
-			return Arrays.toString((short[]) array);
-		}
-		if (array instanceof Object[]) {
-			return Arrays.toString((Object[]) array);
-		}
-
-		if (array.getClass().isArray()) {
-			return "<unknown array type>";
-		} else {
-			throw new IllegalArgumentException("The given argument is no array.");
-		}
+		final String arrayString = Arrays.deepToString(new Object[]{o});
+		return arrayString.substring(1, arrayString.length() - 1);
 	}
 
 	/**
diff --git a/flink-core/src/test/java/org/apache/flink/util/StringUtilsTest.java b/flink-core/src/test/java/org/apache/flink/util/StringUtilsTest.java
index 6e61711..237694e 100644
--- a/flink-core/src/test/java/org/apache/flink/util/StringUtilsTest.java
+++ b/flink-core/src/test/java/org/apache/flink/util/StringUtilsTest.java
@@ -20,6 +20,7 @@ package org.apache.flink.util;
 
 import org.junit.Test;
 
+import java.time.DayOfWeek;
 import java.util.Random;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -39,21 +40,26 @@ public class StringUtilsTest extends TestLogger {
 	}
 
 	@Test
-	public void testArrayOfBytesArray() {
-		byte[][] expectedArray = new byte[][]{
-			{1, -97, 49, 74 },
-			{2, -92, 48, 73 }
-		};
+	public void testArrayAwareToString() {
+		assertEquals(
+			"null",
+			StringUtils.arrayAwareToString(null));
 
-		String controlString = StringUtils.arrayToString(expectedArray);
-		assertEquals("[[1, -97, 49, 74], [2, -92, 48, 73]]", controlString);
-	}
+		assertEquals(
+			"MONDAY",
+			StringUtils.arrayAwareToString(DayOfWeek.MONDAY));
 
-	@Test
-	public void testArrayToString() {
-		double[] array = {1.0};
-		String controlString = StringUtils.arrayToString(array);
-		assertEquals("[1.0]", controlString);
+		assertEquals(
+			"[1, 2, 3]",
+			StringUtils.arrayAwareToString(new int[]{1, 2, 3}));
+
+		assertEquals(
+			"[[4, 5, 6], null, []]",
+			StringUtils.arrayAwareToString(new byte[][]{{4, 5, 6}, null, {}}));
+
+		assertEquals(
+			"[[4, 5, 6], null, MONDAY]",
+			StringUtils.arrayAwareToString(new Object[]{new Integer[]{4, 5, 6}, null, DayOfWeek.MONDAY}));
 	}
 
 	@Test
diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericRowData.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericRowData.java
index 6affdce..157a790 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericRowData.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/data/GenericRowData.java
@@ -21,8 +21,8 @@ package org.apache.flink.table.data;
 import org.apache.flink.annotation.PublicEvolving;
 import org.apache.flink.table.types.logical.RowType;
 import org.apache.flink.table.types.logical.StructuredType;
-import org.apache.flink.table.utils.EncodingUtils;
 import org.apache.flink.types.RowKind;
+import org.apache.flink.util.StringUtils;
 
 import java.util.Arrays;
 
@@ -212,7 +212,7 @@ public final class GenericRowData implements RowData {
 			if (i != 0) {
 				sb.append(",");
 			}
-			sb.append(EncodingUtils.objectToString(fields[i]));
+			sb.append(StringUtils.arrayAwareToString(fields[i]));
 		}
 		sb.append(")");
 		return sb.toString();
diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
index e6edbd2..153f2af 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
@@ -25,8 +25,8 @@ import org.apache.flink.table.types.inference.CallContext;
 import org.apache.flink.table.types.logical.LogicalType;
 import org.apache.flink.table.types.logical.LogicalTypeFamily;
 import org.apache.flink.table.types.utils.ValueDataTypeConverter;
-import org.apache.flink.table.utils.EncodingUtils;
 import org.apache.flink.util.Preconditions;
+import org.apache.flink.util.StringUtils;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -311,6 +311,6 @@ public final class ValueLiteralExpression implements ResolvedExpression {
 		} else if (value instanceof String) {
 			return "'" + ((String) value).replace("'", "''") + "'";
 		}
-		return EncodingUtils.objectToString(value);
+		return StringUtils.arrayAwareToString(value);
 	}
 }
diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/EncodingUtils.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/EncodingUtils.java
index ca88427..351ee3e 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/EncodingUtils.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/EncodingUtils.java
@@ -29,7 +29,6 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
 import java.util.Base64;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
@@ -145,11 +144,6 @@ public abstract class EncodingUtils {
 		return new String(hexChars);
 	}
 
-	public static String objectToString(Object object) {
-		final String arrayString = Arrays.deepToString(new Object[]{object});
-		return arrayString.substring(1, arrayString.length() - 1);
-	}
-
 	// --------------------------------------------------------------------------------------------
 	// Java String Repetition
 	//
diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/PrintUtils.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/PrintUtils.java
index 45e4d6e..a3510da 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/PrintUtils.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/utils/PrintUtils.java
@@ -22,10 +22,10 @@ import org.apache.flink.annotation.Internal;
 import org.apache.flink.table.api.TableColumn;
 import org.apache.flink.table.api.TableSchema;
 import org.apache.flink.types.Row;
+import org.apache.flink.util.StringUtils;
 
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.lang.UProperty;
-import org.apache.commons.lang3.StringUtils;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -106,7 +106,7 @@ public class PrintUtils {
 			if (field == null) {
 				fields[i] = NULL_COLUMN;
 			} else {
-				fields[i] = EncodingUtils.objectToString(field);
+				fields[i] = StringUtils.arrayAwareToString(field);
 			}
 		}
 		return fields;
@@ -135,7 +135,7 @@ public class PrintUtils {
 		StringBuilder sb = new StringBuilder();
 		sb.append("+");
 		for (int width : colWidths) {
-			sb.append(StringUtils.repeat('-', width + 1));
+			sb.append(EncodingUtils.repeat('-', width + 1));
 			sb.append("-+");
 		}
 		return sb.toString();
@@ -149,7 +149,7 @@ public class PrintUtils {
 			sb.append(" ");
 			int displayWidth = getStringDisplayWidth(col);
 			if (displayWidth <= colWidths[idx]) {
-				sb.append(StringUtils.repeat(' ', colWidths[idx] - displayWidth));
+				sb.append(EncodingUtils.repeat(' ', colWidths[idx] - displayWidth));
 				sb.append(col);
 			} else {
 				sb.append(truncateString(col, colWidths[idx] - COLUMN_TRUNCATED_FLAG.length()));
@@ -180,7 +180,7 @@ public class PrintUtils {
 		// pad with ' ' before the column
 		int lackedWidth = targetWidth - getStringDisplayWidth(substring);
 		if (lackedWidth > 0) {
-			substring = StringUtils.repeat(' ', lackedWidth) + substring;
+			substring = EncodingUtils.repeat(' ', lackedWidth) + substring;
 		}
 		return substring;
 	}
diff --git a/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/runtime/stream/sql/FunctionITCase.java b/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/runtime/stream/sql/FunctionITCase.java
index bea50e1..c01ed29 100644
--- a/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/runtime/stream/sql/FunctionITCase.java
+++ b/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/runtime/stream/sql/FunctionITCase.java
@@ -39,8 +39,8 @@ import org.apache.flink.table.types.DataType;
 import org.apache.flink.table.types.inference.TypeInference;
 import org.apache.flink.table.types.inference.TypeStrategies;
 import org.apache.flink.table.types.logical.RawType;
-import org.apache.flink.table.utils.EncodingUtils;
 import org.apache.flink.types.Row;
+import org.apache.flink.util.StringUtils;
 
 import org.junit.Test;
 
@@ -865,7 +865,7 @@ public class FunctionITCase extends StreamingTestBase {
 	 */
 	public static class ComplexScalarFunction extends ScalarFunction {
 		public String eval(@DataTypeHint(inputGroup = InputGroup.ANY) Object o, java.sql.Timestamp t) {
-			return EncodingUtils.objectToString(o) + "+" + t.toString();
+			return StringUtils.arrayAwareToString(o) + "+" + t.toString();
 		}
 
 		public @DataTypeHint("DECIMAL(5, 2)") BigDecimal eval() {
diff --git a/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/utils/RowDataTestUtil.java b/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/utils/RowDataTestUtil.java
index 8fc2dc8..17dc15d 100644
--- a/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/utils/RowDataTestUtil.java
+++ b/flink-table/flink-table-planner-blink/src/test/java/org/apache/flink/table/planner/utils/RowDataTestUtil.java
@@ -26,7 +26,7 @@ import org.apache.flink.table.runtime.types.InternalSerializers;
 import org.apache.flink.table.runtime.typeutils.RowDataTypeInfo;
 import org.apache.flink.table.types.logical.LogicalType;
 import org.apache.flink.table.types.logical.RowType;
-import org.apache.flink.table.utils.EncodingUtils;
+import org.apache.flink.util.StringUtils;
 
 import java.sql.Date;
 import java.sql.Time;
@@ -54,7 +54,7 @@ public class RowDataTestUtil {
 			// TODO support after FLINK-11898 is merged
 			throw new UnsupportedOperationException();
 		} else {
-			return EncodingUtils.objectToString(field);
+			return StringUtils.arrayAwareToString(field);
 		}
 	}
 
diff --git a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/runtime/utils/TestSinkUtil.scala b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/runtime/utils/TestSinkUtil.scala
index a9fdee8..aca6696 100644
--- a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/runtime/utils/TestSinkUtil.scala
+++ b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/runtime/utils/TestSinkUtil.scala
@@ -27,12 +27,12 @@ import org.apache.flink.table.runtime.types.TypeInfoLogicalTypeConverter
 import org.apache.flink.table.sinks.TableSink
 import org.apache.flink.table.utils.EncodingUtils
 import org.apache.flink.types.Row
-
 import org.apache.calcite.avatica.util.DateTimeUtils
-
 import java.sql.{Date, Time, Timestamp}
 import java.util.{Calendar, TimeZone}
 
+import org.apache.flink.util.StringUtils
+
 import scala.collection.JavaConverters._
 
 object TestSinkUtil {
@@ -58,7 +58,7 @@ object TestSinkUtil {
     field match {
       case _: Date | _: Time | _: Timestamp =>
         unixDateTimeToString(field, tz)
-      case _ => EncodingUtils.objectToString(field)
+      case _ => StringUtils.arrayAwareToString(field)
     }
   }
 
diff --git a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/BoxedWrapperRowData.java b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/BoxedWrapperRowData.java
index 9ad4983..bfcea0a 100644
--- a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/BoxedWrapperRowData.java
+++ b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/BoxedWrapperRowData.java
@@ -19,7 +19,6 @@
 package org.apache.flink.table.data;
 
 import org.apache.flink.table.data.binary.TypedSetters;
-import org.apache.flink.table.utils.EncodingUtils;
 import org.apache.flink.types.BooleanValue;
 import org.apache.flink.types.ByteValue;
 import org.apache.flink.types.DoubleValue;
@@ -28,6 +27,7 @@ import org.apache.flink.types.IntValue;
 import org.apache.flink.types.LongValue;
 import org.apache.flink.types.RowKind;
 import org.apache.flink.types.ShortValue;
+import org.apache.flink.util.StringUtils;
 
 import java.util.Arrays;
 
@@ -255,7 +255,7 @@ public class BoxedWrapperRowData implements RowData, TypedSetters {
 			if (i != 0) {
 				sb.append(",");
 			}
-			sb.append(EncodingUtils.objectToString(fields[i]));
+			sb.append(StringUtils.arrayAwareToString(fields[i]));
 		}
 		sb.append(")");
 		return sb.toString();