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 21:58:57 UTC

tinkerpop git commit: Added Traversal.Admin.nextTraverser() and Traverasl.Admin.hasNextTraverser() as a generalized way to iterate traversers from a Traversal as opposed as to the unrolled/debulked object form. This makes a things easier for RemoteTraver

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


Added Traversal.Admin.nextTraverser() and Traverasl.Admin.hasNextTraverser() as a generalized way to iterate traversers from a Traversal as opposed as to the unrolled/debulked object form. This makes a things easier for RemoteTraversal/RemoteStep, MatchStep, BracnhStep, and LocalStep.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 809d5e44dc7e4cdb3d431554563535404311d5d1
Parents: a8ce0ad
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Aug 5 15:58:52 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Aug 5 15:58:52 2016 -0600

----------------------------------------------------------------------
 .../AbstractRemoteTraversalSideEffects.java     |  3 +-
 .../remote/traversal/step/map/RemoteStep.java   |  6 ++-
 .../gremlin/process/traversal/Traversal.java    |  8 ++++
 .../traversal/step/branch/LocalStep.java        |  4 +-
 .../process/traversal/step/map/MatchStep.java   |  4 +-
 .../traversal/util/DefaultTraversal.java        | 10 +++++
 .../driver/remote/DriverRemoteTraversal.java    | 45 ++++++++++++++++----
 .../gremlin/groovy/GroovyTranslatorTest.java    |  6 +--
 8 files changed, 67 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversalSideEffects.java
index 9da0754..ee8e179 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversalSideEffects.java
@@ -73,7 +73,8 @@ public abstract class AbstractRemoteTraversalSideEffects implements RemoteTraver
 
     @Override
     public <S> Supplier<S> getSackInitialValue() {
-        throw new UnsupportedOperationException("Remote traversals do not support this method");
+        return null;
+        // throw new UnsupportedOperationException("Remote traversals do not support this method");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 052a7bf..59d4083 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
@@ -22,6 +22,7 @@ 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;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
@@ -38,7 +39,7 @@ import java.util.NoSuchElementException;
 public final class RemoteStep<S, E> extends AbstractStep<S, E> {
 
     private transient RemoteConnection remoteConnection;
-    private RemoteTraversal<?,E> remoteTraversal;
+    private RemoteTraversal<?, E> remoteTraversal;
     private Bytecode bytecode;
 
     @SuppressWarnings("unchecked")
@@ -65,6 +66,7 @@ public final class RemoteStep<S, E> extends AbstractStep<S, E> {
             }
         }
 
-        return (Traverser.Admin<E>) this.remoteTraversal.next();
+        final Traverser.Admin<E> traverser = this.remoteTraversal.nextTraverser();
+        return this.getTraversal().getTraverserGenerator().generate(traverser.get(), (Step) this, traverser.bulk());
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 8694e1b..8189e6f 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
@@ -459,6 +459,14 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
             }
             return false;
         }
+
+        public default Traverser.Admin<E> nextTraverser() {
+            return this.getEndStep().next();
+        }
+
+        public default boolean hasNextTraverser() {
+            return this.getEndStep().hasNext();
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 e2affd4..11629a5 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,8 +61,8 @@ public final class LocalStep<S, E> extends AbstractStep<S, E> implements Travers
             this.localTraversal.addStart(this.starts.next());
         }
         while (true) {
-            if (this.localTraversal.hasNext())
-                return this.localTraversal.getEndStep().next();
+            if (this.localTraversal.hasNextTraverser())
+                return this.localTraversal.nextTraverser();
             else if (this.starts.hasNext()) {
                 this.localTraversal.reset();
                 this.localTraversal.addStart(this.starts.next());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 8909d68..db0f00d 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,8 +367,8 @@ 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.hasNext()) { // TODO: perhaps make MatchStep a LocalBarrierStep ??
-                        this.standardAlgorithmBarrier.add(matchTraversal.getEndStep().next());
+                    while (matchTraversal.hasNextTraverser()) { // 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;
                             break;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 280434c..9be5d50 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
@@ -330,4 +330,14 @@ 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/809d5e44/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 7cf5747..3a94466 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
@@ -23,9 +23,10 @@ import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Result;
 import org.apache.tinkerpop.gremlin.driver.ResultSet;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.AbstractRemoteTraversal;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraversalSideEffects;
 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.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
@@ -40,9 +41,11 @@ import java.util.function.Supplier;
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class DriverRemoteTraversal<S,E> extends AbstractRemoteTraversal<S,E> {
+public class DriverRemoteTraversal<S, E> extends AbstractRemoteTraversal<S, E> {
 
-    private final Iterator<Traverser.Admin<E>> resultIterator;
+    private final Iterator<Traverser.Admin<E>> traversers;
+    private long lastEndCount = 0;
+    private E lastEnd = null;
     private final RemoteTraversalSideEffects sideEffects;
 
     public DriverRemoteTraversal(final ResultSet rs, final Client client, final boolean attach, final Optional<Configuration> conf) {
@@ -52,27 +55,51 @@ public class DriverRemoteTraversal<S,E> extends AbstractRemoteTraversal<S,E> {
         if (attach) {
             if (!conf.isPresent()) throw new IllegalStateException("Traverser can't be reattached for testing");
             final Graph graph = ((Supplier<Graph>) conf.get().getProperty("hidden.for.testing.only")).get();
-            resultIterator = new AttachingTraverserIterator<>(rs.iterator(), graph);
+            this.traversers = new AttachingTraverserIterator<>(rs.iterator(), graph);
         } else {
-            resultIterator = new TraverserIterator<>(rs.iterator());
+            this.traversers = new TraverserIterator<>(rs.iterator());
         }
 
-        sideEffects = new DriverRemoteTraversalSideEffects(client, rs.getOriginalRequestMessage().getRequestId());
+        this.sideEffects = new DriverRemoteTraversalSideEffects(client, rs.getOriginalRequestMessage().getRequestId());
     }
 
     @Override
     public RemoteTraversalSideEffects getSideEffects() {
-        return sideEffects;
+        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() {
-        return resultIterator.hasNext();
+        this.moveTraverserCursor();
+        return 0 != this.lastEndCount;
     }
 
+
     @Override
     public E next() {
-        return (E) resultIterator.next();
+        this.moveTraverserCursor();
+        if (0 == this.lastEndCount) throw FastNoSuchElementException.instance();
+        return this.lastEnd;
+    }
+
+    @Override
+    public Traverser.Admin<E> nextTraverser() {
+        return this.traversers.next();
+    }
+
+    @Override
+    public boolean hasNextTraverser() {
+        return this.traversers.hasNext();
     }
 
     static class TraverserIterator<E> implements Iterator<Traverser.Admin<E>> {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/809d5e44/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 f03c287..74d8318 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,8 +55,8 @@ public class GroovyTranslatorTest extends AbstractGremlinTest {
                 .asAdmin();
         final List<Integer> sacks = new ArrayList<>();
         final List<Integer> lengths = new ArrayList<>();
-        while (t.hasNext()) {
-            final Traverser.Admin<Integer> traverser = t.getEndStep().next();
+        while (t.hasNextTraverser()) {
+            final Traverser.Admin<Integer> traverser = t.nextTraverser();
             sacks.add(traverser.sack());
             lengths.add(traverser.get());
         }
@@ -83,6 +83,6 @@ public class GroovyTranslatorTest extends AbstractGremlinTest {
 
     @Test
     public void shouldHaveValidToString() {
-        assertEquals("translator[h:gremlin-groovy]", GroovyTranslator.of("h","__").toString());
+        assertEquals("translator[h:gremlin-groovy]", GroovyTranslator.of("h", "__").toString());
     }
 }