You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2015/07/23 20:13:50 UTC

[05/10] incubator-tinkerpop git commit: Used aggregate() instead of fold()/unfold() for the GephiTraversalVisualizationStrategy.

Used aggregate() instead of fold()/unfold() for the GephiTraversalVisualizationStrategy.

This worked around problems TINKERPOP3-780 and offers better performance.


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

Branch: refs/heads/master
Commit: 558bdad5321215a69368d30372373585d58f64b1
Parents: 20107dc
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Jul 23 11:46:43 2015 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Jul 23 11:46:43 2015 -0400

----------------------------------------------------------------------
 .../GephiTraversalVisualizationStrategy.groovy  | 43 ++++++++++++++++----
 1 file changed, 35 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/558bdad5/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
index f2a80b0..dd9588c 100644
--- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
+++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
@@ -23,13 +23,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalMapStep
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldStep
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.NoOpBarrierStep
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
@@ -44,17 +51,28 @@ import java.util.stream.Collectors
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 @CompileStatic
-class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy>
-        implements TraversalStrategy.DecorationStrategy {
+class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy>
+        implements TraversalStrategy.FinalizationStrategy {
+
+    private static final Set<Class<? extends TraversalStrategy.FinalizationStrategy>> POSTS = new HashSet<>();
+
+    static {
+        POSTS.add(ProfileStrategy.class);
+    }
 
     private final GephiRemoteAcceptor acceptor
 
+    private final String sideEffectKey = "viz-" + UUID.randomUUID()
+
     GephiTraversalVisualizationStrategy(final GephiRemoteAcceptor acceptor) {
         this.acceptor = acceptor
     }
 
     @Override
     void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEngine().isComputer())
+            return
+
         // only apply these strategies if the traversal was :submit to the acceptor - otherwise process as usual
         if (acceptor.traversalSubmittedForViz) {
             final List<GraphStep> graphSteps = TraversalHelper.getStepsOfAssignableClass(GraphStep.class, traversal)
@@ -63,18 +81,27 @@ class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy<Trav
             def List<Step> addAfter = new ArrayList<>()
             addAfter.addAll(TraversalHelper.getStepsOfAssignableClass(EdgeOtherVertexStep.class, traversal))
             addAfter.addAll(TraversalHelper.getStepsOfAssignableClass(EdgeVertexStep.class, traversal))
-            addAfter.addAll(graphSteps.stream().filter { it.returnsVertex() }.collect(Collectors.toList()))
             addAfter.addAll(vertexSteps.stream().filter { it.returnsVertex() }.collect(Collectors.toList()))
+            addAfter.addAll(graphSteps.stream().filter { it.returnsVertex() }.collect(Collectors.toList()))
 
             addAfter.each { Step s ->
-                // add steps in reverse order as they will then appear as: vertex -> barrier -> sideEffect
+                // todo: this should be s simple as vertex -> fold -> sideEffect -> unfold TINKERPOP3-780
                 TraversalHelper.insertAfterStep(new LambdaSideEffectStep(traversal, { Traverser traverser ->
-                    acceptor.updateVisitedVertices()
-                    traverser.get().each { Vertex v -> acceptor.visitVertexInGephi(v) }
-                    Thread.sleep(acceptor.vizStepDelay)
+                    final BulkSet<Vertex> vertices = ((BulkSet<Vertex>) traverser.sideEffects(sideEffectKey))
+                    if (!vertices.isEmpty()) {
+                        acceptor.updateVisitedVertices()
+                        vertices.forEach { Vertex v, Long l -> acceptor.visitVertexInGephi(v) }
+                        vertices.clear()
+                        Thread.sleep(acceptor.vizStepDelay)
+                    }
                 }), s, traversal)
-                TraversalHelper.insertAfterStep(new NoOpBarrierStep(traversal), s, traversal)
+                TraversalHelper.insertAfterStep(new AggregateStep(traversal, sideEffectKey), s, traversal)
             }
         }
     }
+
+    @Override
+    public Set<Class<? extends TraversalStrategy.FinalizationStrategy>> applyPost() {
+        return POSTS;
+    }
 }