TINKERPOP-1913 Added status attribute access to traversal side-effects
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/b175e36d Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/b175e36d Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/b175e36d Branch: refs/heads/TINKERPOP-1913 Commit: b175e36dac4a984757d4fd64d672a3b22815fc89 Parents: 810ba44 Author: Stephen Mallette <sp...@genoprime.com> Authored: Wed Mar 7 12:05:23 2018 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Thu Jul 26 12:31:15 2018 -0400 ---------------------------------------------------------------------- .../driver/remote/DriverRemoteTraversal.java | 4 +--- .../DriverRemoteTraversalSideEffects.java | 25 ++++++++++++++++++++ .../op/traversal/TraversalOpProcessor.java | 1 + .../server/GremlinServerIntegrateTest.java | 8 ++++++- 4 files changed, 34 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b175e36d/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 d991f21..46d1a2b 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 @@ -66,9 +66,7 @@ public class DriverRemoteTraversal<S, E> extends AbstractRemoteTraversal<S, E> { } this.rs = rs; - this.sideEffects = new DriverRemoteTraversalSideEffects(client, - rs.getOriginalRequestMessage().getRequestId(), - rs.getHost(), rs.allItemsAvailableAsync()); + this.sideEffects = new DriverRemoteTraversalSideEffects(client,rs); } /** http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b175e36d/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversalSideEffects.java ---------------------------------------------------------------------- diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversalSideEffects.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversalSideEffects.java index 4305567..9a3cdab 100644 --- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversalSideEffects.java +++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteTraversalSideEffects.java @@ -22,6 +22,7 @@ import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.tinkerpop.gremlin.driver.Client; import org.apache.tinkerpop.gremlin.driver.Host; import org.apache.tinkerpop.gremlin.driver.Result; +import org.apache.tinkerpop.gremlin.driver.ResultSet; import org.apache.tinkerpop.gremlin.driver.Tokens; import org.apache.tinkerpop.gremlin.driver.message.RequestMessage; import org.apache.tinkerpop.gremlin.process.remote.traversal.AbstractRemoteTraversalSideEffects; @@ -52,13 +53,37 @@ public class DriverRemoteTraversalSideEffects extends AbstractRemoteTraversalSid private boolean closed = false; private boolean retrievedAllKeys = false; private final CompletableFuture<Void> ready; + private final CompletableFuture<Map<String,Object>> statusAttributes; + /** + * @deprecated As of release 3.3.2, replaced by {@link #DriverRemoteTraversalSideEffects(Client, ResultSet)} + */ + @Deprecated public DriverRemoteTraversalSideEffects(final Client client, final UUID serverSideEffect, final Host host, final CompletableFuture<Void> ready) { this.client = client; this.serverSideEffect = serverSideEffect; this.host = host; this.ready = ready; + this.statusAttributes = CompletableFuture.completedFuture(Collections.emptyMap()); + } + + public DriverRemoteTraversalSideEffects(final Client client, final ResultSet rs) { + this.client = client; + this.serverSideEffect = rs.getOriginalRequestMessage().getRequestId(); + this.host = rs.getHost(); + this.ready = rs.allItemsAvailableAsync(); + this.statusAttributes = rs.statusAttributes(); + } + + /** + * Gets the status attributes from the response from the server. This method will block until all results have + * been retrieved. + */ + public Map<String,Object> statusAttributes() { + // wait for the read to complete (i.e. iteration on the server) before allowing the caller to get the + // attribute. simply following the pattern from other methods here for now. + return statusAttributes.join(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b175e36d/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 e5383ac..2d1af49 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 @@ -489,6 +489,7 @@ public class TraversalOpProcessor extends AbstractOpProcessor { } ctx.writeAndFlush(ResponseMessage.build(msg) .code(ResponseStatusCode.NO_CONTENT) + .statusAttributes(generateStatusAttributes(ctx, msg, ResponseStatusCode.NO_CONTENT, itty, settings)) .create()); return; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b175e36d/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java index 08b8526..321af57 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java @@ -970,7 +970,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration } @Test - public void shouldGetSideEffectKeysUsingWithRemote() throws Exception { + public void shouldGetSideEffectKeysAndStatusUsingWithRemote() throws Exception { final Graph graph = EmptyGraph.instance(); final GraphTraversalSource g = graph.traversal().withRemote(conf); g.addV("person").property("age", 20).iterate(); @@ -978,6 +978,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration final GraphTraversal traversal = g.V().aggregate("a").aggregate("b"); traversal.iterate(); final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects(); + assertThat(se.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true)); // Get keys final Set<String> sideEffectKeys = se.keys(); @@ -1000,6 +1001,11 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration final BulkSet localBSideEffects = se.get("b"); assertThat(localBSideEffects.isEmpty(), is(false)); + + final GraphTraversal gdotv = g.V(); + gdotv.toList(); + final DriverRemoteTraversalSideEffects gdotvSe = (DriverRemoteTraversalSideEffects) gdotv.asAdmin().getSideEffects(); + assertThat(gdotvSe.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true)); } @Test