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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3cfeba8  [CALCITE-2000] UNNEST a collection that has a field with 
nested data generates an Exception
3cfeba8 is described below

commit 3cfeba8a4d3f5e0968820ba5a6571ceda191aa7f
Author: rubenada <rube...@gmail.com>
AuthorDate: Fri Feb 19 16:00:38 2021 +0000

    [CALCITE-2000] UNNEST a collection that has a field with nested data 
generates an Exception
---
 .../org/apache/calcite/runtime/SqlFunctions.java   | 47 ++++------------------
 .../test/enumerable/EnumerableUncollectTest.java   | 20 ++++++---
 2 files changed, 23 insertions(+), 44 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java 
b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
index c36f8a9..382e091 100644
--- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
+++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
@@ -2792,40 +2792,8 @@ public class SqlFunctions {
    * Function that, given a certain List containing single-item structs (i.e. 
arrays / lists with
    * a single item), builds an Enumerable that returns those single items 
inside the structs.
    */
-  public static Function1<Object, Enumerable<Comparable>> flatList() {
-    return inputObject -> {
-      final List list = (List) inputObject;
-      final Enumerator<List<Object>> enumerator = Linq4j.enumerator(list);
-      return new AbstractEnumerable<Comparable>() {
-        @Override public Enumerator<Comparable> enumerator() {
-          return new Enumerator<Comparable>() {
-
-            @Override public boolean moveNext() {
-              return enumerator.moveNext();
-            }
-
-            @Override public Comparable current() {
-              final Object element = enumerator.current();
-              final Comparable comparable;
-              if (element.getClass().isArray()) {
-                comparable = (Comparable) ((Object[]) element)[0];
-              } else {
-                comparable = (Comparable) ((List) element).get(0);
-              }
-              return comparable;
-            }
-
-            @Override public void reset() {
-              enumerator.reset();
-            }
-
-            @Override public void close() {
-              enumerator.close();
-            }
-          };
-        }
-      };
-    };
+  public static Function1<List<Object>, Enumerable<Object>> flatList() {
+    return inputList -> Linq4j.asEnumerable(inputList).select(v -> 
structAccess(v, 0, null));
   }
 
   public static Function1<Object, Enumerable<ComparableList<Comparable>>> 
flatProduct(
@@ -3038,8 +3006,8 @@ public class SqlFunctions {
    * @param <E> element type */
   private static class ProductComparableListEnumerator<E extends Comparable>
       extends CartesianProductEnumerator<List<E>, FlatLists.ComparableList<E>> 
{
-    final E[] flatElements;
-    final List<E> list;
+    final Object[] flatElements;
+    final List<Object> list;
     private final boolean withOrdinality;
     private int ordinality;
 
@@ -3047,7 +3015,7 @@ public class SqlFunctions {
         int fieldCount, boolean withOrdinality) {
       super(enumerators);
       this.withOrdinality = withOrdinality;
-      flatElements = (E[]) new Comparable[fieldCount];
+      flatElements = new Object[fieldCount];
       list = Arrays.asList(flatElements);
     }
 
@@ -3073,9 +3041,10 @@ public class SqlFunctions {
         i += a.length;
       }
       if (withOrdinality) {
-        flatElements[i] = (E) Integer.valueOf(ordinality);
+        flatElements[i] = ordinality;
       }
-      return FlatLists.ofComparable(list);
+      //noinspection unchecked
+      return (FlatLists.ComparableList) FlatLists.of(list);
     }
 
     @Override public void reset() {
diff --git 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableUncollectTest.java
 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableUncollectTest.java
index 92508c9..78f6ebf 100644
--- 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableUncollectTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableUncollectTest.java
@@ -20,10 +20,9 @@ import org.apache.calcite.config.CalciteConnectionProperty;
 import org.apache.calcite.config.Lex;
 import org.apache.calcite.test.CalciteAssert;
 
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
-/** Test for {@link EnumerableUncollect}. */
+/** Test for {@link 
org.apache.calcite.adapter.enumerable.EnumerableUncollect}. */
 class EnumerableUncollectTest {
 
   @Test void simpleUnnestArray() {
@@ -90,12 +89,23 @@ class EnumerableUncollectTest {
             "y=4; o=2");
   }
 
-  @Disabled("CALCITE-4064")
   @Test void simpleUnnestArrayOfRows4() {
-    final String sql = "select * from UNNEST(array[ROW(1, ROW(5, 10)), ROW(2, 
ROW(6, 12))])";
+    final String sql = "select * from UNNEST(array[ROW(1, ROW(5, 10)), ROW(2, 
ROW(6, 12))]) "
+        + "as T2(y, z)";
     tester()
         .query(sql)
-        .returnsUnordered("");
+        .returnsUnordered(
+            "y=1; z={5, 10}",
+            "y=2; z={6, 12}");
+  }
+
+  @Test void simpleUnnestArrayOfRows5() {
+    final String sql = "select * from UNNEST(array[ROW(ROW(3)), ROW(ROW(4))]) 
as T2(y)";
+    tester()
+        .query(sql)
+        .returnsUnordered(
+            "y={3}",
+            "y={4}");
   }
 
   @Test void chainedUnnestArray() {

Reply via email to