You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/08/05 22:58:21 UTC

tinkerpop git commit: Traversal.Admin.nextTravaerser() is smart about the fact if next() has been used and there is an undrained traverser in the queue. This means that we don't need hasNextTraverser() as hasNext() provides equivalent semantics. Updated

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 809d5e44d -> 08aa1bbdb


Traversal.Admin.nextTravaerser() is smart about the fact if next() has been used and there is an undrained traverser in the queue. This means that we don't need hasNextTraverser() as hasNext() provides equivalent semantics. Updated RemoteTraversal and DefaultTraversal accordingly. Added DefaultRemoteTraversaer.setBulk() as this is how decrementing works. I don't think we should actually have RemoteTraverser -- instead RemoteTraverser wraps the Traverser of the Traversal and thus, you get sack(), bulk(), etc. methods. This will also alow  us to chain RemoteTraversals across a cluster for query forwarding type stuff.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/08aa1bbd
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/08aa1bbd
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/08aa1bbd

Branch: refs/heads/TINKERPOP-1278
Commit: 08aa1bbdb57f8a837595ccffb58ab31d4f0fd1a0
Parents: 809d5e4
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Aug 5 16:58:16 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Aug 5 16:58:16 2016 -0600

----------------------------------------------------------------------
 .../traversal/AbstractRemoteTraverser.java      |  7 ++-
 .../remote/traversal/step/map/RemoteStep.java   | 13 ++---
 .../gremlin/process/traversal/Traversal.java    |  3 --
 .../traversal/step/branch/LocalStep.java        |  2 +-
 .../process/traversal/step/map/MatchStep.java   |  2 +-
 .../traversal/util/DefaultTraversal.java        | 52 ++++++++++----------
 .../tinkerpop/gremlin/driver/Handler.java       |  1 +
 .../driver/remote/DriverRemoteTraversal.java    | 45 ++++++++---------
 .../gremlin/groovy/GroovyTranslatorTest.java    |  2 +-
 9 files changed, 61 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraverser.java
index 0312523..a035516 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraverser.java
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractTra
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractRemoteTraverser<T> extends AbstractTraverser<T> implements RemoteTraverser<T> {
-    private final long bulk;
+    private long bulk;
 
     public AbstractRemoteTraverser(final T t, final long bulk) {
         super(t);
@@ -35,4 +35,9 @@ public abstract class AbstractRemoteTraverser<T> extends AbstractTraverser<T> im
     public long bulk() {
         return this.bulk;
     }
+
+    @Override
+    public void setBulk(final long bulk) {
+        this.bulk = bulk;
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
index 59d4083..99ca81e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.remote.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -40,13 +39,11 @@ public final class RemoteStep<S, E> extends AbstractStep<S, E> {
 
     private transient RemoteConnection remoteConnection;
     private RemoteTraversal<?, E> remoteTraversal;
-    private Bytecode bytecode;
 
     @SuppressWarnings("unchecked")
     public RemoteStep(final Traversal.Admin traversal, final RemoteConnection remoteConnection) {
         super(traversal);
         this.remoteConnection = remoteConnection;
-        this.bytecode = traversal.getBytecode();
     }
 
     @Override
@@ -59,14 +56,14 @@ public final class RemoteStep<S, E> extends AbstractStep<S, E> {
     protected Traverser.Admin<E> processNextStart() throws NoSuchElementException {
         if (null == this.remoteTraversal) {
             try {
-                remoteTraversal = this.remoteConnection.submit(this.bytecode);
-                this.traversal.setSideEffects(remoteTraversal.getSideEffects());
+                this.remoteTraversal = this.remoteConnection.submit(this.traversal.getBytecode());
+                this.traversal.setSideEffects(this.remoteTraversal.getSideEffects());
             } catch (final RemoteConnectionException sce) {
                 throw new IllegalStateException(sce);
             }
         }
-
-        final Traverser.Admin<E> traverser = this.remoteTraversal.nextTraverser();
-        return this.getTraversal().getTraverserGenerator().generate(traverser.get(), (Step) this, traverser.bulk());
+        return this.remoteTraversal.nextTraverser();
+        //final Traverser.Admin<E> remoteTraverser = this.remoteTraversal.nextTraverser();
+        //return this.getTraversal().getTraverserGenerator().generate(remoteTraverser.get(), (Step) this, remoteTraverser.bulk());
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index 8189e6f..eec9d3f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -464,9 +464,6 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
             return this.getEndStep().next();
         }
 
-        public default boolean hasNextTraverser() {
-            return this.getEndStep().hasNext();
-        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
index 11629a5..f0f08a5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
@@ -61,7 +61,7 @@ public final class LocalStep<S, E> extends AbstractStep<S, E> implements Travers
             this.localTraversal.addStart(this.starts.next());
         }
         while (true) {
-            if (this.localTraversal.hasNextTraverser())
+            if (this.localTraversal.hasNext())
                 return this.localTraversal.nextTraverser();
             else if (this.starts.hasNext()) {
                 this.localTraversal.reset();

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index db0f00d..fb2fdd3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -367,7 +367,7 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
             } else { // TODO: if(standardAlgorithmBarrier.isEmpty()) -- leads to consistent counts without retracting paths, but orders of magnitude slower (or make Traverser.tags an equality concept)
                 boolean stop = false;
                 for (final Traversal.Admin<?, ?> matchTraversal : this.matchTraversals) {
-                    while (matchTraversal.hasNextTraverser()) { // TODO: perhaps make MatchStep a LocalBarrierStep ??
+                    while (matchTraversal.hasNext()) { // TODO: perhaps make MatchStep a LocalBarrierStep ??
                         this.standardAlgorithmBarrier.add(matchTraversal.nextTraverser());
                         if (null == this.keepLabels || this.standardAlgorithmBarrier.size() >= PathRetractionStrategy.DEFAULT_STANDARD_BARRIER_SIZE) {
                             stop = true;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
index 9be5d50..a191ada 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
@@ -47,8 +48,7 @@ import java.util.Set;
  */
 public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
-    private E lastEnd = null;
-    private long lastEndCount = 0l;
+    private Traverser.Admin<E> lastTraverser = EmptyTraverser.instance();
     private Step<?, E> finalEndStep = EmptyStep.instance();
     private final StepPosition stepPosition = new StepPosition();
     protected transient Graph graph;
@@ -162,26 +162,38 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
+    public Traverser.Admin<E> nextTraverser() {
+        if (!this.locked) this.applyStrategies();
+        if (this.lastTraverser.bulk() > 0) {
+            final Traverser.Admin<E> temp = this.lastTraverser;
+            this.lastTraverser = EmptyTraverser.instance();
+            return temp;
+        } else {
+            return this.finalEndStep.next();
+        }
+    }
+
+    @Override
     public boolean hasNext() {
         if (!this.locked) this.applyStrategies();
-        return this.lastEndCount > 0l || this.finalEndStep.hasNext();
+        return this.lastTraverser.bulk() > 0L || this.finalEndStep.hasNext();
     }
 
     @Override
     public E next() {
         if (!this.locked) this.applyStrategies();
-        if (this.lastEndCount > 0l) {
-            this.lastEndCount--;
-            return this.lastEnd;
+        if (this.lastTraverser.bulk() > 0) {
+            this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L);
+            return this.lastTraverser.get();
         } else {
-            final Traverser<E> next = this.finalEndStep.next();
-            final long nextBulk = next.bulk();
-            if (nextBulk == 1) {
-                return next.get();
+            this.lastTraverser = this.finalEndStep.next();
+            if (this.lastTraverser.bulk() == 1) {
+                final E temp = this.lastTraverser.get();
+                this.lastTraverser = EmptyTraverser.instance();
+                return temp;
             } else {
-                this.lastEndCount = nextBulk - 1;
-                this.lastEnd = next.get();
-                return this.lastEnd;
+                this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L);
+                return this.lastTraverser.get();
             }
         }
     }
@@ -189,7 +201,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     @Override
     public void reset() {
         this.steps.forEach(Step::reset);
-        this.lastEndCount = 0l;
+        this.lastTraverser = EmptyTraverser.instance();
     }
 
     @Override
@@ -227,8 +239,6 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
             clone.unmodifiableSteps = Collections.unmodifiableList(clone.steps);
             clone.sideEffects = this.sideEffects.clone();
             clone.strategies = this.strategies;
-            clone.lastEnd = null;
-            clone.lastEndCount = 0l;
             for (final Step<?, ?> step : this.steps) {
                 final Step<?, ?> clonedStep = step.clone();
                 clonedStep.setTraversal(clone);
@@ -330,14 +340,4 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         }
         return result;
     }
-
-    @Override
-    public Traverser.Admin<E> nextTraverser() {
-        return this.finalEndStep.next();
-    }
-
-    @Override
-    public boolean hasNextTraverser() {
-        return this.finalEndStep.hasNext();
-    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
index 793f6a6..05f3035 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
@@ -241,6 +241,7 @@ final class Handler {
             } else {
                 queue.add(new Result(item));
             }
+            // TODO: queue.add(new Result(item));
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
index 3a94466..88661cf 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversal.java
@@ -26,7 +26,7 @@ import org.apache.tinkerpop.gremlin.process.remote.traversal.AbstractRemoteTrave
 import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
@@ -44,8 +44,7 @@ import java.util.function.Supplier;
 public class DriverRemoteTraversal<S, E> extends AbstractRemoteTraversal<S, E> {
 
     private final Iterator<Traverser.Admin<E>> traversers;
-    private long lastEndCount = 0;
-    private E lastEnd = null;
+    private Traverser.Admin<E> lastTraverser = EmptyTraverser.instance();
     private final RemoteTraversalSideEffects sideEffects;
 
     public DriverRemoteTraversal(final ResultSet rs, final Client client, final boolean attach, final Optional<Configuration> conf) {
@@ -68,38 +67,34 @@ public class DriverRemoteTraversal<S, E> extends AbstractRemoteTraversal<S, E> {
         return this.sideEffects;
     }
 
-    private void moveTraverserCursor() {
-        while (0 == this.lastEndCount) {
-            if (this.traversers.hasNext()) {
-                final Traverser.Admin<E> traverser = this.traversers.next();
-                this.lastEndCount = traverser.bulk();
-                this.lastEnd = traverser.get();
-            }
-        }
-    }
-
     @Override
     public boolean hasNext() {
-        this.moveTraverserCursor();
-        return 0 != this.lastEndCount;
+        return this.lastTraverser.bulk() > 0L || this.traversers.hasNext();
     }
 
-
     @Override
     public E next() {
-        this.moveTraverserCursor();
-        if (0 == this.lastEndCount) throw FastNoSuchElementException.instance();
-        return this.lastEnd;
+        if (0L == this.lastTraverser.bulk())
+            this.lastTraverser = this.traversers.next();
+        if (1L == this.lastTraverser.bulk()) {
+            final E temp = this.lastTraverser.get();
+            this.lastTraverser = EmptyTraverser.instance();
+            return temp;
+        } else {
+            this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L);
+            return this.lastTraverser.get();
+        }
     }
 
     @Override
     public Traverser.Admin<E> nextTraverser() {
-        return this.traversers.next();
-    }
-
-    @Override
-    public boolean hasNextTraverser() {
-        return this.traversers.hasNext();
+        if (0L == this.lastTraverser.bulk())
+            return this.traversers.next();
+        else {
+            final Traverser.Admin<E> temp = this.lastTraverser;
+            this.lastTraverser = EmptyTraverser.instance();
+            return temp;
+        }
     }
 
     static class TraverserIterator<E> implements Iterator<Traverser.Admin<E>> {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08aa1bbd/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
index 74d8318..9a936c1 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
@@ -55,7 +55,7 @@ public class GroovyTranslatorTest extends AbstractGremlinTest {
                 .asAdmin();
         final List<Integer> sacks = new ArrayList<>();
         final List<Integer> lengths = new ArrayList<>();
-        while (t.hasNextTraverser()) {
+        while (t.hasNext()) {
             final Traverser.Admin<Integer> traverser = t.nextTraverser();
             sacks.add(traverser.sack());
             lengths.add(traverser.get());