You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/10/20 18:24:40 UTC

[1/4] incubator-tinkerpop git commit: Added GraphTraversalSource.withBulk(boolean). Added three new species of Traverser which are optimized for no-bulk. While there is alot of code deduplication, it will help to reduce Traverser footprint sizes (where i

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 4fa22d814 -> b8dbfc34f


Added GraphTraversalSource.withBulk(boolean). Added three new species of Traverser which are optimized for no-bulk. While there is alot of code deduplication, it will help to reduce Traverser footprint sizes (where in OLAP this will really matter). Added a new SackTest which verifies the lack of bulk does not duplicate energy values. Added Traversal.Admin.addTraverserRequirement() which enables us to specify reqiurements that are NOT in steps. This has the added benefit of being able to remove the PathIdentityStep which was there for that reason for withPath(). Updated docs with a withBulk(false) example.


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

Branch: refs/heads/master
Commit: 9065b20618e0ee2d4c34a3f3e006abe5c42958c2
Parents: efbf38f
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Oct 19 13:02:55 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Oct 19 13:02:55 2015 -0600

----------------------------------------------------------------------
 docs/src/the-traversal.asciidoc                 |   4 +-
 .../gremlin/process/traversal/Traversal.java    |  10 ++
 .../dsl/graph/GraphTraversalSource.java         |  49 ++++---
 .../lambda/AbstractLambdaTraversal.java         |   7 +
 .../traversal/step/util/PathIdentityStep.java   |  48 -------
 .../B_LP_O_P_S_SE_SL_TraverserGenerator.java    |   8 +-
 .../B_LP_O_S_SE_SL_TraverserGenerator.java      |   8 +-
 .../B_O_S_SE_SL_TraverserGenerator.java         |   8 +-
 .../traverser/B_O_TraverserGenerator.java       |   6 +-
 .../traverser/LP_O_OB_P_S_SE_SL_Traverser.java  |  98 +++++++++++++
 .../LP_O_OB_P_S_SE_SL_TraverserGenerator.java   |  62 +++++++++
 .../traverser/LP_O_OB_S_SE_SL_Traverser.java    |  99 ++++++++++++++
 .../LP_O_OB_S_SE_SL_TraverserGenerator.java     |  61 +++++++++
 .../traverser/O_OB_S_SE_SL_Traverser.java       | 137 +++++++++++++++++++
 .../O_OB_S_SE_SL_TraverserGenerator.java        |  59 ++++++++
 .../traverser/O_TraverserGenerator.java         |   2 +-
 .../traverser/TraverserRequirement.java         |   8 +-
 .../util/DefaultTraverserGeneratorFactory.java  |  34 +++--
 .../traversal/util/DefaultTraversal.java        |  27 ++++
 .../process/traversal/util/EmptyTraversal.java  |   5 +
 .../gremlin/structure/io/gryo/GryoMapper.java   |  10 +-
 .../step/sideEffect/GroovySackTest.groovy       |   5 +
 .../traversal/step/sideEffect/SackTest.java     |  25 +++-
 23 files changed, 672 insertions(+), 108 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/docs/src/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-traversal.asciidoc b/docs/src/the-traversal.asciidoc
index 1ec4028..554a241 100644
--- a/docs/src/the-traversal.asciidoc
+++ b/docs/src/the-traversal.asciidoc
@@ -1253,7 +1253,7 @@ g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).sack() <2
 g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows') <3>
 g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows').sack() <4>
 g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows').barrier().sack() <5>
-g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows').barrier().sideEffect{it.setBulk(1)}.sack() <6>
+g.withBulk(false).withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows').barrier().sack() <6>
 ----
 
 <1> The knows-adjacent vertices of vertex 1 are vertices 2 and 4.
@@ -1261,7 +1261,7 @@ g.withSack(1.0f,sum).V(1).local(outE('knows').barrier(normSack).inV()).in('knows
 <3> Going from vertices 2 and 4 yield two traversers at vertex 1.
 <4> Those two traversers each have a sack of 0.5.
 <5> The `barrier()` merges the two traversers at vertex 1 into a single traverser whose sack is 1.0.
-<6> There is now a single traverser with bulk of 2 and sack of 1.0 and thus, setting the bulk to 1 yields the expected 1.0.
+<6> There is now a single traverser with bulk of 2 and sack of 1.0 and thus, setting `withBulk(false)` yields the expected 1.0.
 
 
 [[sample-step]]

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index 5ee731a..13a3c57 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -361,10 +361,20 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
                 requirements.add(TraverserRequirement.SACK);
             if (this.getEngine().isComputer())
                 requirements.add(TraverserRequirement.BULK);
+            if (requirements.contains(TraverserRequirement.ONE_BULK))
+                requirements.remove(TraverserRequirement.BULK);
             return requirements;
         }
 
         /**
+         * Add a {@link TraverserRequirement} to this traversal and respective nested sub-traversals.
+         * This is here to allow {@link TraversalStrategy} and {@link TraversalSource} instances to insert requirements.
+         *
+         * @param traverserRequirement the traverser requirement to add
+         */
+        public void addTraverserRequirement(final TraverserRequirement traverserRequirement);
+
+        /**
          * Call the {@link Step#reset} method on every step in the traversal.
          */
         public default void reset() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
index fe06948..875d717 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -27,7 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEn
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -131,13 +131,13 @@ public class GraphTraversalSource implements TraversalSource {
     public GraphTraversalSourceStub withSideEffect(final String key, final Supplier supplier) {
         final GraphTraversal.Admin traversal = this.generateTraversal();
         traversal.getSideEffects().registerSupplier(key, supplier);
-        return new GraphTraversalSourceStub(traversal, false);
+        return new GraphTraversalSourceStub(traversal);
     }
 
     public GraphTraversalSourceStub withSideEffect(final String key, final Object object) {
         final GraphTraversal.Admin traversal = this.generateTraversal();
         traversal.getSideEffects().registerSupplier(key, new ConstantSupplier<>(object));
-        return new GraphTraversalSourceStub(traversal, false);
+        return new GraphTraversalSourceStub(traversal);
     }
 
     public <A> GraphTraversalSourceStub withSack(final A initialValue) {
@@ -147,7 +147,7 @@ public class GraphTraversalSource implements TraversalSource {
     public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue) {
         final GraphTraversal.Admin traversal = this.generateTraversal();
         traversal.getSideEffects().setSack(initialValue, null, null);
-        return new GraphTraversalSourceStub(traversal, false);
+        return new GraphTraversalSourceStub(traversal);
     }
 
     public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
@@ -169,18 +169,25 @@ public class GraphTraversalSource implements TraversalSource {
     public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
         final GraphTraversal.Admin traversal = this.generateTraversal();
         traversal.getSideEffects().setSack(initialValue, splitOperator, mergeOperator);
-        return new GraphTraversalSourceStub(traversal, false);
+        return new GraphTraversalSourceStub(traversal);
     }
 
     public <A> GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
         final GraphTraversal.Admin traversal = this.generateTraversal();
         traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator);
-        return new GraphTraversalSourceStub(traversal, false);
+        return new GraphTraversalSourceStub(traversal);
     }
 
+    public GraphTraversalSourceStub withBulk(final boolean useBulk) {
+        final GraphTraversal.Admin traversal = this.generateTraversal();
+        traversal.addTraverserRequirement(useBulk ? TraverserRequirement.BULK : TraverserRequirement.ONE_BULK);
+        return new GraphTraversalSourceStub(traversal);
+    }
 
     public <S> GraphTraversalSourceStub withPath() {
-        return new GraphTraversalSourceStub(this.generateTraversal(), true);
+        final GraphTraversal.Admin traversal = this.generateTraversal();
+        traversal.addTraverserRequirement(TraverserRequirement.PATH);
+        return new GraphTraversalSourceStub(traversal);
     }
 
     public Transaction tx() {
@@ -257,16 +264,13 @@ public class GraphTraversalSource implements TraversalSource {
     public static class GraphTraversalSourceStub {
 
         private final GraphTraversal.Admin traversal;
-        private boolean withPaths;
 
-        public GraphTraversalSourceStub(final GraphTraversal.Admin traversal, final boolean withPaths) {
+        public GraphTraversalSourceStub(final GraphTraversal.Admin traversal) {
             this.traversal = traversal;
-            this.withPaths = withPaths;
         }
 
         public <S> GraphTraversal<S, S> inject(S... starts) {
-            this.traversal.inject(starts);
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal.inject(starts);
         }
 
         /**
@@ -276,27 +280,23 @@ public class GraphTraversalSource implements TraversalSource {
         public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
             this.traversal.addStep(new AddVertexStartStep(this.traversal, null));
             ((AddVertexStartStep) this.traversal.getEndStep()).addPropertyMutations(keyValues);
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal;
         }
 
         public GraphTraversal<Vertex, Vertex> addV(final String label) {
-            this.traversal.addStep(new AddVertexStartStep(this.traversal, label));
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal.addStep(new AddVertexStartStep(this.traversal, label));
         }
 
         public GraphTraversal<Vertex, Vertex> addV() {
-            this.traversal.addStep(new AddVertexStartStep(this.traversal, null));
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal.addStep(new AddVertexStartStep(this.traversal, null));
         }
 
         public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
-            this.traversal.addStep(new GraphStep<>(this.traversal, Vertex.class, vertexIds));
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal.addStep(new GraphStep<>(this.traversal, Vertex.class, vertexIds));
         }
 
         public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
-            this.traversal.addStep(new GraphStep<>(this.traversal, Edge.class, edgesIds));
-            return ((this.withPaths) ? this.traversal.addStep(new PathIdentityStep<>(this.traversal)) : this.traversal);
+            return this.traversal.addStep(new GraphStep<>(this.traversal, Edge.class, edgesIds));
         }
 
         //// UTILITIES
@@ -351,8 +351,13 @@ public class GraphTraversalSource implements TraversalSource {
             return this;
         }
 
+        public GraphTraversalSourceStub withBulk(final boolean useBulk) {
+            this.traversal.addTraverserRequirement(useBulk ? TraverserRequirement.BULK : TraverserRequirement.ONE_BULK);
+            return this;
+        }
+
         public GraphTraversalSourceStub withPath() {
-            this.withPaths = true;
+            this.traversal.addTraverserRequirement(TraverserRequirement.PATH);
             return this;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
index 4effad7..3f3af00 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEn
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalStrategies;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -36,6 +37,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -81,6 +83,11 @@ public abstract class AbstractLambdaTraversal<S, E> implements Traversal.Admin<S
     }
 
     @Override
+    public void addTraverserRequirement(final TraverserRequirement traverserRequirement) {
+
+    }
+
+    @Override
     public void setSideEffects(final TraversalSideEffects sideEffects) {
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
deleted file mode 100644
index ef26d9e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PathIdentityStep<S> extends AbstractStep<S, S> {
-
-    public PathIdentityStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_TraverserGenerator.java
index 0ba86f5..d0c4d78 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_TraverserGenerator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_TraverserGenerator.java
@@ -28,17 +28,17 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class B_LP_O_P_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+public final class B_LP_O_P_S_SE_SL_TraverserGenerator implements TraverserGenerator {
 
     private static final B_LP_O_P_S_SE_SL_TraverserGenerator INSTANCE = new B_LP_O_P_S_SE_SL_TraverserGenerator();
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
             TraverserRequirement.BULK,
-            TraverserRequirement.SINGLE_LOOP,
             TraverserRequirement.LABELED_PATH,
+            TraverserRequirement.OBJECT,
             TraverserRequirement.PATH,
             TraverserRequirement.SACK,
-            TraverserRequirement.SIDE_EFFECTS);
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
 
     private B_LP_O_P_S_SE_SL_TraverserGenerator() {
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_TraverserGenerator.java
index 3723b9a..1c7e0d6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_TraverserGenerator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_TraverserGenerator.java
@@ -28,16 +28,16 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class B_LP_O_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+public final class B_LP_O_S_SE_SL_TraverserGenerator implements TraverserGenerator {
 
     private static final B_LP_O_S_SE_SL_TraverserGenerator INSTANCE = new B_LP_O_S_SE_SL_TraverserGenerator();
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
             TraverserRequirement.BULK,
-            TraverserRequirement.SINGLE_LOOP,
             TraverserRequirement.LABELED_PATH,
+            TraverserRequirement.OBJECT,
             TraverserRequirement.SACK,
-            TraverserRequirement.SIDE_EFFECTS);
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
 
     private B_LP_O_S_SE_SL_TraverserGenerator() {
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_TraverserGenerator.java
index e70eebf..4c5ce57 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_TraverserGenerator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_TraverserGenerator.java
@@ -28,16 +28,16 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class B_O_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+public final class B_O_S_SE_SL_TraverserGenerator implements TraverserGenerator {
 
     private static final B_O_S_SE_SL_TraverserGenerator INSTANCE = new B_O_S_SE_SL_TraverserGenerator();
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
             TraverserRequirement.BULK,
-            TraverserRequirement.SINGLE_LOOP,
+            TraverserRequirement.OBJECT,
             TraverserRequirement.SACK,
-            TraverserRequirement.SIDE_EFFECTS);
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
 
 
     private B_O_S_SE_SL_TraverserGenerator() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
index 58a7546..0ee1e68 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
@@ -28,11 +28,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class B_O_TraverserGenerator implements TraverserGenerator {
+public final class B_O_TraverserGenerator implements TraverserGenerator {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
-            TraverserRequirement.BULK);
+            TraverserRequirement.BULK,
+            TraverserRequirement.OBJECT);
 
     private static final B_O_TraverserGenerator INSTANCE = new B_O_TraverserGenerator();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..353d1ef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
+
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class LP_O_OB_P_S_SE_SL_Traverser<T> extends O_OB_S_SE_SL_Traverser<T> {
+
+    protected Path path;
+
+    protected LP_O_OB_P_S_SE_SL_Traverser() {
+    }
+
+    public LP_O_OB_P_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+        super(t, step);
+        this.path = ImmutablePath.make().extend(t, step.getLabels());
+    }
+
+    /////////////////
+
+    @Override
+    public Path path() {
+        return this.path;
+    }
+
+    /////////////////
+
+    @Override
+    public Traverser.Admin<T> detach() {
+        super.detach();
+        this.path = ReferenceFactory.detach(this.path);
+        return this;
+    }
+
+    /////////////////
+
+    @Override
+    public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
+        final LP_O_OB_P_S_SE_SL_Traverser<R> clone = (LP_O_OB_P_S_SE_SL_Traverser<R>) super.split(r, step);
+        clone.path = clone.path.clone().extend(r, step.getLabels());
+        return clone;
+    }
+
+    @Override
+    public Traverser.Admin<T> split() {
+        final LP_O_OB_P_S_SE_SL_Traverser<T> clone = (LP_O_OB_P_S_SE_SL_Traverser<T>) super.split();
+        clone.path = clone.path.clone();
+        return clone;
+    }
+
+    @Override
+    public void addLabels(final Set<String> labels) {
+        if (!labels.isEmpty())
+            this.path = this.path.extend(labels);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() + this.path.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return (object instanceof LP_O_OB_P_S_SE_SL_Traverser)
+                && ((LP_O_OB_P_S_SE_SL_Traverser) object).get().equals(this.t)
+                && ((LP_O_OB_P_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+                && ((LP_O_OB_P_S_SE_SL_Traverser) object).loops() == this.loops()
+                && (null == this.sack || null != this.sideEffects.getSackMerger())
+                && ((LP_O_OB_P_S_SE_SL_Traverser) object).path().equals(this.path);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..546ed6d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LP_O_OB_P_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.LABELED_PATH,
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.ONE_BULK,
+            TraverserRequirement.PATH,
+            TraverserRequirement.SACK,
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
+
+
+    private static final LP_O_OB_P_S_SE_SL_TraverserGenerator INSTANCE = new LP_O_OB_P_S_SE_SL_TraverserGenerator();
+
+    private LP_O_OB_P_S_SE_SL_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        return new LP_O_OB_P_S_SE_SL_Traverser<>(start, startStep);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static LP_O_OB_P_S_SE_SL_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..9781f84
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
+
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class LP_O_OB_S_SE_SL_Traverser<T> extends O_OB_S_SE_SL_Traverser<T> {
+
+    protected Path path;
+
+    public LP_O_OB_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+        super(t, step);
+        this.path = ImmutablePath.make();
+        if (!step.getLabels().isEmpty()) this.path = this.path.extend(t, step.getLabels());
+    }
+
+    /////////////////
+
+    @Override
+    public Path path() {
+        return this.path;
+    }
+
+    /////////////////
+
+    @Override
+    public Traverser.Admin<T> detach() {
+        super.detach();
+        this.path = ReferenceFactory.detach(this.path);
+        return this;
+    }
+
+    /////////////////
+
+    @Override
+    public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
+        final LP_O_OB_S_SE_SL_Traverser<R> clone = (LP_O_OB_S_SE_SL_Traverser<R>) super.split(r, step);
+        clone.path = clone.path.clone();
+        if (!step.getLabels().isEmpty()) clone.path = clone.path.extend(r, step.getLabels());
+        return clone;
+    }
+
+    @Override
+    public Traverser.Admin<T> split() {
+        final LP_O_OB_S_SE_SL_Traverser<T> clone = (LP_O_OB_S_SE_SL_Traverser<T>) super.split();
+        clone.path = clone.path.clone();
+        return clone;
+    }
+
+    @Override
+    public void addLabels(final Set<String> labels) {
+        if (!labels.isEmpty())
+            this.path = this.path.size() == 0 || !this.path.get(this.path.size() - 1).equals(this.t) ?
+                    this.path.extend(this.t, labels) :
+                    this.path.extend(labels);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() + this.path.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return (object instanceof LP_O_OB_S_SE_SL_Traverser)
+                && ((LP_O_OB_S_SE_SL_Traverser) object).get().equals(this.t)
+                && ((LP_O_OB_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+                && ((LP_O_OB_S_SE_SL_Traverser) object).loops() == this.loops()
+                && (null == this.sack || null != this.sideEffects.getSackMerger())
+                && ((LP_O_OB_S_SE_SL_Traverser) object).path().popEquals(Pop.last, this.path); // this should be Pop.all?
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..f30eced
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LP_O_OB_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.LABELED_PATH,
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.ONE_BULK,
+            TraverserRequirement.SACK,
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
+
+
+    private static final LP_O_OB_S_SE_SL_TraverserGenerator INSTANCE = new LP_O_OB_S_SE_SL_TraverserGenerator();
+
+    private LP_O_OB_S_SE_SL_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        return new LP_O_OB_S_SE_SL_Traverser<>(start, startStep);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static LP_O_OB_S_SE_SL_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..7196e72
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class O_OB_S_SE_SL_Traverser<T> extends O_Traverser<T> {
+
+    protected Object sack = null;
+    protected short loops = 0;  // an optimization hack to use a short internally to save bits :)
+    protected transient TraversalSideEffects sideEffects;
+    protected String future = HALT;
+
+    protected O_OB_S_SE_SL_Traverser() {
+    }
+
+    public O_OB_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+        super(t);
+        this.sideEffects = step.getTraversal().getSideEffects();
+        if (null != this.sideEffects.getSackInitialValue())
+            this.sack = this.sideEffects.getSackInitialValue().get();
+    }
+
+    /////////////////
+
+    @Override
+    public <S> S sack() {
+        return (S) this.sack;
+    }
+
+    @Override
+    public <S> void sack(final S object) {
+        this.sack = object;
+    }
+
+    /////////////////
+
+    @Override
+    public int loops() {
+        return this.loops;
+    }
+
+    @Override
+    public void incrLoops(final String stepLabel) {
+        this.loops++;
+    }
+
+    @Override
+    public void resetLoops() {
+        this.loops = 0;
+    }
+
+    /////////////////
+
+    @Override
+    public String getStepId() {
+        return this.future;
+    }
+
+    @Override
+    public void setStepId(final String stepId) {
+        this.future = stepId;
+    }
+
+    /////////////////
+
+    @Override
+    public TraversalSideEffects getSideEffects() {
+        return this.sideEffects;
+    }
+
+
+    @Override
+    public void setSideEffects(final TraversalSideEffects sideEffects) {
+        this.sideEffects = sideEffects;
+    }
+
+    /////////////////
+
+    @Override
+    public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
+        final O_OB_S_SE_SL_Traverser<R> clone = (O_OB_S_SE_SL_Traverser<R>) super.split(r, step);
+        clone.sack = null == clone.sack ? null : null == clone.sideEffects.getSackSplitter() ? clone.sack : clone.sideEffects.getSackSplitter().apply(clone.sack);
+        return clone;
+    }
+
+    @Override
+    public Traverser.Admin<T> split() {
+        final O_OB_S_SE_SL_Traverser<T> clone = (O_OB_S_SE_SL_Traverser<T>) super.split();
+        clone.sack = null == clone.sack ? null : null == clone.sideEffects.getSackSplitter() ? clone.sack : clone.sideEffects.getSackSplitter().apply(clone.sack);
+        return clone;
+    }
+
+    @Override
+    public void merge(final Traverser.Admin<?> other) {
+        if (null != this.sack && null != this.sideEffects.getSackMerger())
+            this.sack = this.sideEffects.getSackMerger().apply(this.sack, other.sack());
+    }
+
+    /////////////////
+
+    @Override
+    public int hashCode() {
+        return this.t.hashCode() + this.future.hashCode() + this.loops;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof O_OB_S_SE_SL_Traverser
+                && ((O_OB_S_SE_SL_Traverser) object).get().equals(this.t)
+                && ((O_OB_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+                && ((O_OB_S_SE_SL_Traverser) object).loops() == this.loops()
+                && (null == this.sack || (null != this.sideEffects && null != this.sideEffects.getSackMerger())); // hmmm... serialization in OLAP destroys the transient sideEffects
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..8369bef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class O_OB_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.ONE_BULK,
+            TraverserRequirement.SACK,
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.SINGLE_LOOP);
+
+    private static final O_OB_S_SE_SL_TraverserGenerator INSTANCE = new O_OB_S_SE_SL_TraverserGenerator();
+
+    private O_OB_S_SE_SL_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        return new O_OB_S_SE_SL_Traverser<>(start, startStep);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static O_OB_S_SE_SL_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
index 373fa8a..8a67b18 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
@@ -28,7 +28,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class O_TraverserGenerator implements TraverserGenerator {
+public final class O_TraverserGenerator implements TraverserGenerator {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = Collections.singleton(TraverserRequirement.OBJECT);
     private static final O_TraverserGenerator INSTANCE = new O_TraverserGenerator();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
index b81469b..ac2c509 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
@@ -26,18 +26,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
  * A {@link TraverserRequirement} is a list of requirements that a {@link Traversal} requires of a {@link Traverser}.
  * The less requirements, the simpler the traverser can be (both in terms of space and time constraints).
  * Every {@link Step} provides its specific requirements via {@link Step#getRequirements()}.
+ * Moreover, every {@link Traversal.Admin} can be provided requirements via {@link Traversal.Admin#addTraverserRequirement(TraverserRequirement)}.
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public enum TraverserRequirement {
 
-    OBJECT,
     BULK,
-    SINGLE_LOOP,
-    NESTED_LOOP,
     LABELED_PATH,
+    NESTED_LOOP,
+    OBJECT,
+    ONE_BULK,
     PATH,
     SACK,
     SIDE_EFFECTS,
+    SINGLE_LOOP
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
index d94e531..0b14246 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
@@ -24,6 +24,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -48,20 +51,31 @@ public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFacto
     public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?, ?> traversal) {
         final Set<TraverserRequirement> requirements = traversal.getTraverserRequirements();
 
-        if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return O_TraverserGenerator.instance();
+        if (requirements.contains(TraverserRequirement.ONE_BULK)) {
+            if (O_OB_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return O_OB_S_SE_SL_TraverserGenerator.instance();
 
-        if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_O_TraverserGenerator.instance();
+            if (LP_O_OB_P_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return LP_O_OB_P_S_SE_SL_TraverserGenerator.instance();
 
-        if (B_O_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_O_S_SE_SL_TraverserGenerator.instance();
+            if (LP_O_OB_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return LP_O_OB_S_SE_SL_TraverserGenerator.instance();
+        } else {
+            if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return O_TraverserGenerator.instance();
 
-        if (B_LP_O_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_LP_O_S_SE_SL_TraverserGenerator.instance();
+            if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return B_O_TraverserGenerator.instance();
 
-        if (B_LP_O_P_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_LP_O_P_S_SE_SL_TraverserGenerator.instance();
+            if (B_O_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return B_O_S_SE_SL_TraverserGenerator.instance();
+
+            if (B_LP_O_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return B_LP_O_S_SE_SL_TraverserGenerator.instance();
+
+            if (B_LP_O_P_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return B_LP_O_P_S_SE_SL_TraverserGenerator.instance();
+        }
 
         throw new IllegalStateException("The provided traverser generator factory does not support the requirements of the traversal: " + this.getClass().getCanonicalName() + requirements);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
index 0e7d98f..603ad10 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -27,15 +27,19 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -53,6 +57,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     protected TraversalStrategies strategies;
     protected TraversalEngine traversalEngine = StandardTraversalEngine.instance(); // necessary for strategies that need the engine in OLAP message passing (not so bueno)
     protected boolean locked = false;
+    protected Set<TraverserRequirement> traverserRequirements = new HashSet<>();
 
     public DefaultTraversal() {
         this.graph = null;
@@ -107,6 +112,28 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
+    public Set<TraverserRequirement> getTraverserRequirements() {
+        final Set<TraverserRequirement> requirements = this.getSteps().stream()
+                .flatMap(step -> ((Step<?, ?>) step).getRequirements().stream())
+                .collect(Collectors.toSet());
+        requirements.addAll(this.traverserRequirements);
+        if (this.getSideEffects().keys().size() > 0)
+            requirements.add(TraverserRequirement.SIDE_EFFECTS);
+        if (null != this.getSideEffects().getSackInitialValue())
+            requirements.add(TraverserRequirement.SACK);
+        if (this.getEngine().isComputer())
+            requirements.add(TraverserRequirement.BULK);
+        if (requirements.contains(TraverserRequirement.ONE_BULK))
+            requirements.remove(TraverserRequirement.BULK);
+        return requirements;
+    }
+
+    @Override
+    public void addTraverserRequirement(final TraverserRequirement traverserRequirement) {
+        this.traverserRequirements.add(traverserRequirement);
+    }
+
+    @Override
     public List<Step> getSteps() {
         return Collections.unmodifiableList(this.steps);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index 6b8da5b..de789cc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -75,6 +75,11 @@ public class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
+    public void addTraverserRequirement(final TraverserRequirement traverserRequirement) {
+
+    }
+
+    @Override
     public void applyStrategies() {
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index cba2497..5a0b516 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -28,6 +28,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
@@ -243,6 +246,9 @@ public final class GryoMapper implements Mapper<Kryo> {
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(B_LP_O_P_S_SE_SL_Traverser.class, null, 77));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(B_O_S_SE_SL_Traverser.class, null, 78));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(B_LP_O_S_SE_SL_Traverser.class, null, 87));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(O_OB_S_SE_SL_Traverser.class, null, 89));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(LP_O_OB_S_SE_SL_Traverser.class, null, 90));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(LP_O_OB_P_S_SE_SL_TraverserGenerator.class, null, 91)); // ***LAST ID**
 
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraverserSet.class, null, 58));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Tree.class, null, 61));
@@ -254,7 +260,7 @@ public final class GryoMapper implements Mapper<Kryo> {
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MapReduce.NullObject.class, null, 74));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(AtomicLong.class, null, 79));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(DependantMutableMetrics.class, null, 80));
-            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Pair.class, kryo -> new PairSerializer(), 88)); // ***LAST ID**
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Pair.class, kryo -> new PairSerializer(), 88));
         }};
 
         private final List<IoRegistry> registries = new ArrayList<>();
@@ -314,7 +320,7 @@ public final class GryoMapper implements Mapper<Kryo> {
          * value to {@code false}.
          *
          * @param registrationRequired set to {@code true} if the classes should be registered up front or
-         * {@code false} otherwise
+         *                             {@code false} otherwise
          */
         public Builder registrationRequired(final boolean registrationRequired) {
             this.registrationRequired = registrationRequired;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
index bf705e7..8d7013f 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
@@ -64,5 +64,10 @@ public abstract class GroovySackTest {
                 final Object v1Id) {
             TraversalScriptHelper.compute("g.withSack(1.0d,sum).V(${v1Id}).local(out('knows').barrier(normSack)).in('knows').barrier.sack", g, "v1Id", v1Id)
         }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack() {
+            TraversalScriptHelper.compute("g.withBulk(false).withSack(1, sum).V.out.barrier.sack", g);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9065b206/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
index 6515d3d..8e30e5d 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
@@ -60,9 +60,11 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Double> get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(final Object v1Id);
 
+    public abstract Traversal<Vertex, Integer> get_g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack();
+
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+    public void g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack() {
         final Traversal<Vertex, String> traversal = get_g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack();
         checkResults(Arrays.asList("knows", "knows", "created", "created", "created", "created"), traversal);
     }
@@ -70,7 +72,7 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() {
-        final Traversal<Vertex,Double> traversal = get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum();
+        final Traversal<Vertex, Double> traversal = get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum();
         printTraversalForm(traversal);
         assertEquals(3.5d, traversal.next(), 0.00001d);
         assertFalse(traversal.hasNext());
@@ -80,7 +82,7 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     @Deprecated
     public void g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum() {
-        final Traversal<Vertex,Double> traversal = get_g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum();
+        final Traversal<Vertex, Double> traversal = get_g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum();
         printTraversalForm(traversal);
         assertEquals(3.5d, traversal.next(), 0.00001d);
         assertFalse(traversal.hasNext());
@@ -89,7 +91,7 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack() {
-        final Traversal<Vertex,Float> traversal = get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack();
+        final Traversal<Vertex, Float> traversal = get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack();
         printTraversalForm(traversal);
         checkResults(Arrays.asList(2.0f, 1.4f), traversal);
     }
@@ -98,7 +100,7 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     @Deprecated
     public void g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
-        final Traversal<Vertex,Float> traversal = get_g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
+        final Traversal<Vertex, Float> traversal = get_g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
         printTraversalForm(traversal);
         checkResults(Arrays.asList(2.0f, 1.4f), traversal);
     }
@@ -127,6 +129,14 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
         checkResults(Arrays.asList(1.0d, 1.0d), traversal);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack() {
+        final Traversal<Vertex, Integer> traversal = get_g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(1, 1, 1, 3), traversal); // josh, vadas, ripple, lop
+    }
+
     public static class Traversals extends SackTest {
 
         @Override
@@ -166,5 +176,10 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Double> get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(final Object v1Id) {
             return g.withSack(1.0d, Operator.sum).V(v1Id).local(__.out("knows").barrier(SackFunctions.Barrier.normSack)).in("knows").barrier().sack();
         }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack() {
+            return g.withBulk(false).withSack(1, Operator.sum).V().out().barrier().sack();
+        }
     }
 }
\ No newline at end of file


[3/4] incubator-tinkerpop git commit: added a test case for DefaultTraverserGeneratorFactory that ensures the correct type of traverser is generated given particular traversals. Found a bug with it where a more complex traverser was being used when a sim

Posted by ok...@apache.org.
added a test case for DefaultTraverserGeneratorFactory that ensures the correct type of traverser is generated given particular traversals. Found a bug with it where a more complex traverser was being used when a simpler one would have done the trick. We can keep adding to this list as we come up with ideas and more traverser species.


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

Branch: refs/heads/master
Commit: 902f49d92d482c6f6fd95c68564157e49ffe8da4
Parents: acd6c2c
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Oct 19 14:29:16 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Oct 19 14:29:16 2015 -0600

----------------------------------------------------------------------
 .../util/DefaultTraverserGeneratorFactory.java  |  6 +-
 .../DefaultTraverserGeneratorFactoryTest.java   | 85 ++++++++++++++++++++
 2 files changed, 88 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/902f49d9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
index 0b14246..60a22ca 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
@@ -55,11 +55,11 @@ public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFacto
             if (O_OB_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
                 return O_OB_S_SE_SL_TraverserGenerator.instance();
 
-            if (LP_O_OB_P_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-                return LP_O_OB_P_S_SE_SL_TraverserGenerator.instance();
-
             if (LP_O_OB_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
                 return LP_O_OB_S_SE_SL_TraverserGenerator.instance();
+
+            if (LP_O_OB_P_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+                return LP_O_OB_P_S_SE_SL_TraverserGenerator.instance();
         } else {
             if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
                 return O_TraverserGenerator.instance();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/902f49d9/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactoryTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactoryTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactoryTest.java
new file mode 100644
index 0000000..bdf5def
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactoryTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraverserGeneratorFactoryTest {
+
+    @Test
+    public void shouldProduceExpectedTraverser() {
+        final GraphTraversalSource traversalSource = EmptyGraph.instance().traversal();
+        final Object start = new Object();
+
+        Traversal.Admin traversal = traversalSource.V().out().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(O_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.V().out().barrier().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(B_O_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.V().repeat(__.out()).times(10).asAdmin();
+        traversal.applyStrategies();
+        assertEquals(B_O_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.V().out().sack().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(B_O_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.V().out().sack().as("a").select("a").asAdmin();
+        traversal.applyStrategies();
+        assertEquals(B_LP_O_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.V().out().path().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(B_LP_O_P_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.withBulk(false).V().out().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(O_OB_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.withBulk(false).V().as("a").out().select("a").asAdmin();
+        traversal.applyStrategies();
+        assertEquals(LP_O_OB_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+        //
+        traversal = traversalSource.withBulk(false).V().out().path().asAdmin();
+        traversal.applyStrategies();
+        assertEquals(LP_O_OB_P_S_SE_SL_Traverser.class, traversal.getTraverserGenerator().generate(start, traversal.getStartStep(), 1l).getClass());
+
+    }
+}


[2/4] incubator-tinkerpop git commit: Merge branch 'master' into TINKERPOP3-863

Posted by ok...@apache.org.
Merge branch 'master' into TINKERPOP3-863


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

Branch: refs/heads/master
Commit: acd6c2c8083f4a567957628a425bc831d07f5eca
Parents: 9065b20 0141f50
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Oct 19 13:12:03 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Oct 19 13:12:03 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 RELEASE.asciidoc                                |  6 +++--
 .../gremlin/groovy/loaders/StepLoader.groovy    | 24 ++++++++++++--------
 .../groovy/function/GBinaryOperator.java        |  2 ++
 .../gremlin/groovy/function/GComparator.java    |  2 ++
 .../gremlin/groovy/function/GFunction.java      |  2 ++
 .../gremlin/groovy/function/GSupplier.java      |  2 ++
 .../gremlin/groovy/function/GUnaryOperator.java |  2 ++
 8 files changed, 29 insertions(+), 12 deletions(-)
----------------------------------------------------------------------



[4/4] incubator-tinkerpop git commit: Merge branch 'TINKERPOP3-863' of https://github.com/apache/incubator-tinkerpop

Posted by ok...@apache.org.
Merge branch 'TINKERPOP3-863' of https://github.com/apache/incubator-tinkerpop


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

Branch: refs/heads/master
Commit: b8dbfc34f523f60be4c341699414fb5e28e8e6aa
Parents: 4fa22d8 902f49d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Oct 20 08:58:39 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Oct 20 08:58:39 2015 -0600

----------------------------------------------------------------------
 docs/src/the-traversal.asciidoc                 |   4 +-
 .../gremlin/process/traversal/Traversal.java    |  10 ++
 .../dsl/graph/GraphTraversalSource.java         |  49 ++++---
 .../lambda/AbstractLambdaTraversal.java         |   7 +
 .../traversal/step/util/PathIdentityStep.java   |  48 -------
 .../B_LP_O_P_S_SE_SL_TraverserGenerator.java    |   8 +-
 .../B_LP_O_S_SE_SL_TraverserGenerator.java      |   8 +-
 .../B_O_S_SE_SL_TraverserGenerator.java         |   8 +-
 .../traverser/B_O_TraverserGenerator.java       |   6 +-
 .../traverser/LP_O_OB_P_S_SE_SL_Traverser.java  |  98 +++++++++++++
 .../LP_O_OB_P_S_SE_SL_TraverserGenerator.java   |  62 +++++++++
 .../traverser/LP_O_OB_S_SE_SL_Traverser.java    |  99 ++++++++++++++
 .../LP_O_OB_S_SE_SL_TraverserGenerator.java     |  61 +++++++++
 .../traverser/O_OB_S_SE_SL_Traverser.java       | 137 +++++++++++++++++++
 .../O_OB_S_SE_SL_TraverserGenerator.java        |  59 ++++++++
 .../traverser/O_TraverserGenerator.java         |   2 +-
 .../traverser/TraverserRequirement.java         |   8 +-
 .../util/DefaultTraverserGeneratorFactory.java  |  34 +++--
 .../traversal/util/DefaultTraversal.java        |  27 ++++
 .../process/traversal/util/EmptyTraversal.java  |   5 +
 .../gremlin/structure/io/gryo/GryoMapper.java   |  10 +-
 .../DefaultTraverserGeneratorFactoryTest.java   |  85 ++++++++++++
 .../step/sideEffect/GroovySackTest.groovy       |   5 +
 .../traversal/step/sideEffect/SackTest.java     |  25 +++-
 24 files changed, 757 insertions(+), 108 deletions(-)
----------------------------------------------------------------------