fields = new ArrayList<>(len);
- if (printRowKind) {
- fields.add(row.getKind().shortString());
- }
- for (int i = 0; i < row.getArity(); i++) {
- final Object field = row.getField(i);
- final LogicalType fieldType =
- resolvedSchema.getColumnDataTypes().get(i).getLogicalType();
- if (field == null) {
- fields.add(nullColumn);
- } else {
- fields.add(
- StringUtils.arrayAwareToString(
- formattedTimestamp(field, fieldType, sessionTimeZone)));
- }
- }
- return fields.toArray(new String[0]);
- }
-
- /**
- * Normalizes field that contains TIMESTAMP, TIMESTAMP_LTZ and TIME type data.
- *
- * This method also supports nested type ARRAY, ROW, MAP.
- */
- private static Object formattedTimestamp(
- Object field, LogicalType fieldType, ZoneId sessionTimeZone) {
- final LogicalTypeRoot typeRoot = fieldType.getTypeRoot();
- if (field == null) {
- return "null";
- }
- switch (typeRoot) {
- case TIMESTAMP_WITHOUT_TIME_ZONE:
- case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
- return formatTimestampField(field, fieldType, sessionTimeZone);
- case TIME_WITHOUT_TIME_ZONE:
- return formatTimeField(field);
- case ARRAY:
- LogicalType elementType = ((ArrayType) fieldType).getElementType();
- if (field instanceof List) {
- List> array = (List>) field;
- Object[] formattedArray = new Object[array.size()];
- for (int i = 0; i < array.size(); i++) {
- formattedArray[i] =
- formattedTimestamp(array.get(i), elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass().isArray()) {
- // primitive type
- if (field.getClass() == byte[].class) {
- byte[] array = (byte[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == short[].class) {
- short[] array = (short[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == int[].class) {
- int[] array = (int[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == long[].class) {
- long[] array = (long[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == float[].class) {
- float[] array = (float[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == double[].class) {
- double[] array = (double[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == boolean[].class) {
- boolean[] array = (boolean[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else if (field.getClass() == char[].class) {
- char[] array = (char[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- } else {
- // non-primitive type
- Object[] array = (Object[]) field;
- Object[] formattedArray = new Object[array.length];
- for (int i = 0; i < array.length; i++) {
- formattedArray[i] =
- formattedTimestamp(array[i], elementType, sessionTimeZone);
- }
- return formattedArray;
- }
- } else {
- return field;
- }
- case ROW:
- if (fieldType instanceof RowType && field instanceof Row) {
- Row row = (Row) field;
- Row formattedRow = new Row(row.getKind(), row.getArity());
- for (int i = 0; i < ((RowType) fieldType).getFields().size(); i++) {
- LogicalType type = ((RowType) fieldType).getFields().get(i).getType();
- formattedRow.setField(
- i, formattedTimestamp(row.getField(i), type, sessionTimeZone));
- }
- return formattedRow;
-
- } else if (fieldType instanceof RowType && field instanceof RowData) {
- RowData rowData = (RowData) field;
- Row formattedRow = new Row(rowData.getRowKind(), rowData.getArity());
- for (int i = 0; i < ((RowType) fieldType).getFields().size(); i++) {
- LogicalType type = ((RowType) fieldType).getFields().get(i).getType();
- RowData.FieldGetter fieldGetter = RowData.createFieldGetter(type, i);
- formattedRow.setField(
- i,
- formattedTimestamp(
- fieldGetter.getFieldOrNull(rowData),
- type,
- sessionTimeZone));
- }
- return formattedRow;
- } else {
- return field;
- }
- case MAP:
- LogicalType keyType = ((MapType) fieldType).getKeyType();
- LogicalType valueType = ((MapType) fieldType).getValueType();
- if (fieldType instanceof MapType && field instanceof Map) {
- Map