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();