TINKERPOP-1688 Add annotations to TraversalMetrics pretty print

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

Branch: refs/heads/TINKERPOP-1489
Commit: a9f48dfe811039c357d12fac7bd7a93113750d05
Parents: b9a439a
Author: Stephen Mallette <[email protected]>
Authored: Thu Jun 8 12:37:34 2017 -0400
Committer: Stephen Mallette <[email protected]>
Committed: Mon Jun 19 13:44:27 2017 -0400

----------------------------------------------------------------------
 .../traversal/util/DefaultTraversalMetrics.java | 47 +++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9f48dfe/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index ecf28e0..c5f290a 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -121,7 +121,7 @@ public final class DefaultTraversalMetrics implements 
TraversalMetrics, Serializ
             // Grab the values
             final Long itemCount = m.getCount(ELEMENT_COUNT_ID);
             final Long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
-            Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
+            final Double percentDur = (Double) 
m.getAnnotation(PERCENT_DURATION_KEY);
 
             // Build the row string
 
@@ -145,10 +145,55 @@ public final class DefaultTraversalMetrics implements 
TraversalMetrics, Serializ
                 sb.append(String.format(" %8.2f", percentDur));
             }
 
+            // process any annotations
+            final Map<String,Object> annotations = m.getAnnotations();
+            if (!annotations.isEmpty()) {
+                // ignore the PERCENT_DURATION_KEY as that is a TinkerPop 
annotation that is displayed by default
+                annotations.entrySet().stream().filter(kv -> 
!kv.getKey().equals(PERCENT_DURATION_KEY)).forEach(kv -> {
+                    final String prefix = "    \\_";
+                    final String separator = "=";
+                    final String k = prefix + 
StringUtils.abbreviate(kv.getKey(), 30);
+                    final int valueIndentLen = separator.length() + k.length() 
+ indent;
+                    final int leftover = 110 - valueIndentLen;
+
+                    final String[] splitValues = 
splitOnSize(kv.getValue().toString(), leftover);
+                    for (int ix = 0; ix < splitValues.length; ix++) {
+                        // the first lines gets the annotation prefix. the 
rest are indented to the separator
+                        if (ix == 0) {
+                            sb.append(String.format("%n%s", k + separator + 
splitValues[ix]));
+                        } else {
+                            sb.append(String.format("%n%s", 
padLeft(splitValues[ix], valueIndentLen - 1)));
+                        }
+                    }
+                });
+            }
+
             appendMetrics(m.getNested(), sb, indent + 1);
         }
     }
 
+    private static String[] splitOnSize(final String text, final int size) {
+        final String[] ret = new String[(text.length() + size - 1) / size];
+
+        int counter = 0;
+        for (int start = 0; start < text.length(); start += size) {
+            ret[counter] = text.substring(start, Math.min(text.length(), start 
+ size));
+            counter++;
+        }
+
+        return ret;
+    }
+
+    private static String padLeft(final String text, final int amountToPad) {
+        // not sure why this method needed to exist. stupid string format 
stuff and commons utilities wouldn't
+        // work for some reason in the context this method was used above.
+        String newText = text;
+        for (int ix = 0; ix < amountToPad; ix++) {
+            newText = " " + newText;
+        }
+        return newText;
+    }
+
     private void computeTotals() {
         // Create temp list of ordered metrics
         final List<MutableMetrics> tempMetrics = new 
ArrayList<>(this.metrics.size());

Reply via email to