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 ffcfb92  [CALCITE-3829] MergeJoinEnumerator should not use inputs 
enumerators until it is really required
ffcfb92 is described below

commit ffcfb92247acbc7c50ee7812aad0060b94bafcd9
Author: rubenada <[email protected]>
AuthorDate: Fri Mar 20 11:34:01 2020 +0100

    [CALCITE-3829] MergeJoinEnumerator should not use inputs enumerators until 
it is really required
---
 .../apache/calcite/linq4j/EnumerableDefaults.java  | 43 ++++++++++++++++------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git 
a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java 
b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
index 9a7cd66..80ac509 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
@@ -2011,8 +2011,7 @@ public abstract class EnumerableDefaults {
     }
     return new AbstractEnumerable<TResult>() {
       public Enumerator<TResult> enumerator() {
-        return new MergeJoinEnumerator<>(outer.enumerator(),
-            inner.enumerator(), outerKeySelector, innerKeySelector,
+        return new MergeJoinEnumerator<>(outer, inner, outerKeySelector, 
innerKeySelector,
             extraPredicate, resultSelector);
       }
     };
@@ -3828,8 +3827,10 @@ public abstract class EnumerableDefaults {
       implements Enumerator<TResult> {
     private final List<TSource> lefts = new ArrayList<>();
     private final List<TInner> rights = new ArrayList<>();
-    private final Enumerator<TSource> leftEnumerator;
-    private final Enumerator<TInner> rightEnumerator;
+    private final Enumerable<TSource> leftEnumerable;
+    private final Enumerable<TInner> rightEnumerable;
+    private Enumerator<TSource> leftEnumerator = null;
+    private Enumerator<TInner> rightEnumerator = null;
     private final Function1<TSource, TKey> outerKeySelector;
     private final Function1<TInner, TKey> innerKeySelector;
     // extra predicate in case of non equi-join, in case of equi-join it will 
be null
@@ -3838,14 +3839,14 @@ public abstract class EnumerableDefaults {
     private boolean done;
     private Enumerator<TResult> results;
 
-    MergeJoinEnumerator(Enumerator<TSource> leftEnumerator,
-        Enumerator<TInner> rightEnumerator,
+    MergeJoinEnumerator(Enumerable<TSource> leftEnumerable,
+        Enumerable<TInner> rightEnumerable,
         Function1<TSource, TKey> outerKeySelector,
         Function1<TInner, TKey> innerKeySelector,
         Predicate2<TSource, TInner> extraPredicate,
         Function2<TSource, TInner, TResult> resultSelector) {
-      this.leftEnumerator = leftEnumerator;
-      this.rightEnumerator = rightEnumerator;
+      this.leftEnumerable = leftEnumerable;
+      this.rightEnumerable = rightEnumerable;
       this.outerKeySelector = outerKeySelector;
       this.innerKeySelector = innerKeySelector;
       this.extraPredicate = extraPredicate;
@@ -3853,9 +3854,23 @@ public abstract class EnumerableDefaults {
       start();
     }
 
+    private Enumerator<TSource> startLeftEnumerator() {
+      if (leftEnumerator == null) {
+        leftEnumerator = leftEnumerable.enumerator();
+      }
+      return leftEnumerator;
+    }
+
+    private Enumerator<TInner> startRightEnumerator() {
+      if (rightEnumerator == null) {
+        rightEnumerator = rightEnumerable.enumerator();
+      }
+      return rightEnumerator;
+    }
+
     private void start() {
-      if (!leftEnumerator.moveNext()
-          || !rightEnumerator.moveNext()
+      if (!startLeftEnumerator().moveNext()
+          || !startRightEnumerator().moveNext()
           || !advance()) {
         done = true;
         results = Linq4j.emptyEnumerator();
@@ -3978,11 +3993,17 @@ public abstract class EnumerableDefaults {
     public void reset() {
       done = false;
       leftEnumerator.reset();
-      rightEnumerator.reset();
+      if (rightEnumerator != null) {
+        rightEnumerator.reset();
+      }
       start();
     }
 
     public void close() {
+      leftEnumerator.close();
+      if (rightEnumerator != null) {
+        rightEnumerator.close();
+      }
     }
   }
 

Reply via email to