You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by ro...@apache.org on 2020/06/16 00:41:36 UTC

[beam] branch master updated: Add zetaSqlValueToJavaObject() with unknown target type

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 8e74c0b  Add zetaSqlValueToJavaObject() with unknown target type
     new 232c878  Merge pull request #11957 from robinyqiu/fixit
8e74c0b is described below

commit 8e74c0bd165da9d458d9f56f7f504b8fbaa2742d
Author: Yueyang Qiu <ro...@gmail.com>
AuthorDate: Thu Jun 11 23:26:55 2020 -0700

    Add zetaSqlValueToJavaObject() with unknown target type
---
 .../sdk/extensions/sql/zetasql/ZetaSqlUtils.java   | 50 +++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSqlUtils.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSqlUtils.java
index b041b18..28340e9 100644
--- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSqlUtils.java
+++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSqlUtils.java
@@ -196,7 +196,55 @@ public final class ZetaSqlUtils {
     }
   }
 
-  // Value conversion: ZetaSQL => Beam
+  // Type conversion: ZetaSQL => Beam
+  public static FieldType zetaSqlTypeToBeamFieldType(Type type) {
+    switch (type.getKind()) {
+      case TYPE_INT64:
+        return FieldType.INT64.withNullable(true);
+      case TYPE_DOUBLE:
+        return FieldType.DOUBLE.withNullable(true);
+      case TYPE_BOOL:
+        return FieldType.BOOLEAN.withNullable(true);
+      case TYPE_STRING:
+        return FieldType.STRING.withNullable(true);
+      case TYPE_BYTES:
+        return FieldType.BYTES.withNullable(true);
+      case TYPE_DATE:
+        return FieldType.logicalType(SqlTypes.DATE).withNullable(true);
+      case TYPE_TIMESTAMP:
+        return FieldType.DATETIME.withNullable(true);
+      case TYPE_ARRAY:
+        return zetaSqlElementTypeToBeamArrayType(type.asArray().getElementType());
+      case TYPE_STRUCT:
+        return zetaSqlStructTypeToBeamRowType(type.asStruct());
+      default:
+        throw new UnsupportedOperationException("Unknown ZetaSQL type: " + type.getKind());
+    }
+  }
+
+  private static FieldType zetaSqlElementTypeToBeamArrayType(Type elementType) {
+    return FieldType.array(zetaSqlTypeToBeamFieldType(elementType)).withNullable(true);
+  }
+
+  private static FieldType zetaSqlStructTypeToBeamRowType(StructType structType) {
+    return FieldType.row(
+            structType.getFieldList().stream()
+                .map(ZetaSqlUtils::zetaSqlStructFieldToBeamField)
+                .collect(Schema.toSchema()))
+        .withNullable(true);
+  }
+
+  private static Field zetaSqlStructFieldToBeamField(StructField structField) {
+    return Field.of(structField.getName(), zetaSqlTypeToBeamFieldType(structField.getType()));
+  }
+
+  // Value conversion: ZetaSQL => Beam (target Beam type unknown)
+  public static Object zetaSqlValueToJavaObject(Value value, boolean verifyValues) {
+    return zetaSqlValueToJavaObject(
+        value, zetaSqlTypeToBeamFieldType(value.getType()), verifyValues);
+  }
+
+  // Value conversion: ZetaSQL => Beam (target Beam type known)
   public static Object zetaSqlValueToJavaObject(
       Value value, FieldType fieldType, boolean verifyValues) {
     if (value.isNull()) {