You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2016/03/07 17:42:14 UTC
[4/4] incubator-tinkerpop git commit: Added configuration to unroll
traversers on the client-side.
Added configuration to unroll traversers on the client-side.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/1de0e114
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/1de0e114
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/1de0e114
Branch: refs/heads/TINKERPOP-575
Commit: 1de0e1143db1ca90d4599ab66e7fc4051895148b
Parents: 8bcd524
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Mon Mar 7 11:41:20 2016 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Mon Mar 7 11:41:20 2016 -0500
----------------------------------------------------------------------
.../tinkerpop/gremlin/driver/Channelizer.java | 2 +-
.../apache/tinkerpop/gremlin/driver/Client.java | 2 +-
.../tinkerpop/gremlin/driver/Handler.java | 22 ++++++++--
.../server/GremlinResultSetIntegrateTest.java | 45 ++++++++++++++------
4 files changed, 54 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1de0e114/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
index b059c3f..153e02b 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
@@ -138,7 +138,7 @@ public interface Channelizer extends ChannelHandler {
configure(pipeline);
pipeline.addLast(PIPELINE_GREMLIN_SASL_HANDLER, new Handler.GremlinSaslAuthenticationHandler(cluster.authProperties()));
- pipeline.addLast(PIPELINE_GREMLIN_HANDLER, new Handler.GremlinResponseHandler(pending));
+ pipeline.addLast(PIPELINE_GREMLIN_HANDLER, new Handler.GremlinResponseHandler(pending, connection.getClient().getSettings()));
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1de0e114/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
index ec315c8..8bba22d 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
@@ -644,7 +644,7 @@ public abstract class Client {
* values is instead set to {@code false} then the {@link ResultSet} will simply contain a {@link Traverser}
* and it will be up to the user to work with that component directly.
*/
- public boolean isUnrollTraversers() {
+ public boolean unrollTraversers() {
return unrollTraversers;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1de0e114/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
index fce658f..ec91954 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Handler.java
@@ -29,6 +29,7 @@ import io.netty.util.Attribute;
import io.netty.util.AttributeKey;
import io.netty.util.ReferenceCountUtil;
import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -168,9 +169,11 @@ final class Handler {
static class GremlinResponseHandler extends SimpleChannelInboundHandler<ResponseMessage> {
private static final Logger logger = LoggerFactory.getLogger(GremlinResponseHandler.class);
private final ConcurrentMap<UUID, ResultQueue> pending;
+ private final boolean unrollTraversers;
- public GremlinResponseHandler(final ConcurrentMap<UUID, ResultQueue> pending) {
+ public GremlinResponseHandler(final ConcurrentMap<UUID, ResultQueue> pending, final Client.Settings settings) {
this.pending = pending;
+ unrollTraversers = settings.unrollTraversers();
}
@Override
@@ -183,10 +186,11 @@ final class Handler {
// unrolls the collection into individual results to be handled by the queue.
final List<Object> listToUnroll = (List<Object>) data;
final ResultQueue queue = pending.get(response.getRequestId());
- listToUnroll.forEach(item -> queue.add(new Result(item)));
+ listToUnroll.forEach(item -> tryUnrollTraverser(queue, item));
} else {
// since this is not a list it can just be added to the queue
- pending.get(response.getRequestId()).add(new Result(response.getResult().getData()));
+ final ResultQueue queue = pending.get(response.getRequestId());
+ tryUnrollTraverser(queue, response.getResult().getData());
}
} else {
// this is a "success" but represents no results otherwise it is an error
@@ -204,6 +208,18 @@ final class Handler {
}
}
+ private void tryUnrollTraverser(final ResultQueue queue, final Object item) {
+ if (unrollTraversers && item instanceof Traverser) {
+ final Traverser t = (Traverser) item;
+ final Object traverserObject = t.get();
+ for (long ix = 0; ix < t.bulk(); ix++) {
+ queue.add(new Result(traverserObject));
+ }
+ } else {
+ queue.add(new Result(item));
+ }
+ }
+
@Override
public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception {
// if this happens enough times (like the client is unable to deserialize a response) the pending
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1de0e114/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
index 55ee3b1..129f1a0 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.driver.Result;
import org.apache.tinkerpop.gremlin.driver.ResultSet;
import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -39,6 +40,7 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry;
+import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -92,19 +94,38 @@ public class GremlinResultSetIntegrateTest extends AbstractGremlinServerIntegrat
final Graph graph = TinkerGraph.open();
final GraphTraversalSource g = graph.traversal();
final Client aliased = client.alias("graph");
- final ResultSet results = aliased.submit(g.V(1));
- final Vertex v = results.all().get().get(0).getVertex();
- assertThat(v, instanceOf(DetachedVertex.class));
+ final ResultSet resultSet = aliased.submit(g.V().both().both());
+ final List<Result> results = resultSet.all().get();
- assertEquals("marko", v.properties("name").next().value());
- v.properties().forEachRemaining(p -> {
- if (p.key().equals("name"))
- assertEquals("marko", p.value());
- else if (p.key().equals("age"))
- assertEquals(29, p.value());
- else
- fail("Should not have any other keys besides 'name' and 'age'");
- });
+ assertThat(results.get(0).getObject(), CoreMatchers.instanceOf(Vertex.class));
+ assertEquals(30, results.size());
+ }
+
+ @Test
+ public void shouldHandleVertexResultFromTraversalAsTraversersUnrolled() throws Exception {
+ final Graph graph = TinkerGraph.open();
+ final GraphTraversalSource g = graph.traversal();
+ final Client aliased = client.alias("graph");
+ final ResultSet resultSetUnrolled = aliased.submit(g.V().both().barrier().both().barrier());
+ final List<Result> results = resultSetUnrolled.all().get();
+
+ assertThat(results.get(0).getObject(), CoreMatchers.instanceOf(Vertex.class));
+ assertEquals(30, results.size());
+ }
+
+ @Test
+ public void shouldHandleVertexResultFromTraversalAsTraversers() throws Exception {
+ final Graph graph = TinkerGraph.open();
+ final GraphTraversalSource g = graph.traversal();
+ final Client clientWithUnrolling = cluster.connect(Client.Settings.build().unrollTraversers(false).create());
+ final Client aliased = clientWithUnrolling.alias("graph");
+ final ResultSet resultSet = aliased.submit(g.V().both().barrier().both().barrier());
+ final List<Result> results = resultSet.all().get();
+
+ assertThat(results.get(0).getObject(), CoreMatchers.instanceOf(Traverser.class));
+ assertEquals(6, results.size());
+
+ aliased.close();
}
@Test