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/60883a10 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/60883a10 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/60883a10 Branch: refs/heads/TINKERPOP-1913 Commit: 60883a109d493f39b0c0445582a199a65037d1ab Parents: fb3984a Author: Stephen Mallette <[email protected]> Authored: Wed Mar 7 12:05:23 2018 -0500 Committer: Stephen Mallette <[email protected]> Committed: Tue Sep 18 12:58:42 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/60883a10/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/60883a10/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 791c70e..17ce082 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; @@ -53,13 +54,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/60883a10/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 9b73295..1f18fcd 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 @@ -491,6 +491,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/60883a10/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 c5dd3b9..2126f7a 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 @@ -1174,7 +1174,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(); @@ -1182,6 +1182,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(); @@ -1204,6 +1205,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
