Fixed up TraversalOpProcessor to use HaltedTraversalStrategy to decide 
detachement with ReferenceFactory being the default (as before). This allowed 
me to open uup a bunch more OPT_OUT tests on RemoteGraph.


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

Branch: refs/heads/TINKERPOP-1254
Commit: 408755de33de1eb23441347ac6bbe0b084828d9c
Parents: 2eafeef
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Tue Jun 21 11:43:14 2016 -0600
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Tue Jun 21 12:06:24 2016 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../gremlin/process/remote/RemoteGraph.java     | 20 ++++++++-----------
 .../decoration/HaltedTraverserStrategy.java     |  8 +++++---
 .../driver/remote/DriverRemoteConnection.java   |  3 ++-
 .../op/traversal/TraversalOpProcessor.java      | 21 ++++++++++++--------
 5 files changed, 29 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/408755de/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index ea940a8..1ba08d4 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ 
image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
 TinkerPop 3.2.1 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* `TraversalOpProcessor` (`RemoteConnection`) uses `HaltedTraverserStrategy` 
metadata to determine detachment procedure prior to returning results.
 * Allow DFS paths in `HADOOP_GREMLIN_LIBS`.
 * Added a safer serializer infrastructure for use with `SparkGraphComputer` 
that uses `KryoSerializer` and the new `GryoRegistrator`.
 * Added `HaltedTraverserStrategy` to allow users to get back different element 
detachments in OLAP.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/408755de/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
index f46fe90..590398e 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
@@ -46,6 +46,10 @@ import java.util.Iterator;
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_COMPUTER)
 @Graph.OptOut(
+        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest$Traversals",
+        method = "g_withSideEffectXa_g_VX2XX_VX1X_out_whereXneqXaXX",
+        reason = "RemoteGraph can not handle a sideEffect that is spawned by a 
traversal")
+@Graph.OptOut(
         test = 
"org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest",
         method = "shouldNeverPropagateANoBulkTraverser",
         reason = "RemoteGraph can't serialize a lambda so the test fails 
before it has a chance for the Traversal to be evaluated")
@@ -54,6 +58,10 @@ import java.util.Iterator;
         method = "shouldNeverPropagateANullValuedTraverser",
         reason = "RemoteGraph can't serialize a lambda so the test fails 
before it has a chance for the Traversal to be evaluated")
 @Graph.OptOut(
+        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.map.ProgramTest",
+        method = "*",
+        reason = "RemoteGraph retrieves detached vertices that can't be 
attached to a remote OLAP graph")
+@Graph.OptOut(
         test = 
"org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategyProcessTest",
         method = "*",
         reason = "RemoteGraph does not support ElementIdStrategy at this time 
- it requires a lambda in construction which is not serializable")
@@ -66,18 +74,6 @@ import java.util.Iterator;
         method = "*",
         reason = "RemoteGraph does not support PartitionStrategy at this time")
 @Graph.OptOut(
-        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.map.PeerPressureTest",
-        method = "g_V_peerPressure",
-        reason = "RemoteGraph retrieves detached vertices that can't be 
attached to a remote OLAP graph")
-@Graph.OptOut(
-        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.map.PageRankTest",
-        method = "g_V_pageRank",
-        reason = "RemoteGraph retrieves detached vertices that can't be 
attached to a remote OLAP graph")
-@Graph.OptOut(
-        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.map.ProgramTest",
-        method = "g_V_programXpageRankX",
-        reason = "RemoteGraph retrieves detached vertices that can't be 
attached to a remote OLAP graph")
-@Graph.OptOut(
         test = 
"org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgramTest",
         method = "*",
         reason = "RemoteGraph does not support direct Graph.compute() access")

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/408755de/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
index 45966f0..1a2c207 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
@@ -32,11 +32,13 @@ import 
org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
 public final class HaltedTraverserStrategy extends 
AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements 
TraversalStrategy.DecorationStrategy {
 
     private final Class haltedTraverserFactory;
+    private final boolean useReference;
 
     private HaltedTraverserStrategy(final Class haltedTraverserFactory) {
-        if (haltedTraverserFactory.equals(DetachedFactory.class) || 
haltedTraverserFactory.equals(ReferenceFactory.class))
+        if (haltedTraverserFactory.equals(DetachedFactory.class) || 
haltedTraverserFactory.equals(ReferenceFactory.class)) {
             this.haltedTraverserFactory = haltedTraverserFactory;
-        else
+            this.useReference = 
ReferenceFactory.class.equals(this.haltedTraverserFactory);
+        } else
             throw new IllegalArgumentException("The provided traverser 
detachment factory is unknown: " + haltedTraverserFactory);
     }
 
@@ -49,7 +51,7 @@ public final class HaltedTraverserStrategy extends 
AbstractTraversalStrategy<Tra
     }
 
     public <R> Traverser.Admin<R> halt(final Traverser.Admin<R> traverser) {
-        if (ReferenceFactory.class.equals(this.haltedTraverserFactory))
+        if (this.useReference)
             traverser.set(ReferenceFactory.detach(traverser.get()));
         else
             traverser.set(DetachedFactory.detach(traverser.get(), true));

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/408755de/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
----------------------------------------------------------------------
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
index a6303a6..2bea54b 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
@@ -22,6 +22,7 @@ import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.Result;
+import 
org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
@@ -160,7 +161,7 @@ public class DriverRemoteConnection implements 
RemoteConnection {
     @Override
     public <E> Iterator<Traverser.Admin<E>> submit(final Traversal<?, E> t) 
throws RemoteConnectionException {
         try {
-            if (attachElements) {
+            if (attachElements && 
!t.asAdmin().getStrategies().toList().stream().filter(s -> s instanceof 
VertexProgramStrategy).findAny().isPresent()) {
                 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();
                 return new 
AttachingTraverserIterator<>(client.submit(t).iterator(), graph);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/408755de/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
----------------------------------------------------------------------
diff --git 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
index bdb692d..8bff220 100644
--- 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
+++ 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
@@ -28,6 +28,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
 import org.apache.tinkerpop.gremlin.server.Context;
 import org.apache.tinkerpop.gremlin.server.GraphManager;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
@@ -45,7 +46,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeoutException;
 
 import static com.codahale.metrics.MetricRegistry.name;
@@ -127,7 +127,7 @@ public class TraversalOpProcessor extends 
AbstractOpProcessor {
         // earlier validation in selection of this op method should free us to 
cast this without worry
         final Map<String, String> aliases = (Map<String, String>) 
msg.optionalArgs(Tokens.ARGS_ALIASES).get();
 
-        final Traversal.Admin<?,?> traversal;
+        final Traversal.Admin<?, ?> traversal;
         try {
             traversal = (Traversal.Admin) 
Serializer.deserializeObject(serializedTraversal);
         } catch (Exception ex) {
@@ -158,7 +158,7 @@ public class TraversalOpProcessor extends 
AbstractOpProcessor {
                     try {
                         // compile the traversal - without it getEndStep() has 
nothing in it
                         traversal.applyStrategies();
-                        handleIterator(context, new 
DetachingIterator<>(traversal.getEndStep()));
+                        handleIterator(context, new 
DetachingIterator<>(traversal));
                     } catch (TimeoutException ex) {
                         final String errorMessage = String.format("Response 
iteration exceeded the configured threshold for request [%s] - %s", 
msg.getRequestId(), ex.getMessage());
                         logger.warn(errorMessage);
@@ -200,19 +200,24 @@ public class TraversalOpProcessor extends 
AbstractOpProcessor {
     static class DetachingIterator<E> implements Iterator<Traverser.Admin<E>> {
 
         private Iterator<Traverser.Admin<E>> inner;
-
-        public DetachingIterator(final Iterator<Traverser.Admin<E>> toDetach) {
-            inner = toDetach;
+        private HaltedTraverserStrategy haltedTraverserStrategy;
+
+        public DetachingIterator(final Traversal.Admin<?, E> traversal) {
+            this.inner = traversal.getEndStep();
+            this.haltedTraverserStrategy = (HaltedTraverserStrategy) 
traversal.getStrategies().toList().stream().filter(s -> s instanceof 
HaltedTraverserStrategy).findAny().orElse(
+                    Boolean.valueOf(System.getProperty("is.testing", "false")) 
?
+                            HaltedTraverserStrategy.detached() :
+                            HaltedTraverserStrategy.reference());
         }
 
         @Override
         public boolean hasNext() {
-            return inner.hasNext();
+            return this.inner.hasNext();
         }
 
         @Override
         public Traverser.Admin<E> next() {
-            return inner.next().detach();
+            return this.haltedTraverserStrategy.halt(this.inner.next());
         }
     }
 }

Reply via email to