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() {