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

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


The following commit(s) were added to refs/heads/master by this push:
     new 71d1346  Support for complex schema in Samza SQL shell for describe 
command (#1101)
71d1346 is described below

commit 71d134643af7e34b8fa41425ab7978425ccf5b57
Author: Srinivasulu Punuru <[email protected]>
AuthorDate: Wed Jul 10 15:51:09 2019 -0700

    Support for complex schema in Samza SQL shell for describe command (#1101)
    
    * Support for complex schema in Samza SQL shell for describe command
    
    * Adding Udf description to UdfMetadata
    
    * Adding the returnType to the UdfMetadata
---
 .../org/apache/samza/sql/client/cli/CliShell.java  | 33 +++++++++++++++++++++-
 .../samza/sql/impl/ConfigBasedUdfResolver.java     |  4 +--
 .../apache/samza/sql/interfaces/UdfMetadata.java   | 24 ++++++++++++++--
 3 files changed, 56 insertions(+), 5 deletions(-)

diff --git 
a/samza-sql-shell/src/main/java/org/apache/samza/sql/client/cli/CliShell.java 
b/samza-sql-shell/src/main/java/org/apache/samza/sql/client/cli/CliShell.java
index a726cf1..6212d9b 100755
--- 
a/samza-sql-shell/src/main/java/org/apache/samza/sql/client/cli/CliShell.java
+++ 
b/samza-sql-shell/src/main/java/org/apache/samza/sql/client/cli/CliShell.java
@@ -19,9 +19,12 @@
 
 package org.apache.samza.sql.client.cli;
 
+import java.util.stream.Collectors;
 import org.apache.samza.sql.client.interfaces.*;
 import org.apache.samza.sql.client.util.CliException;
 import org.apache.samza.sql.client.util.CliUtil;
+import org.apache.samza.sql.schema.SamzaSqlFieldType;
+import org.apache.samza.sql.schema.SqlFieldSchema;
 import org.apache.samza.sql.schema.SqlSchema;
 import org.jline.reader.EndOfFileException;
 import org.jline.reader.LineReader;
@@ -736,7 +739,7 @@ class CliShell {
     for (int i = 0; i < rowCount; ++i) {
       SqlSchema.SqlField sqlField = schema.getFields().get(i);
       String field = sqlField.getFieldName();
-      String type = sqlField.getFieldSchema().getFieldType().toString();
+      String type = getFieldDisplayValue(sqlField.getFieldSchema());
       int fieldLen = field.length();
       int typeLen = type.length();
       int fieldStartIdx = 0, typeStartIdx = 0;
@@ -777,6 +780,34 @@ class CliShell {
     return lines;
   }
 
+  private String getFieldDisplayValue(SqlFieldSchema fieldSchema) {
+    if (!isComplexField(fieldSchema.getFieldType())) {
+      return fieldSchema.getFieldType().toString();
+    }
+    SamzaSqlFieldType fieldType = fieldSchema.getFieldType();
+    switch (fieldType) {
+      case ARRAY:
+        return String.format("ARRAY(%s)", 
getFieldDisplayValue(fieldSchema.getElementSchema()));
+      case MAP:
+        return String.format("MAP(%s, %s)", 
SamzaSqlFieldType.STRING.toString(),
+            getFieldDisplayValue(fieldSchema.getValueScehma()));
+      case ROW:
+        String rowDisplayValue = fieldSchema.getRowSchema()
+            .getFields()
+            .stream()
+            .map(f -> getFieldDisplayValue(f.getFieldSchema()))
+            .collect(Collectors.joining(","));
+        return String.format("ROW(%s)", rowDisplayValue);
+      default:
+        throw new UnsupportedOperationException("Unknown field type " + 
fieldType);
+    }
+  }
+
+  private boolean isComplexField(SamzaSqlFieldType fieldtype) {
+    return fieldtype == SamzaSqlFieldType.ARRAY || fieldtype == 
SamzaSqlFieldType.MAP
+        || fieldtype == SamzaSqlFieldType.ROW;
+  }
+
   // Trims: leading spaces; trailing spaces and ";"s
   private String trimCommand(String command) {
     if (CliUtil.isNullOrEmpty(command))
diff --git 
a/samza-sql/src/main/java/org/apache/samza/sql/impl/ConfigBasedUdfResolver.java 
b/samza-sql/src/main/java/org/apache/samza/sql/impl/ConfigBasedUdfResolver.java
index 1319a85..2b83b60 100644
--- 
a/samza-sql/src/main/java/org/apache/samza/sql/impl/ConfigBasedUdfResolver.java
+++ 
b/samza-sql/src/main/java/org/apache/samza/sql/impl/ConfigBasedUdfResolver.java
@@ -105,8 +105,8 @@ public class ConfigBasedUdfResolver implements UdfResolver {
         String udfName = sqlUdf.name();
         for (Map.Entry<SamzaSqlUdfMethod, Method> udfMethod : 
udfMethods.entrySet()) {
           List<SamzaSqlFieldType> params = 
Arrays.asList(udfMethod.getKey().params());
-          udfs.add(new UdfMetadata(udfName, udfMethod.getValue(), 
udfConfig.subset(udfName + "."), params,
-              udfMethod.getKey().disableArgumentCheck()));
+          udfs.add(new UdfMetadata(udfName, sqlUdf.description(), 
udfMethod.getValue(), udfConfig.subset(udfName + "."), params,
+              udfMethod.getKey().returns(), 
udfMethod.getKey().disableArgumentCheck()));
         }
       }
     }
diff --git 
a/samza-sql/src/main/java/org/apache/samza/sql/interfaces/UdfMetadata.java 
b/samza-sql/src/main/java/org/apache/samza/sql/interfaces/UdfMetadata.java
index 4adb5ea..9288ce7 100644
--- a/samza-sql/src/main/java/org/apache/samza/sql/interfaces/UdfMetadata.java
+++ b/samza-sql/src/main/java/org/apache/samza/sql/interfaces/UdfMetadata.java
@@ -32,20 +32,33 @@ import org.apache.samza.sql.schema.SamzaSqlFieldType;
 public class UdfMetadata {
 
   private final String name;
+
+  private final String description;
   private final Method udfMethod;
   private final Config udfConfig;
   private final boolean disableArgCheck;
   private final List<SamzaSqlFieldType> arguments;
 
-  public UdfMetadata(String name, Method udfMethod, Config udfConfig, 
List<SamzaSqlFieldType> arguments,
-      boolean disableArgCheck) {
+  private final SamzaSqlFieldType returnType;
+
+  public UdfMetadata(String name, String description, Method udfMethod, Config 
udfConfig, List<SamzaSqlFieldType> arguments,
+      SamzaSqlFieldType returnType, boolean disableArgCheck) {
     this.name = name;
+    this.description = description;
     this.udfMethod = udfMethod;
     this.udfConfig = udfConfig;
     this.arguments = arguments;
+    this.returnType = returnType;
     this.disableArgCheck = disableArgCheck;
   }
 
+  /**
+   * @return returns the returnType of the Samza SQL UDF.
+   */
+  public SamzaSqlFieldType getReturnType() {
+    return returnType;
+  }
+
   public Config getUdfConfig() {
     return udfConfig;
   }
@@ -65,6 +78,13 @@ public class UdfMetadata {
   }
 
   /**
+   * @return Returns the description of the udf.
+   */
+  public String getDescription() {
+    return description;
+  }
+
+  /**
    * @return Returns the list of arguments that the udf should take.
    */
   public List<SamzaSqlFieldType> getArguments() {

Reply via email to