You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ru...@apache.org on 2021/03/01 08:51:44 UTC
[calcite] branch master updated: [CALCITE-2000] UNNEST a collection
that has a field with nested data generates an Exception
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 <ru...@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() {