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 2016/02/27 00:30:40 UTC

incubator-tinkerpop git commit: OMG I was in a bug hole for 2 hours straight with a bad if()-statement. So burnt. Anywho, TraverserMapReduce is no longer needed -- everything is completely handled by GraphComputer.Memory. There is one last step to get to

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1166 ce89e3134 -> b654c84dd


OMG I was in a bug hole for 2 hours straight with a bad if()-statement. So burnt. Anywho, TraverserMapReduce is no longer needed -- everything is completely handled by GraphComputer.Memory. There is one last step to get to work in the model -- AggregateStep. The problem, it is both a CollectingBarrierStep AND a SideEffectStep. dah. I think I will get it -- just tired after the nonsense bug hunt. Opened up yet more TestSuite tests to ProcessComputerTestSuite.


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

Branch: refs/heads/TINKERPOP-1166
Commit: b654c84ddecee064353c5c6107ee34a0b1a873f5
Parents: ce89e31
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Feb 26 16:30:34 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Feb 26 16:30:34 2016 -0700

----------------------------------------------------------------------
 .../traversal/TraversalVertexProgram.java       |  16 +-
 .../computer/traversal/TraverserExecutor.java   |   9 +-
 .../mapreduce/TraverserMapReduce.java           | 159 -------------------
 .../traversal/step/map/OrderGlobalStep.java     |  52 +-----
 .../step/util/CollectingBarrierStep.java        |  35 +++-
 .../ComputerVerificationStrategy.java           |   9 +-
 .../structure/TinkerGraphPlayTest.java          |   2 +-
 7 files changed, 46 insertions(+), 236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 5b11f84..35d72cd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -29,7 +29,6 @@ import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.computer.VertexComputeKey;
 import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
@@ -42,12 +41,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaCollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
@@ -135,13 +132,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         this.traversalMatrix = new TraversalMatrix<>(this.traversal.get());
         // if results will be serialized out, don't save halted traversers across the cluster
         this.keepDistributedHaltedTraversers = !(this.traversal.get().getParent().asStep().getNextStep() instanceof ComputerResultStep);
-        // dangling MapReduces left
-        if (this.traversal.get().getEndStep() instanceof SampleGlobalStep ||
-                this.traversal.get().getEndStep() instanceof LambdaCollectingBarrierStep ||
-                this.traversal.get().getEndStep() instanceof AggregateStep) {
-            this.mapReducers.add(new TraverserMapReduce(this.traversal.get()));
-            this.keepDistributedHaltedTraversers = true;
-        }
         // register MapReducer memory compute keys
         this.memoryComputeKeys.add(MemoryComputeKey.of(VOTE_TO_HALT, Operator.and, false, true));
         for (final MapReducer<?, ?, ?, ?, ?> mapReducer : TraversalHelper.getStepsOfAssignableClassRecursively(MapReducer.class, this.traversal.get())) {
@@ -207,7 +197,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
                     if (traverser.asAdmin().isHalted()) {
                         traverser.asAdmin().detach();
                         haltedTraversers.add((Traverser.Admin) traverser);
-                        memory.add(HALTED_TRAVERSERS, new TraverserSet<>(traverser.asAdmin().split()));
+                        memory.add(HALTED_TRAVERSERS, new TraverserSet<>(traverser.asAdmin()));
                     } else
                         aliveTraverses.add((Traverser.Admin) traverser);
                 });
@@ -268,7 +258,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             graphComputing.getMemoryComputeKey().ifPresent(memoryKey -> {
                 final String key = memoryKey.getKey();
                 if (memory.exists(key) && toProcessMemoryKeys.contains(key)) {
-                    if (graphComputing instanceof RangeGlobalStep || graphComputing instanceof TailGlobalStep || graphComputing instanceof OrderGlobalStep || graphComputing instanceof DedupGlobalStep) {
+                    if (graphComputing instanceof RangeGlobalStep || graphComputing instanceof TailGlobalStep || (graphComputing instanceof CollectingBarrierStep && !(graphComputing instanceof AggregateStep)) || graphComputing instanceof DedupGlobalStep) {
                         traverserSet.addAll(((TraverserSet) graphComputing.generateFinalResult(memory.get(key))));
                     } else if (graphComputing instanceof ReducingBarrierStep || graphComputing instanceof SupplyingBarrierStep) {
                         final Traverser.Admin traverser = this.traversal.get().getTraverserGenerator().generate(graphComputing.generateFinalResult(memory.get(key)), ((Step) graphComputing), 1l);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
index f6ee905..65ac37f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
@@ -27,8 +27,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
@@ -131,13 +131,12 @@ public final class TraverserExecutor {
         } else if (step instanceof SupplyingBarrierStep) {
             memory.add(step.getId(), true);
             memory.add(TraversalVertexProgram.MUTATED_MEMORY_KEYS, new HashSet<>(Collections.singleton(step.getId())));
-        } else if (step instanceof RangeGlobalStep || step instanceof TailGlobalStep || step instanceof OrderGlobalStep) {
+        } else if (step instanceof RangeGlobalStep || step instanceof TailGlobalStep || step instanceof CollectingBarrierStep && !(step instanceof AggregateStep)) {
             ((Bypassing) step).setBypass(true);
             final TraverserSet<?> traverserSet = new TraverserSet<>();
             step.forEachRemaining(traverser -> {
-                if (!(step instanceof OrderGlobalStep)) //  TODO: this is so we get the properties as DetachedElement will be used, not ReferenceElement
+                if (!(step instanceof CollectingBarrierStep)) //  TODO: this is so we get the properties as DetachedElement will be used, not ReferenceElement
                     traverser.asAdmin().detach();
-
                 traverserSet.add((Traverser.Admin) traverser);
             });
             memory.add(step.getId(), traverserSet);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
deleted file mode 100644
index 0c7e7aa..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
+++ /dev/null
@@ -1,159 +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.computer.traversal.step.sideEffect.mapreduce;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.Attachable;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraverserMapReduce implements MapReduce<Comparable, Traverser<?>, Comparable, Traverser<?>, Iterator<Traverser<?>>> {
-
-    private Traversal.Admin<?, ?> traversal;
-    private Comparator<Comparable> comparator = null;
-    private CollectingBarrierStep<?> collectingBarrierStep = null;
-    private boolean attachHaltedTraverser = false;
-
-    private TraverserMapReduce() {
-    }
-
-    public TraverserMapReduce(final Traversal.Admin<?, ?> traversal) {
-        this.traversal = traversal;
-        this.genericLoadState();
-    }
-
-    @Override
-    public TraverserMapReduce clone() {
-        try {
-            final TraverserMapReduce clone = (TraverserMapReduce) super.clone();
-            clone.traversal = this.traversal.clone();
-            clone.genericLoadState();
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void loadState(final Graph graph, final Configuration configuration) {
-        this.traversal = TraversalVertexProgram.getTraversal(graph, configuration);
-        this.genericLoadState();
-    }
-
-    private void genericLoadState() {
-        final Step<?, ?> traversalEndStep = traversal.getEndStep();
-        if (traversalEndStep instanceof CollectingBarrierStep) {
-            this.collectingBarrierStep = ((CollectingBarrierStep<?>) traversalEndStep).clone();
-            if (this.collectingBarrierStep instanceof TraversalParent) {
-                this.attachHaltedTraverser = ((TraversalParent) this.collectingBarrierStep).getLocalChildren().stream().filter(TraversalHelper::isBeyondElementId).findAny().isPresent();
-            }
-        }
-    }
-
-    @Override
-    public boolean doStage(final Stage stage) {
-        return stage.equals(Stage.MAP) || null != this.collectingBarrierStep;
-    }
-
-    @Override
-    public void map(final Vertex vertex, final MapEmitter<Comparable, Traverser<?>> emitter) {
-        vertex.<TraverserSet<Object>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> {
-            if (this.attachHaltedTraverser && !(traverser.get() instanceof Edge)) {
-                traverser = traverser.clone().asAdmin();
-                traverser.attach(Attachable.Method.get(vertex));
-            }
-            if (null != this.comparator)    // TODO: I think we shouldn't ever single key it  -- always double emit to load balance the servers.
-                emitter.emit(traverser, traverser);
-            else
-                emitter.emit(traverser);
-        }));
-    }
-
-    @Override
-    public Optional<Comparator<Comparable>> getMapKeySort() {
-        return Optional.ofNullable(this.comparator);
-    }
-
-    @Override
-    public void combine(final Comparable comparable, final Iterator<Traverser<?>> values, final ReduceEmitter<Comparable, Traverser<?>> emitter) {
-        final TraverserSet<?> traverserSet = new TraverserSet<>();
-        while (values.hasNext()) {
-            traverserSet.add((Traverser.Admin) values.next().asAdmin());
-        }
-        IteratorUtils.removeOnNext(traverserSet.iterator()).forEachRemaining(traverser -> {
-            if (null != this.comparator)
-                emitter.emit(traverser, traverser);
-            else
-                emitter.emit(traverser);
-        });
-    }
-
-    @Override
-    public void reduce(final Comparable comparable, final Iterator<Traverser<?>> values, final ReduceEmitter<Comparable, Traverser<?>> emitter) {
-        final TraverserSet<?> traverserSet = new TraverserSet<>();
-        while (values.hasNext()) {
-            traverserSet.add((Traverser.Admin) values.next().asAdmin());
-        }
-        IteratorUtils.removeOnNext(traverserSet.iterator()).forEachRemaining(emitter::emit);
-    }
-
-    @Override
-    public Iterator<Traverser<?>> generateFinalResult(final Iterator<KeyValue<Comparable, Traverser<?>>> keyValues) {
-        if (null != this.collectingBarrierStep) {
-            final TraverserSet<?> traverserSet = new TraverserSet<>();
-            while (keyValues.hasNext()) {
-                traverserSet.add((Traverser.Admin) keyValues.next().getValue().asAdmin());
-            }
-            this.collectingBarrierStep.barrierConsumer((TraverserSet) traverserSet);
-            return (Iterator) traverserSet.iterator();
-        } else {
-            return IteratorUtils.map(keyValues, KeyValue::getValue);
-        }
-    }
-
-    @Override
-    public String getMemoryKey() {
-        return TraversalVertexProgram.HALTED_TRAVERSERS;
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.mapReduceString(this, this.traversal.toString());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
index f1cc6e6..b241ea9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
@@ -18,14 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
-import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
-import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComparatorTraverser;
@@ -38,20 +34,17 @@ import org.apache.tinkerpop.gremlin.util.function.ChainedComparator;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-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)
  */
-public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S>, TraversalParent, ByModulating, GraphComputing<TraverserSet<S>>, Bypassing {
+public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S>, TraversalParent, ByModulating {
 
     private List<Comparator<S>> comparators = new ArrayList<>();
     private ChainedComparator chainedComparator = null;
-    private boolean bypass = false;
 
     public OrderGlobalStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -59,9 +52,6 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
 
     @Override
     public void barrierConsumer(final TraverserSet<S> traverserSet) {
-        if (this.bypass)
-            return;
-
         if (null == this.chainedComparator)
             this.chainedComparator = new ChainedComparator<>(ComparatorTraverser.convertComparator((List) this.getComparators()));
         if (this.chainedComparator.isShuffle())
@@ -134,44 +124,4 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
         clone.chainedComparator = null;
         return clone;
     }
-
-    @Override
-    public void onGraphComputer() {
-
-    }
-
-    @Override
-    public Optional<MemoryComputeKey> getMemoryComputeKey() {
-        return Optional.of(MemoryComputeKey.of(this.getId(), Operator.addAll, false, true));
-    }
-
-    @Override
-    public TraverserSet<S> generateFinalResult(final TraverserSet<S> traverserSet) {
-        final TraverserSet<S> resultSet = new TraverserSet<>();
-        this.addStarts((Iterator) traverserSet.iterator());
-        this.forEachRemaining(t -> resultSet.add(t.asAdmin()));
-        return resultSet;
-    }
-
-    @Override
-    public void setBypass(final boolean bypass) {
-        this.bypass = bypass;
-    }
-
-    ////////////////
-
-    /*public static final class OrderBiOperator implements BinaryOperator<TraverserSet>, Serializable {
-
-
-        public OrderBiOperator() {
-
-        }
-
-        @Override
-        public TraverserSet apply(final TraverserSet mutatingSeed, final TraverserSet set) {
-            mutatingSeed.addAll(set);
-            return mutatingSeed;
-        }
-    }*/
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
index 0c8283f..5b55846 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -18,21 +18,27 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
+import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
+import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implements Barrier {
+public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implements Barrier, GraphComputing<TraverserSet<S>>, Bypassing {
     private TraverserSet<S> traverserSet = new TraverserSet<>();
+    private boolean bypass = false;
 
     private int maxBarrierSize;
 
@@ -57,12 +63,14 @@ public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implem
         if (this.starts.hasNext()) {
             if (Integer.MAX_VALUE == this.maxBarrierSize) {
                 this.starts.forEachRemaining(this.traverserSet::add);
-                this.barrierConsumer(this.traverserSet);
+                if (!this.bypass)
+                    this.barrierConsumer(this.traverserSet);
             } else {
                 while (this.starts.hasNext() && this.traverserSet.size() < this.maxBarrierSize) {
                     this.traverserSet.add(this.starts.next());
                 }
-                this.barrierConsumer(this.traverserSet);
+                if (!this.bypass)
+                    this.barrierConsumer(this.traverserSet);
             }
         }
     }
@@ -99,4 +107,25 @@ public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implem
         super.reset();
         this.traverserSet.clear();
     }
+
+    @Override
+    public void onGraphComputer() {
+
+    }
+
+    @Override
+    public Optional<MemoryComputeKey> getMemoryComputeKey() {
+        return Optional.of(MemoryComputeKey.of(this.getId(), Operator.addAll, false, true));
+    }
+
+    @Override
+    public TraverserSet<S> generateFinalResult(final TraverserSet<S> traverserSet) {
+        this.barrierConsumer(traverserSet);
+        return traverserSet;
+    }
+
+    @Override
+    public void setBypass(final boolean bypass) {
+        this.bypass = bypass;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 61bcb31..ce67ce3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -32,7 +33,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalSte
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaCollectingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
@@ -40,6 +40,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareSte
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 
@@ -55,7 +56,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
 
     private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
     private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
-            InjectStep.class, Mutating.class, SubgraphStep.class
+            InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
     ));
 
     private ComputerVerificationStrategy() {
@@ -101,8 +102,8 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
             if (step instanceof ReducingBarrierStep && step.getTraversal().getParent() instanceof UnionStep)
                 throw new VerificationException("Reducing barriers within union()-step are not allowed: " + step, traversal);
 
-            if ((step instanceof LambdaCollectingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof TraversalVertexProgramStep)))
-                throw new VerificationException("Global traversals on GraphComputer may not contain mid-traversal LambdaCollectingBarrierSteps: " + step, traversal);
+            if (TraversalHelper.getRootTraversal(traversal).getTraverserRequirements().contains(TraverserRequirement.ONE_BULK))
+                throw new VerificationException("One bulk us currently not supported: " + step, traversal);
 
             if (step instanceof DedupGlobalStep && (!((DedupGlobalStep) step).getLocalChildren().isEmpty() || !((DedupGlobalStep) step).getScopeKeys().isEmpty()))
                 throw new VerificationException("Global traversals on GraphComputer may not contain by()-projecting de-duplication steps: " + step, traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b654c84d/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index bb6b687..0078dd4 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -71,7 +71,7 @@ public class TinkerGraphPlayTest {
         GraphTraversalSource g = graph.traversal().withComputer();//GraphTraversalSource.computer());
         //System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
         //System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
-        final Traversal<?,?> traversal = g.V().both().groupCount("a").out().cap("a").select(Column.keys).unfold().both().groupCount("a").cap("a"); // unfold.select(values)    [{v[1]=6, v[2]=2, v[3]=6, v[4]=6, v[5]=2, v[6]=2}]
+        final Traversal<?,?> traversal = g.E().barrier(); // unfold.select(values)    [{v[1]=6, v[2]=2, v[3]=6, v[4]=6, v[5]=2, v[6]=2}]
 
         System.out.println(traversal.asAdmin().clone().toString());
         final Traversal<?,?> clone = traversal.asAdmin().clone();