This is an automated email from the ASF dual-hosted git repository.

okram pushed a commit to branch tp4
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/tp4 by this push:
     new 33d48d2  a better explain() model using DecorationStrategy.
33d48d2 is described below

commit 33d48d21d82d5b772a96fd00fc3ab7e596d01c7f
Author: Marko A. Rodriguez <okramma...@gmail.com>
AuthorDate: Tue Mar 19 14:36:49 2019 -0600

    a better explain() model using DecorationStrategy.
---
 .../tinkerpop/language/gremlin/Traversal.java      |  2 +
 .../tinkerpop/machine/bytecode/Compilation.java    | 20 ++---
 .../machine/processor/ExplainProcessor.java        | 82 -------------------
 .../strategy/decoration/ExplainStrategy.java       | 92 ++++++++++++++++++++++
 .../machine/processor/pipes/AbstractStep.java      |  2 +-
 5 files changed, 100 insertions(+), 98 deletions(-)

diff --git 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java
 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java
index af444ec..6b1dd97 100644
--- 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java
+++ 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java
@@ -25,6 +25,7 @@ import 
org.apache.tinkerpop.machine.bytecode.CoreCompiler.Symbols;
 import org.apache.tinkerpop.machine.bytecode.Pred;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
+import org.apache.tinkerpop.machine.strategy.decoration.ExplainStrategy;
 import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.traverser.path.Path;
 
@@ -116,6 +117,7 @@ public class Traversal<C, S, E> implements Iterator<E> {
     }
 
     public Traversal<C, S, String> explain() {
+        this.bytecode.addSourceInstruction(Symbols.WITH_STRATEGY, 
ExplainStrategy.class);
         this.bytecode.addInstruction(this.currentCoefficient, Symbols.EXPLAIN);
         return (Traversal) this;
     }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Compilation.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Compilation.java
index 2e9b8df..397c53a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Compilation.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Compilation.java
@@ -19,14 +19,12 @@
 package org.apache.tinkerpop.machine.bytecode;
 
 import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.processor.ExplainProcessor;
 import org.apache.tinkerpop.machine.processor.FilterProcessor;
 import org.apache.tinkerpop.machine.processor.LoopsProcessor;
 import org.apache.tinkerpop.machine.processor.Processor;
 import org.apache.tinkerpop.machine.processor.ProcessorFactory;
 import org.apache.tinkerpop.machine.structure.EmptyStructure;
 import org.apache.tinkerpop.machine.structure.StructureFactory;
-import org.apache.tinkerpop.machine.traverser.COTraverserFactory;
 import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.traverser.TraverserFactory;
 
@@ -50,19 +48,11 @@ public final class Compilation<C, S, E> implements 
Serializable {
     private transient Processor<C, S, E> processor;
 
     public Compilation(final Bytecode<C> bytecode) {
-        if 
(bytecode.lastInstruction().op().equals(CoreCompiler.Symbols.EXPLAIN)) {
-            this.processorFactory = new ExplainProcessor(bytecode);
-            this.traverserFactory = null;
-            this.functions = Collections.emptyList();
-            this.structureFactory = null;
-
-        } else {
-            BytecodeUtil.strategize(bytecode);
-            this.structureFactory = 
BytecodeUtil.getStructureFactory(bytecode).orElse(EmptyStructure.instance());
-            this.processorFactory = 
BytecodeUtil.getProcessorFactory(bytecode).get();
-            this.traverserFactory = 
BytecodeUtil.getTraverserFactory(bytecode).get();
-            this.functions = CompositeCompiler.compile(bytecode, 
Arrays.asList(CoreCompiler.instance(), 
this.structureFactory.getCompiler().orElse(new CoreCompiler())));
-        }
+        BytecodeUtil.strategize(bytecode);
+        this.structureFactory = 
BytecodeUtil.getStructureFactory(bytecode).orElse(EmptyStructure.instance());
+        this.processorFactory = 
BytecodeUtil.getProcessorFactory(bytecode).get();
+        this.traverserFactory = 
BytecodeUtil.getTraverserFactory(bytecode).get();
+        this.functions = CompositeCompiler.compile(bytecode, 
Arrays.asList(CoreCompiler.instance(), 
this.structureFactory.getCompiler().orElse(new CoreCompiler())));
     }
 
     public Compilation(final ProcessorFactory processorFactory) {
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ExplainProcessor.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ExplainProcessor.java
deleted file mode 100644
index 23262d3..0000000
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ExplainProcessor.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.processor;
-
-import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.bytecode.CompositeCompiler;
-import org.apache.tinkerpop.machine.bytecode.CoreCompiler;
-import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
-import org.apache.tinkerpop.machine.strategy.Strategy;
-import org.apache.tinkerpop.machine.structure.EmptyStructure;
-import org.apache.tinkerpop.machine.traverser.ShellTraverser;
-import org.apache.tinkerpop.machine.traverser.Traverser;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ExplainProcessor extends SimpleProcessor<Long, String, 
String> {
-
-    public ExplainProcessor(final Bytecode bytecode) {
-        bytecode.getInstructions().remove(bytecode.getInstructions().size() - 
1);
-        super.traverser = new ShellTraverser<>(LongCoefficient.create(), 
ExplainProcessor.processBytecode(bytecode));
-    }
-
-    @Override
-    public void addStart(final Traverser<Long, String> traverser) {
-        throw new IllegalStateException("This shouldn't occur"); // TODO: 
exception handling system
-    }
-
-    private static String processBytecode(final Bytecode<Long> bytecode) {
-        final Map<String, String> explain = new LinkedHashMap<>();
-        explain.put("Original", bytecode.toString());
-        for (final Strategy strategy : BytecodeUtil.getStrategies(bytecode)) {
-            BytecodeUtil.strategize(bytecode, strategy);
-            explain.put(strategy.toString(), bytecode.toString());
-        }
-        int maxLength = 0;
-        for (final String key : explain.keySet()) {
-            if (maxLength < key.length())
-                maxLength = key.length();
-        }
-        final StringBuilder builder = new StringBuilder();
-        for (final Map.Entry<String, String> entry : explain.entrySet()) {
-            final int spaces = maxLength - entry.getKey().length();
-            builder.append(entry.getKey());
-            for (int i = 0; i < spaces; i++) {
-                builder.append(" ");
-            }
-            builder.append("\t\t").append(entry.getValue()).append("\n");
-        }
-        final String functions = CompositeCompiler.compile(bytecode, 
Arrays.asList(CoreCompiler.instance(),
-                
BytecodeUtil.getStructureFactory(bytecode).orElse(EmptyStructure.instance()).getCompiler().orElse(new
 CoreCompiler()))).toString();
-
-        builder.append("Final");
-        for (int i = 0; i < maxLength - "Final".length(); i++) {
-            builder.append(" ");
-        }
-        builder.append("\t\t").append(functions);
-        return builder.toString();
-
-    }
-}
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
new file mode 100644
index 0000000..44d7ded
--- /dev/null
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.strategy.decoration;
+
+import org.apache.tinkerpop.machine.bytecode.Bytecode;
+import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
+import org.apache.tinkerpop.machine.bytecode.Compilation;
+import org.apache.tinkerpop.machine.bytecode.CoreCompiler.Symbols;
+import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
+import org.apache.tinkerpop.machine.strategy.Strategy;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ExplainStrategy extends 
AbstractStrategy<Strategy.DecorationStrategy> implements 
Strategy.DecorationStrategy {
+
+    private static final String ORIGINAL = "Original";
+    private static final String COMPILATION = "Compilation";
+    private static final String EXECUTION_PLAN = "Execution Plan";
+
+    @Override
+    public <C> void apply(final Bytecode<C> bytecode) {
+        if (bytecode.lastInstruction().op().equals(Symbols.EXPLAIN)) {
+            bytecode.getInstructions().remove(bytecode.lastInstruction());
+            final Bytecode<C> clone = bytecode.clone();
+            bytecode.getInstructions().clear();
+            bytecode.addInstruction(
+                    BytecodeUtil.getCoefficient(clone).get(),
+                    Symbols.INJECT,
+                    ExplainStrategy.processBytecode(clone));
+        }
+    }
+
+    private static <C> String processBytecode(final Bytecode<C> bytecode) {
+        final Map<String, String> explain = new LinkedHashMap<>();
+        explain.put(ORIGINAL, bytecode.toString());
+        for (final Strategy strategy : BytecodeUtil.getStrategies(bytecode)) {
+            BytecodeUtil.strategize(bytecode, strategy);
+            explain.put(strategy.toString(), bytecode.toString());
+        }
+        final Compilation<C, ?, ?> compilation = Compilation.compile(bytecode);
+        explain.put(COMPILATION, compilation.getFunctions().toString());
+        explain.put(EXECUTION_PLAN + " [" + 
BytecodeUtil.getProcessorFactory(bytecode).get().getClass().getSimpleName() + 
"]", compilation.getProcessor().toString());
+
+        int maxLength = 0;
+        for (final String key : explain.keySet()) {
+            if (maxLength < key.length())
+                maxLength = key.length();
+        }
+        final StringBuilder builder = new StringBuilder();
+        for (final Map.Entry<String, String> entry : explain.entrySet()) {
+            if (entry.getKey().equals(COMPILATION)) {
+                for (int i = 0; i < maxLength; i++) {
+                    builder.append("-");
+                }
+                builder.append("\n");
+            }
+            builder.append(entry.getKey());
+            ExplainStrategy.addSpaces(builder, entry.getKey(), maxLength);
+            builder.append("\t\t").append(entry.getValue()).append("\n");
+        }
+        builder.replace(builder.length() - 1, builder.length(), "");
+        return builder.toString();
+
+    }
+
+    private static void addSpaces(final StringBuilder builder, final String 
current, final int maxLength) {
+        final int spaces = maxLength - current.length();
+        for (int i = 0; i < spaces; i++) {
+            builder.append(" ");
+        }
+    }
+}
diff --git 
a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/AbstractStep.java
 
b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/AbstractStep.java
index f1243f2..1967d2e 100644
--- 
a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/AbstractStep.java
+++ 
b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/AbstractStep.java
@@ -35,6 +35,6 @@ abstract class AbstractStep<C, S, E> implements Step<C, S, E> 
{
 
     @Override
     public String toString() {
-        return this.function.toString();
+        return this.getClass().getSimpleName() + "[" + 
this.function.toString() + "]";
     }
 }

Reply via email to