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