You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by da...@apache.org on 2016/10/07 14:36:51 UTC

[23/37] tinkerpop git commit: Added more javadoc and made nextTraverser() explicit.

Added more javadoc and made nextTraverser() explicit.

nextTraverser() on AbstractRemoteTraversal is now an abstract method which will make it more clear that it should be implemented. This method is instrumental to getting "remoting" to work as RemoteStep only calls that method and not next()/hasNext(). TINKERPOP-1486 CTR


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

Branch: refs/heads/TINKERPOP-1458
Commit: d43d4e01a3299f9031a2b1ac38790e67f1fe01cb
Parents: d23b971
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Oct 5 15:15:08 2016 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Oct 5 15:15:08 2016 -0400

----------------------------------------------------------------------
 .../remote/traversal/AbstractRemoteTraversal.java | 17 +++++++++++++++++
 .../process/remote/traversal/RemoteTraversal.java | 18 ++++++++++++++++++
 .../traversal/RemoteTraversalSideEffects.java     | 13 +++++++++++++
 .../remote/traversal/step/map/RemoteStep.java     |  2 --
 .../driver/remote/DriverRemoteTraversal.java      |  9 ++++++++-
 5 files changed, 56 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d43d4e01/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversal.java
index 28eeae8..0c6a7aa 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/AbstractRemoteTraversal.java
@@ -18,12 +18,16 @@
  */
 package org.apache.tinkerpop.gremlin.process.remote.traversal;
 
+import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
 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.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
@@ -32,9 +36,22 @@ import java.util.Optional;
 import java.util.Set;
 
 /**
+ * This is a stub implementation for {@link RemoteTraversal} and requires that the {@link #nextTraverser()} method
+ * is implemented from {@link Traversal.Admin}. It is this method that gets called from {@link RemoteStep} when
+ * the {@link Traversal} is iterated.
+ *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractRemoteTraversal<S,E> implements RemoteTraversal<S,E> {
+
+    /**
+     * Note that internally {@link #nextTraverser()} is called from within a loop (specifically in
+     * {@link AbstractStep#next()} that breaks properly when a {@link java.util.NoSuchElementException} is thrown. In
+     * other words the "results" should be iterated to force that failure.
+     */
+    @Override
+    public abstract Traverser.Admin<E> nextTraverser();
+
     @Override
     public Bytecode getBytecode() {
         throw new UnsupportedOperationException("Remote traversals do not support this method");

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d43d4e01/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversal.java
index 1f2ac74..9c893c2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversal.java
@@ -18,12 +18,30 @@
  */
 package org.apache.tinkerpop.gremlin.process.remote.traversal;
 
+import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 
 /**
+ * A {@link RemoteTraversal} is returned from {@link RemoteConnection#submit(Bytecode)}. It is iterated from within
+ * {@link RemoteStep} using {@link #nextTraverser()}. Implementations should typically be given a "result" from a
+ * remote source where the traversal was executed. The "result" should be an iterator which preferably has its data
+ * bulked.
+ * <p/>
+ * Note that internally {@link #nextTraverser()} is called from within a loop (specifically in
+ * {@link AbstractStep#next()} that breaks properly when a {@link java.util.NoSuchElementException} is thrown. In other
+ * words the "results" should be iterated to force that failure.
+ *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public interface RemoteTraversal<S,E> extends Traversal.Admin<S,E> {
+
+    /**
+     * Returns remote side-effects generated by the traversal so that they can accessible to the client. Note that
+     * "side-effect" refers to the value in "a" in the traversal {@code g.V().aggregate('a').values('name')}.
+     */
     @Override
     public RemoteTraversalSideEffects getSideEffects();
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d43d4e01/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversalSideEffects.java
index 97fb36d..ff16bf9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/RemoteTraversalSideEffects.java
@@ -19,11 +19,24 @@
 package org.apache.tinkerpop.gremlin.process.remote.traversal;
 
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalSideEffects;
 
 /**
+ * When a traversal is executed remotely, the ability to retrieve those side-effects (i.e. the value in "a" in the
+ * traversal {@code g.V().aggregate('a').values('name')}) can be exposed through this interface. As an example,
+ * with TinkerPop's {@code DriverRemoteConnection} that connects to Gremlin Server as a "remote", the side-effects
+ * are left on the server. The {@code RemoteTraversalSideEffects} implementation, in that case, lazily loads those
+ * side-effects when requested. Implementations should attempt to match the features of the locally processed
+ * {@link DefaultTraversalSideEffects} to keep consistency.
+ *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public interface RemoteTraversalSideEffects extends TraversalSideEffects, AutoCloseable {
+
+    /**
+     * If the "remote" that actually executed the traversal maintained resources that can be released, when the user
+     * is done with the side-effects, then this method can be used to trigger that release.
+     */
     @Override
     public default void close() throws Exception {
         //  do nothing

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d43d4e01/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 99ca81e..c21f8c8 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
@@ -63,7 +63,5 @@ public final class RemoteStep<S, E> extends AbstractStep<S, E> {
             }
         }
         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/d43d4e01/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 14d89cc..e6e1c9b 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
@@ -25,6 +25,8 @@ import org.apache.tinkerpop.gremlin.driver.ResultSet;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.AbstractRemoteTraversal;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
 import org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
 import org.apache.tinkerpop.gremlin.structure.Element;
@@ -37,7 +39,10 @@ import java.util.Optional;
 import java.util.function.Supplier;
 
 /**
- * A {@link AbstractRemoteTraversal} implementation for the Gremlin Driver.
+ * A {@link AbstractRemoteTraversal} implementation for the Gremlin Driver. This {@link Traversal} implementation is
+ * typically iterated from with {@link RemoteStep} where it the {@link #nextTraverser()} method is called. While
+ * this class provides implementations for both {@link #next()} and {@link #hasNext()} that unroll "bulked" results,
+ * those methods are not called directly from with TinkerPop remoting.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
@@ -93,6 +98,8 @@ public class DriverRemoteTraversal<S, E> extends AbstractRemoteTraversal<S, E> {
 
     @Override
     public Traverser.Admin<E> nextTraverser() {
+        // the lastTraverser is initialized as "empty" at start of iteration so the initial pass through will
+        // call next() to begin the iteration
         if (0L == this.lastTraverser.bulk())
             return this.traversers.next();
         else {