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/06/15 13:00:51 UTC

tinkerpop git commit: TraversalExplanation now supports word wrapping and VertexProgamStep.toStrings() have GraphFilter information attached.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1332 [created] fc62efec4


TraversalExplanation now supports word wrapping and VertexProgamStep.toStrings() have GraphFilter information attached.


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

Branch: refs/heads/TINKERPOP-1332
Commit: fc62efec4d578b5e767676b04789cf35535f53f0
Parents: 1a526eb
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 15 07:00:44 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 15 07:00:44 2016 -0600

----------------------------------------------------------------------
 .../gremlin/process/computer/GraphFilter.java   | 11 ++++
 .../step/map/PageRankVertexProgramStep.java     |  3 +-
 .../step/map/PeerPressureVertexProgramStep.java |  3 +-
 .../step/map/ProgramVertexProgramStep.java      |  3 +-
 .../step/map/TraversalVertexProgramStep.java    |  3 +-
 .../traversal/util/TraversalExplanation.java    | 56 ++++++++++++++++++--
 .../util/TraversalExplanationTest.java          | 42 ++++++++++++++-
 7 files changed, 111 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java
index 59c654d..3718d16 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java
@@ -83,6 +83,17 @@ public final class GraphFilter implements Cloneable, Serializable {
     private Map<Direction, Map<String, Legal>> edgeLegality = new HashMap<>();
     private boolean allowNoEdges = false;
 
+    public GraphFilter() {
+        // no args constructor
+    }
+
+    public GraphFilter(final Computer computer) {
+        if (null != computer.getVertices())
+            this.setVertexFilter(computer.getVertices());
+        if (null != computer.getEdges())
+            this.setEdgeFilter(computer.getEdges());
+    }
+
     /**
      * Set the filter for selecting vertices from the source graph.
      * The vertex filter can only access the vertex, its properties, and its properties properties.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
index fcb2eec..364d092 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
@@ -19,6 +19,7 @@
 
 package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
 
+import org.apache.tinkerpop.gremlin.process.computer.GraphFilter;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.lambda.HaltedTraversersCountTraversal;
@@ -78,7 +79,7 @@ public final class PageRankVertexProgramStep extends VertexProgramStep implement
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.edgeTraversal.get(), this.pageRankProperty, this.times);
+        return StringFactory.stepString(this, this.edgeTraversal.get(), this.pageRankProperty, this.times, new GraphFilter(this.computer));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java
index 0ea5112..47d4160 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java
@@ -19,6 +19,7 @@
 
 package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
 
+import org.apache.tinkerpop.gremlin.process.computer.GraphFilter;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.lambda.HaltedTraversersCountTraversal;
@@ -81,7 +82,7 @@ public final class PeerPressureVertexProgramStep extends VertexProgramStep imple
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.edgeTraversal.get(), this.clusterProperty, this.times);
+        return StringFactory.stepString(this, this.edgeTraversal.get(), this.clusterProperty, this.times, new GraphFilter(this.computer));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ProgramVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ProgramVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ProgramVertexProgramStep.java
index 82e70dd..31eb04b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ProgramVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ProgramVertexProgramStep.java
@@ -20,6 +20,7 @@
 package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
 
 import org.apache.commons.configuration.MapConfiguration;
+import org.apache.tinkerpop.gremlin.process.computer.GraphFilter;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
@@ -67,6 +68,6 @@ public final class ProgramVertexProgramStep extends VertexProgramStep {
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.toStringOfVertexProgram);
+        return StringFactory.stepString(this, this.toStringOfVertexProgram, new GraphFilter(this.computer));
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
index 58e44a2..0eee43a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
@@ -20,6 +20,7 @@
 package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
 
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.GraphFilter;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.MemoryTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
@@ -54,7 +55,7 @@ public final class TraversalVertexProgramStep extends VertexProgramStep implemen
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.computerTraversal.get());
+        return StringFactory.stepString(this, this.computerTraversal.get(), new GraphFilter(this.computer));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanation.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanation.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanation.java
index 98cef69..675291d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanation.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanation.java
@@ -85,10 +85,26 @@ public class TraversalExplanation implements Serializable {
      */
     @Override
     public String toString() {
+        final int maxLineLength = 75;
         final String originalTraversal = "Original Traversal";
         final String finalTraversal = "Final Traversal";
-        final int maxStrategyColumnLength = this.strategyTraversals.stream().map(Pair::getValue0).map(Object::toString).map(String::length).max(Comparator.<Integer>naturalOrder()).orElse(15);
-        final int maxTraversalColumnLength = Stream.concat(Stream.of(Pair.with(null, this.traversal)), this.strategyTraversals.stream()).map(Pair::getValue1).map(Object::toString).map(String::length).max(Comparator.<Integer>naturalOrder()).get();
+        final int maxStrategyColumnLength = this.strategyTraversals.stream()
+                .map(Pair::getValue0)
+                .map(Object::toString)
+                .map(String::length)
+                .max(Comparator.naturalOrder())
+                .orElse(15);
+        final int newLineIndent = maxStrategyColumnLength + 10;
+        int maxTraversalColumnLength = Stream.concat(Stream.of(Pair.with(null, this.traversal)), this.strategyTraversals.stream())
+                .map(Pair::getValue1)
+                .map(Object::toString)
+                .map(s -> wordWrap(s, maxLineLength, newLineIndent))
+                .flatMap(s -> Stream.of(s.split("\n")))
+                .map(String::trim)
+                .map(s -> s.trim().startsWith("[") ? s : "   " + s) // 3 indent on new lines
+                .map(String::length)
+                .max(Comparator.naturalOrder())
+                .get();
 
         final StringBuilder builder = new StringBuilder("Traversal Explanation\n");
         for (int i = 0; i < (maxStrategyColumnLength + 7 + maxTraversalColumnLength); i++) {
@@ -99,7 +115,7 @@ public class TraversalExplanation implements Serializable {
         for (int i = 0; i < maxStrategyColumnLength - originalTraversal.length() + 7; i++) {
             builder.append(" ");
         }
-        builder.append(this.traversal.toString());
+        builder.append(wordWrap(this.traversal.toString(), maxLineLength, newLineIndent));
         builder.append("\n\n");
         for (final Pair<TraversalStrategy, Traversal.Admin<?, ?>> pairs : this.strategyTraversals) {
             builder.append(pairs.getValue0());
@@ -111,15 +127,45 @@ public class TraversalExplanation implements Serializable {
             for (int i = 0; i < 3; i++) {
                 builder.append(" ");
             }
-            builder.append(pairs.getValue1().toString()).append("\n");
+            builder.append(wordWrap(pairs.getValue1().toString(), maxLineLength, newLineIndent)).append("\n");
         }
         builder.append("\n");
         builder.append(finalTraversal);
         for (int i = 0; i < maxStrategyColumnLength - finalTraversal.length() + 7; i++) {
             builder.append(" ");
         }
-        builder.append(this.strategyTraversals.size() > 0 ? this.strategyTraversals.get(this.strategyTraversals.size() - 1).getValue1() : this.traversal);
+        builder.append(wordWrap((this.strategyTraversals.size() > 0 ?
+                this.strategyTraversals.get(this.strategyTraversals.size() - 1).getValue1().toString() :
+                this.traversal.toString()), maxLineLength, newLineIndent));
         return builder.toString();
     }
 
+    private String wordWrap(final String longString, final int maxLengthPerLine, final int newLineIndent) {
+        if (longString.length() <= maxLengthPerLine)
+            return longString;
+
+        StringBuilder builder = new StringBuilder();
+        int counter = 0;
+        for (final String shortString : longString.split(", ")) {
+            if (0 == counter)
+                builder.append(shortString).append(", ");
+            else if (counter < maxLengthPerLine)
+                builder.append(shortString).append(", ");
+            else {
+                builder.deleteCharAt(builder.length() - 1); // remove the " "
+                builder.append("\n");
+                for (int i = 0; i < newLineIndent; i++) {
+                    builder.append(" ");
+                }
+                builder.append(shortString).append(", ");
+                counter = 0;
+            }
+            counter = counter + shortString.length();
+        }
+
+        return builder
+                .delete(builder.length() - 2, builder.length()) // remove the final ", "
+                .toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fc62efec/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
index 3059879..57841e4 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
@@ -22,11 +22,15 @@ package org.apache.tinkerpop.gremlin.process.traversal.util;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.junit.Test;
 
+import java.util.stream.Stream;
+
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -43,6 +47,40 @@ public class TraversalExplanationTest {
     }
 
     @Test
+    public void shouldWordWrapCorrectly() {
+        GraphTraversal<?, ?> traversal = __.V().out().out();
+        String toString = traversal.explain().toString();
+        assertFalse(toString.contains("VertexStep(OUT,vertex),\n"));
+        //System.out.println(toString);
+        ///
+        traversal = __.V().out().out().out().out();
+        toString = traversal.explain().toString();
+        assertTrue(toString.contains("VertexStep(OUT,vertex),\n"));
+        //System.out.println(toString);
+        ///
+        for (int i = 0; i < 30; i++) {
+            traversal = __.V();
+            for (int j = 0; j < i; j++) {
+                traversal.out();
+            }
+            traversal.asAdmin().setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class));
+            toString = traversal.explain().toString();
+            if (i < 4)
+                assertFalse(toString.contains("VertexStep(OUT,vertex),\n"));
+            else {
+                assertFalse(Stream.of(toString.split("\n"))
+                        .filter(s -> s.startsWith(" "))
+                        .map(String::trim)
+                        .filter(s -> Character.isLowerCase(s.charAt(0)))
+                        .findAny()
+                        .isPresent()); // all indented word wraps should start with steps
+                assertTrue(toString.contains("VertexStep(OUT,vertex),\n"));
+            }
+            //System.out.println(toString);
+        }
+    }
+
+    @Test
     public void shouldApplyStrategiesCorrectly() {
         Traversal.Admin<?, ?> traversal = __.out().count().asAdmin();
         traversal.setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class));
@@ -64,8 +102,10 @@ public class TraversalExplanationTest {
         ///
         traversal = __.outE().inV().group().by(__.inE().outV().groupCount().by(__.both().count().is(P.gt(2)))).asAdmin();
         traversal.setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class).clone());
+        // System.out.println(traversal.explain());
         found = 0;
-        for (final String line : traversal.explain().toString().split("\n")) {
+        for (final String line : traversal.explain().toString().split("]\n")) { // need to split cause of word wrap
+            //System.out.println(line + "\n\n");
             if (line.contains("IncidentToAdjacentStrategy") && line.contains("[VertexStep(IN,vertex)"))
                 found++;
             if (line.contains("IncidentToAdjacentStrategy") && line.contains("[VertexStep(OUT,vertex)"))