You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/12/12 06:53:13 UTC

[groovy] branch master updated: Tweak processing `null` in GINQ

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

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


The following commit(s) were added to refs/heads/master by this push:
     new d421c5d  Tweak processing `null` in GINQ
d421c5d is described below

commit d421c5d14eb379fa58289ce784b333c635b65137
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Dec 12 14:52:05 2020 +0800

    Tweak processing `null` in GINQ
    
    `null = null` is `false` in SQL, but `null == null` is `true` in Groovy.
---
 .../collection/runtime/QueryableCollection.java    | 12 ++--
 .../test/org/apache/groovy/ginq/GinqTest.groovy    | 16 ++---
 .../runtime/QueryableCollectionTest.groovy         | 76 +++++++++++++++++++---
 3 files changed, 79 insertions(+), 25 deletions(-)

diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java
index a73c276..2453666 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollection.java
@@ -359,11 +359,10 @@ class QueryableCollection<T> implements Queryable<T>, Serializable {
                             }
 
                             List<Tuple2<T, U>> joinResultList =
-                                    null == p ? Collections.emptyList()
-                                                : queryable2.stream()
-                                                            .filter(c -> joiner.test(p, c))
-                                                            .map(c -> tuple((T) p, (U) c))
-                                                            .collect(Collectors.toList());
+                                    queryable2.stream()
+                                            .filter(c -> joiner.test(p, c))
+                                            .map(c -> tuple((T) p, (U) c))
+                                            .collect(Collectors.toList());
 
                             return joinResultList.isEmpty() ? Stream.of(tuple(p, null)) : joinResultList.stream();
                         });
@@ -381,8 +380,7 @@ class QueryableCollection<T> implements Queryable<T>, Serializable {
 
             // probe the hash table
             List<Tuple2<T, U>> joinResultList =
-                    null == p ? Collections.emptyList()
-                                : probeHashTable(hashTable, (T) p, fieldsExtractor1, fieldsExtractor2).collect(Collectors.toList());
+                    probeHashTable(hashTable, (T) p, fieldsExtractor1, fieldsExtractor2).collect(Collectors.toList());
 
             return joinResultList.isEmpty() ? Stream.of(tuple(p, null)) : joinResultList.stream();
         });
diff --git a/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy b/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy
index 14b19bb..69aabdf 100644
--- a/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy
+++ b/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy
@@ -1155,7 +1155,7 @@ class GinqTest {
         assertGinqScript '''
             def nums1 = [1, 2, 3, null, null]
             def nums2 = [2, 3, 4, null, null]
-            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
+            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 leftjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1168,7 +1168,7 @@ class GinqTest {
         assertGinqScript '''
             def nums1 = [1, 2, 3, null]
             def nums2 = [2, 3, 4, null, null]
-            assert [[1, null], [2, 2], [3, 3], [null, null]] == GQ {
+            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 leftjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1326,7 +1326,7 @@ class GinqTest {
         assertGinqScript '''
             def nums2 = [1, 2, 3, null, null]
             def nums1 = [2, 3, 4, null, null]
-            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
+            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 rightjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1339,7 +1339,7 @@ class GinqTest {
         assertGinqScript '''
             def nums2 = [1, 2, 3, null]
             def nums1 = [2, 3, 4, null, null]
-            assert [[null, 1], [2, 2], [3, 3], [null, null]] == GQ {
+            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 rightjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1484,7 +1484,7 @@ class GinqTest {
         assertGinqScript '''
             def nums1 = [1, 2, 3, null, null]
             def nums2 = [2, 3, 4, null, null]
-            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
+            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 lefthashjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1497,7 +1497,7 @@ class GinqTest {
         assertGinqScript '''
             def nums1 = [1, 2, 3, null]
             def nums2 = [2, 3, 4, null, null]
-            assert [[1, null], [2, 2], [3, 3], [null, null]] == GQ {
+            assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 lefthashjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1655,7 +1655,7 @@ class GinqTest {
         assertGinqScript '''
             def nums2 = [1, 2, 3, null, null]
             def nums1 = [2, 3, 4, null, null]
-            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
+            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 righthashjoin n2 in nums2 on n1 == n2
                 select n1, n2
@@ -1668,7 +1668,7 @@ class GinqTest {
         assertGinqScript '''
             def nums2 = [1, 2, 3, null]
             def nums1 = [2, 3, 4, null, null]
-            assert [[null, 1], [2, 2], [3, 3], [null, null]] == GQ {
+            assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == GQ {
                 from n1 in nums1
                 righthashjoin n2 in nums2 on n1 == n2
                 select n1, n2
diff --git a/subprojects/groovy-ginq/src/test/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollectionTest.groovy b/subprojects/groovy-ginq/src/test/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollectionTest.groovy
index 378fd97..1613556 100644
--- a/subprojects/groovy-ginq/src/test/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollectionTest.groovy
+++ b/subprojects/groovy-ginq/src/test/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableCollectionTest.groovy
@@ -64,6 +64,46 @@ class QueryableCollectionTest {
     }
 
     @Test
+    void testInnerJoin3() {
+        def nums1 = [1, 2, 3, null].stream()
+        def nums2 = [2, 3, 4].stream()
+        def result = from(nums1).innerJoin(from(nums2), (a, b) -> a == b).toList()
+        assert [[2, 2], [3, 3]] == result
+    }
+
+    @Test
+    void testInnerJoin4() {
+        def nums1 = [1, 2, 3].stream()
+        def nums2 = [2, 3, 4, null].stream()
+        def result = from(nums1).innerJoin(from(nums2), (a, b) -> a == b).toList()
+        assert [[2, 2], [3, 3]] == result
+    }
+
+    @Test
+    void testInnerJoin5() {
+        def nums1 = [1, 2, 3, null].stream()
+        def nums2 = [2, 3, 4, null].stream()
+        def result = from(nums1).innerJoin(from(nums2), (a, b) -> a == b).toList()
+        assert [[2, 2], [3, 3], [null, null]] == result
+    }
+
+    @Test
+    void testInnerJoin6() {
+        def nums1 = [1, 2, 3, null].stream()
+        def nums2 = [2, 3, 4, null, null].stream()
+        def result = from(nums1).innerJoin(from(nums2), (a, b) -> a == b).toList()
+        assert [[2, 2], [3, 3], [null, null], [null, null]] == result
+    }
+
+    @Test
+    void testInnerJoin7() {
+        def nums1 = [1, 2, 3, null, null].stream()
+        def nums2 = [2, 3, 4, null, null].stream()
+        def result = from(nums1).innerJoin(from(nums2), (a, b) -> a == b).toList()
+        assert [[2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
+    }
+
+    @Test
     void testInnerHashJoin0() {
         def nums1 = [1, 2, 3]
         def nums2 = [1, 2, 3]
@@ -112,6 +152,22 @@ class QueryableCollectionTest {
     }
 
     @Test
+    void testInnerHashJoin6() {
+        def nums1 = [1, 2, 3, null]
+        def nums2 = [2, 3, 4, null, null]
+        def result = from(nums1).innerHashJoin(from(nums2), a -> a, b -> b).toList()
+        assert [[2, 2], [3, 3], [null, null], [null, null]] == result
+    }
+
+    @Test
+    void testInnerHashJoin7() {
+        def nums1 = [1, 2, 3, null, null]
+        def nums2 = [2, 3, 4, null, null]
+        def result = from(nums1).innerHashJoin(from(nums2), a -> a, b -> b).toList()
+        assert [[2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
+    }
+
+    @Test
     void testLeftJoin0() {
         def nums1 = [1, 2, 3]
         def nums2 = [1, 2, 3]
@@ -228,7 +284,7 @@ class QueryableCollectionTest {
         def nums1 = [1, 2, 3, null, null]
         def nums2 = [2, 3, 4, null, null]
         def result = from(nums1).leftJoin(from(nums2), (a, b) -> a == b).toList()
-        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == result
+        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
     }
 
     @Test
@@ -236,7 +292,7 @@ class QueryableCollectionTest {
         def nums2 = [1, 2, 3, null, null]
         def nums1 = [2, 3, 4, null, null]
         def result = from(nums1).rightJoin(from(nums2), (a, b) -> a == b).toList()
-        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == result
+        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
     }
 
     @Test
@@ -244,7 +300,7 @@ class QueryableCollectionTest {
         def nums1 = [1, 2, 3, null]
         def nums2 = [2, 3, 4, null, null]
         def result = from(nums1).leftJoin(from(nums2), (a, b) -> a == b).toList()
-        assert [[1, null], [2, 2], [3, 3], [null, null]] == result
+        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == result
     }
 
     @Test
@@ -252,7 +308,7 @@ class QueryableCollectionTest {
         def nums2 = [1, 2, 3, null]
         def nums1 = [2, 3, 4, null, null]
         def result = from(nums1).rightJoin(from(nums2), (a, b) -> a == b).toList()
-        assert [[null, 1], [2, 2], [3, 3], [null, null]] == result
+        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == result
     }
 
     @Test
@@ -405,7 +461,7 @@ class QueryableCollectionTest {
         def nums1 = [1, 2, 3, null, null]
         def nums2 = [2, 3, 4, null, null]
         def result = from(nums1).leftHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == result
+        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
     }
 
     @Test
@@ -413,7 +469,7 @@ class QueryableCollectionTest {
         def nums2 = [1, 2, 3, null, null]
         def nums1 = [2, 3, 4, null, null]
         def result = from(nums1).rightHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == result
+        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null], [null, null], [null, null]] == result
     }
 
     @Test
@@ -421,7 +477,7 @@ class QueryableCollectionTest {
         def nums1 = [1, 2, 3, null]
         def nums2 = [2, 3, 4, null, null]
         def result = from(nums1).leftHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[1, null], [2, 2], [3, 3], [null, null]] == result
+        assert [[1, null], [2, 2], [3, 3], [null, null], [null, null]] == result
     }
 
     @Test
@@ -429,7 +485,7 @@ class QueryableCollectionTest {
         def nums2 = [1, 2, 3, null]
         def nums1 = [2, 3, 4, null, null]
         def result = from(nums1).rightHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[null, 1], [2, 2], [3, 3], [null, null]] == result
+        assert [[null, 1], [2, 2], [3, 3], [null, null], [null, null]] == result
     }
 
     @Test
@@ -469,7 +525,7 @@ class QueryableCollectionTest {
         def nums1 = [1, 2, null, 3]
         def nums2 = [2, null, 3, null, 4]
         def result = from(nums1).leftHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[1, null], [2, 2], [null, null], [3, 3]] == result
+        assert [[1, null], [2, 2], [null, null], [null, null], [3, 3]] == result
     }
 
     @Test
@@ -477,7 +533,7 @@ class QueryableCollectionTest {
         def nums2 = [1, 2, null, 3]
         def nums1 = [2, null, 3, null, 4]
         def result = from(nums1).rightHashJoin(from(nums2), a -> a, b -> b).toList()
-        assert [[null, 1], [2, 2], [null, null], [3, 3]] == result
+        assert [[null, 1], [2, 2], [null, null], [null, null], [3, 3]] == result
     }
 
     @Test