TraversalExplanation now how prettyPrint(), prettyPrint(int maxLineLength), and toString(). Console will detect a TraversalExplaination and use prettyPrint(TerminalFactory.get().getWidth()). If the TerminalFactory is 'bad' then a default reasonable value is use -- people say some Java versions give -1 for getWidth().
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/21a533d4 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/21a533d4 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/21a533d4 Branch: refs/heads/TINKERPOP-1274 Commit: 21a533d4f11e1d8b614230b1073ed0e0603ccaa3 Parents: a4771b6 Author: Marko A. Rodriguez <[email protected]> Authored: Thu Jun 16 12:49:33 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Thu Jun 16 12:49:33 2016 -0600 ---------------------------------------------------------------------- .../tinkerpop/gremlin/console/Console.groovy | 12 ++++++--- .../traversal/util/TraversalExplanation.java | 28 +++++++++++++------- .../util/TraversalExplanationTest.java | 23 ++++++++++++---- 3 files changed, 46 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/21a533d4/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/Console.groovy ---------------------------------------------------------------------- diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/Console.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/Console.groovy index 5108948..3d748eb 100644 --- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/Console.groovy +++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/Console.groovy @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.gremlin.console +import jline.TerminalFactory import org.apache.commons.cli.Option import org.apache.tinkerpop.gremlin.console.commands.GremlinSetCommand import org.apache.tinkerpop.gremlin.console.commands.InstallCommand @@ -29,6 +30,7 @@ import org.apache.tinkerpop.gremlin.console.plugin.PluggedIn import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader import org.apache.tinkerpop.gremlin.groovy.plugin.GremlinPlugin import jline.console.history.FileHistory +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation import org.apache.tinkerpop.gremlin.util.Gremlin import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator import org.codehaus.groovy.tools.shell.AnsiDetector @@ -113,8 +115,8 @@ class Console { groovy = new GremlinGroovysh(mediator) - def commandsToRemove = groovy.getRegistry().commands().findAll{it instanceof SetCommand} - commandsToRemove.each {groovy.getRegistry().remove(it)} + def commandsToRemove = groovy.getRegistry().commands().findAll { it instanceof SetCommand } + commandsToRemove.each { groovy.getRegistry().remove(it) } groovy.register(new GremlinSetCommand(groovy)) groovy.register(new UninstallCommand(groovy, mediator)) groovy.register(new InstallCommand(groovy, mediator)) @@ -209,7 +211,7 @@ class Console { io.out.println(buildResultPrompt() + ((null == object) ? NULL : object.toString())) counter++; } - if(this.tempIterator.hasNext()) + if (this.tempIterator.hasNext()) io.out.println(ELLIPSIS); this.tempIterator = Collections.emptyIterator(); return null @@ -249,6 +251,10 @@ class Console { this.tempIterator = Collections.emptyIterator(); return null } + } else if (result instanceof TraversalExplanation) { + final int width = TerminalFactory.get().getWidth() - 25 + io.out.println(buildResultPrompt() + result.prettyPrint(width < 10 ? 100 : width)) + return null } else { io.out.println(buildResultPrompt() + ((null == result) ? NULL : result.toString())) return null http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/21a533d4/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 675291d..2baccdb 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 @@ -78,14 +78,21 @@ public class TraversalExplanation implements Serializable { return this.traversal; } + @Override + public String toString() { + return this.prettyPrint(Integer.MAX_VALUE); + } + + public String prettyPrint() { + return this.prettyPrint(100); + } + /** * A pretty-print representation of the traversal explanation. * * @return a {@link String} representation of the traversal explanation */ - @Override - public String toString() { - final int maxLineLength = 75; + public String prettyPrint(final int maxLineLength) { final String originalTraversal = "Original Traversal"; final String finalTraversal = "Final Traversal"; final int maxStrategyColumnLength = this.strategyTraversals.stream() @@ -95,10 +102,13 @@ public class TraversalExplanation implements Serializable { .max(Comparator.naturalOrder()) .orElse(15); final int newLineIndent = maxStrategyColumnLength + 10; - int maxTraversalColumnLength = Stream.concat(Stream.of(Pair.with(null, this.traversal)), this.strategyTraversals.stream()) + final int maxTraversalColumn = maxLineLength - newLineIndent; + if (maxTraversalColumn < 1) + throw new IllegalArgumentException("The maximum line length is too small to present the " + TraversalExplanation.class.getSimpleName() + ": " + maxLineLength); + int largestTraversalColumn = Stream.concat(Stream.of(Pair.with(null, this.traversal)), this.strategyTraversals.stream()) .map(Pair::getValue1) .map(Object::toString) - .map(s -> wordWrap(s, maxLineLength, newLineIndent)) + .map(s -> wordWrap(s, maxTraversalColumn, newLineIndent)) .flatMap(s -> Stream.of(s.split("\n"))) .map(String::trim) .map(s -> s.trim().startsWith("[") ? s : " " + s) // 3 indent on new lines @@ -107,7 +117,7 @@ public class TraversalExplanation implements Serializable { .get(); final StringBuilder builder = new StringBuilder("Traversal Explanation\n"); - for (int i = 0; i < (maxStrategyColumnLength + 7 + maxTraversalColumnLength); i++) { + for (int i = 0; i < (maxStrategyColumnLength + 7 + largestTraversalColumn); i++) { builder.append("="); } builder.append("\n"); @@ -115,7 +125,7 @@ public class TraversalExplanation implements Serializable { for (int i = 0; i < maxStrategyColumnLength - originalTraversal.length() + 7; i++) { builder.append(" "); } - builder.append(wordWrap(this.traversal.toString(), maxLineLength, newLineIndent)); + builder.append(wordWrap(this.traversal.toString(), maxTraversalColumn, newLineIndent)); builder.append("\n\n"); for (final Pair<TraversalStrategy, Traversal.Admin<?, ?>> pairs : this.strategyTraversals) { builder.append(pairs.getValue0()); @@ -127,7 +137,7 @@ public class TraversalExplanation implements Serializable { for (int i = 0; i < 3; i++) { builder.append(" "); } - builder.append(wordWrap(pairs.getValue1().toString(), maxLineLength, newLineIndent)).append("\n"); + builder.append(wordWrap(pairs.getValue1().toString(), maxTraversalColumn, newLineIndent)).append("\n"); } builder.append("\n"); builder.append(finalTraversal); @@ -136,7 +146,7 @@ public class TraversalExplanation implements Serializable { } builder.append(wordWrap((this.strategyTraversals.size() > 0 ? this.strategyTraversals.get(this.strategyTraversals.size() - 1).getValue1().toString() : - this.traversal.toString()), maxLineLength, newLineIndent)); + this.traversal.toString()), maxTraversalColumn, newLineIndent)); return builder.toString(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/21a533d4/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 57841e4..3350a87 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 @@ -49,12 +49,12 @@ public class TraversalExplanationTest { @Test public void shouldWordWrapCorrectly() { GraphTraversal<?, ?> traversal = __.V().out().out(); - String toString = traversal.explain().toString(); + String toString = traversal.explain().prettyPrint(); assertFalse(toString.contains("VertexStep(OUT,vertex),\n")); //System.out.println(toString); /// traversal = __.V().out().out().out().out(); - toString = traversal.explain().toString(); + toString = traversal.explain().prettyPrint(); assertTrue(toString.contains("VertexStep(OUT,vertex),\n")); //System.out.println(toString); /// @@ -64,8 +64,8 @@ public class TraversalExplanationTest { traversal.out(); } traversal.asAdmin().setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class)); - toString = traversal.explain().toString(); - if (i < 4) + toString = traversal.explain().prettyPrint(); + if (i < 3) assertFalse(toString.contains("VertexStep(OUT,vertex),\n")); else { assertFalse(Stream.of(toString.split("\n")) @@ -116,6 +116,19 @@ public class TraversalExplanationTest { found++; } assertEquals(4, found); - // System.out.println(traversal.explain()); + // + found = 0; + for (final String line : traversal.explain().prettyPrint().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)")) + found++; + if (line.contains("AdjacentToIncidentStrategy") && line.contains("[VertexStep(BOTH,edge)")) + found++; + if (line.contains("RangeByIsCountStrategy") && line.contains("RangeGlobalStep(0,3)")) + found++; + } + assertEquals(4, found); } }
