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());
}
}