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/25 18:53:22 UTC

incubator-tinkerpop git commit: TailGlobalStep is no longer an OLAP end step. CollectingBarriers are up next -- Aggregate, Order, Dedup.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1166 d1812f806 -> e6d9d6d25


TailGlobalStep is no longer an OLAP end step. CollectingBarriers are up next -- Aggregate, Order, Dedup.


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

Branch: refs/heads/TINKERPOP-1166
Commit: e6d9d6d2581dd3ef4c32d336df0eb7a8989bbaba
Parents: d1812f8
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Feb 25 10:53:18 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Feb 25 10:53:18 2016 -0700

----------------------------------------------------------------------
 .../traversal/TraversalVertexProgram.java       | 10 +++--
 .../computer/traversal/TraverserExecutor.java   |  6 ++-
 .../traversal/step/filter/RangeGlobalStep.java  |  9 ++--
 .../traversal/step/filter/TailGlobalStep.java   | 45 +++++++++++++++++++-
 .../ComputerVerificationStrategy.java           |  3 +-
 5 files changed, 61 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e6d9d6d2/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 70dbf94..8d8e245 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
@@ -37,6 +37,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 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.RangeGlobalStep;
+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.sideEffect.SideEffectCapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
@@ -120,7 +121,10 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             this.mapReducers.add(mapReducer.getMapReduce());
             this.memoryComputeKeys.add(MemoryComputeKey.of(mapReducer.getMapReduce().getMemoryKey(), MemoryComputeKey.setOperator(), false, false));
         }
-        if (!(this.traversal.get().getEndStep() instanceof SideEffectCapStep) && !(this.traversal.get().getEndStep() instanceof ReducingBarrierStep) && !(this.traversal.get().getEndStep() instanceof RangeGlobalStep)) {
+        if (!(this.traversal.get().getEndStep() instanceof SideEffectCapStep) &&
+                !(this.traversal.get().getEndStep() instanceof ReducingBarrierStep) &&
+                !(this.traversal.get().getEndStep() instanceof RangeGlobalStep) &&
+                !(this.traversal.get().getEndStep() instanceof TailGlobalStep)) {
             this.mapReducers.add(new TraverserMapReduce(this.traversal.get()));
         }
 
@@ -204,8 +208,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
                 graphComputing.getMemoryComputeKey().ifPresent(memoryKey -> {
                     final String key = memoryKey.getKey();
                     if (memory.exists(key)) {
-                        if(graphComputing instanceof RangeGlobalStep) {
-                            memory.set(TraverserMapReduce.TRAVERSERS, ((TraverserSet)graphComputing.generateFinalResult(memory.get(key))).iterator());
+                        if (graphComputing instanceof RangeGlobalStep || graphComputing instanceof TailGlobalStep) {
+                            memory.set(TraverserMapReduce.TRAVERSERS, ((TraverserSet) graphComputing.generateFinalResult(memory.get(key))).iterator());
                         } else {
                             memory.set(key, graphComputing.generateFinalResult(memory.get(key)));
                         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e6d9d6d2/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 18bf48f..95141f4 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
@@ -24,7 +24,9 @@ import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 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.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
@@ -108,8 +110,8 @@ public final class TraverserExecutor {
     private static void drainStep(final Step<?, ?> step, final TraverserSet<?> aliveTraversers, final TraverserSet<?> haltedTraversers, final Memory memory) {
         if (step instanceof ReducingBarrierStep) {
             memory.add(ReducingBarrierStep.REDUCING, step.next().get());
-        } else if (step instanceof RangeGlobalStep) {
-            ((RangeGlobalStep) step).setBypass(true);
+        } else if (step instanceof RangeGlobalStep || step instanceof TailGlobalStep) {
+            ((Bypassing) step).setBypass(true);
             final TraverserSet<?> traverserSet = new TraverserSet<>();
             step.forEachRemaining(traverser -> {
                 traverser.asAdmin().detach();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e6d9d6d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index bf64761..5a43a57 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.io.Serializable;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
@@ -40,7 +41,7 @@ import java.util.function.BinaryOperator;
  * @author Bob Briody (http://bobbriody.com)
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging, GraphComputing<TraverserSet>, Bypassing {
+public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging, GraphComputing<TraverserSet<S>>, Bypassing {
 
     private long low;
     private final long high;
@@ -139,9 +140,9 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
     }
 
     @Override
-    public TraverserSet generateFinalResult(final TraverserSet traverserSet) {
-        final TraverserSet resultSet = new TraverserSet();
-        this.addStarts(traverserSet.iterator());
+    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;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e6d9d6d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
index 19d3d95..2d5c798 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
@@ -18,22 +18,29 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
+import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 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.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 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.io.Serializable;
 import java.util.ArrayDeque;
 import java.util.Collections;
 import java.util.Deque;
+import java.util.Iterator;
+import java.util.Optional;
 import java.util.Set;
+import java.util.function.BinaryOperator;
 
 /**
  * @author Matt Frantz (http://github.com/mhfrantz)
  */
-public final class TailGlobalStep<S> extends AbstractStep<S, S> implements Bypassing {
+public final class TailGlobalStep<S> extends AbstractStep<S, S> implements Bypassing, GraphComputing<TraverserSet<S>> {
 
     private final long limit;
     private Deque<Traverser.Admin<S>> tail;
@@ -116,4 +123,40 @@ public final class TailGlobalStep<S> extends AbstractStep<S, S> implements Bypas
         }
         this.tail.add(start);
     }
+
+    @Override
+    public void onGraphComputer() {
+
+    }
+
+    @Override
+    public Optional<MemoryComputeKey> getMemoryComputeKey() {
+        return Optional.of(MemoryComputeKey.of(this.getId(), new TailBiOperator(this.limit), 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;
+    }
+
+    /////////////////////
+
+    public static final class TailBiOperator implements BinaryOperator<TraverserSet>, Serializable {
+
+        private final long limit;
+
+        public TailBiOperator(final long limit) {
+            this.limit = limit;
+        }
+
+        @Override
+        public TraverserSet apply(final TraverserSet mutatingSeed, final TraverserSet set) {
+            if (mutatingSeed.size() < this.limit)
+                mutatingSeed.addAll(set);
+            return mutatingSeed;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e6d9d6d2/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 ca61103..271e3d3 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
@@ -65,7 +65,6 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
             ReducingBarrierStep.class,
             SupplyingBarrierStep.class,
             OrderGlobalStep.class,
-            TailGlobalStep.class,
             DedupGlobalStep.class));
 
     private ComputerVerificationStrategy() {
@@ -113,7 +112,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
                     throw new VerificationException("The final CollectingBarrierStep can not operate on edges or their properties:" + endStep, traversal);
             }
             ///
-            if (endStep instanceof TailGlobalStep || endStep instanceof DedupGlobalStep)
+            if (endStep instanceof DedupGlobalStep)
                 ((Bypassing) endStep).setBypass(true);
             if (endStep instanceof DedupGlobalStep && !((DedupGlobalStep) endStep).getScopeKeys().isEmpty())
                 throw new VerificationException("Path history de-duplication is not possible in GraphComputer:" + endStep, traversal);