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 53ea847  All function types are responsible for their own compilation. 
They have static methods and private constructors.
53ea847 is described below

commit 53ea847380296938a1890489baa0d7ad162a2809
Author: Marko A. Rodriguez <okramma...@gmail.com>
AuthorDate: Sun Mar 24 12:33:41 2019 -0600

    All function types are responsible for their own compilation. They have 
static methods and private constructors.
---
 .../language/gremlin/AbstractTraversal.java        |  5 +-
 .../language/gremlin/common/CommonTraversal.java   |  5 +-
 .../language/gremlin/core/CoreTraversal.java       |  9 ++--
 .../org/apache/tinkerpop/machine/LocalMachine.java |  2 +-
 .../java/org/apache/tinkerpop/machine/Machine.java |  2 +-
 .../tinkerpop/machine/bytecode/Instruction.java    |  6 ++-
 .../machine/bytecode/compiler/CommonCompiler.java  | 55 ++++++++++------------
 .../machine/bytecode/compiler/Compilation.java     | 17 -------
 .../bytecode/compiler/CompilationCircle.java       | 14 +++---
 .../machine/bytecode/compiler/CoreCompiler.java    | 36 ++++++--------
 .../machine/function/barrier/JoinBarrier.java      | 18 +++++--
 .../machine/function/barrier/StallBarrier.java     |  9 +++-
 .../machine/function/branch/BranchBranch.java      |  8 ++--
 .../machine/function/branch/RepeatBranch.java      | 20 ++++++++
 .../machine/function/filter/FilterFilter.java      | 10 +++-
 .../machine/function/filter/HasKeyFilter.java      |  7 ++-
 .../machine/function/filter/HasKeyValueFilter.java |  7 ++-
 .../machine/function/filter/IdentityFilter.java    |  7 ++-
 .../machine/function/filter/IsFilter.java          |  7 ++-
 .../machine/function/flatmap/FlatMapFlatMap.java   |  9 +++-
 .../machine/function/flatmap/UnfoldFlatMap.java    |  9 +++-
 .../{InjectInitial.java => InitialInitial.java}    |  9 +++-
 .../machine/function/map/ConstantMap.java          |  9 +++-
 .../tinkerpop/machine/function/map/IncrMap.java    |  9 +++-
 .../tinkerpop/machine/function/map/LoopsMap.java   |  9 +++-
 .../tinkerpop/machine/function/map/MapMap.java     |  9 +++-
 .../tinkerpop/machine/function/map/PathMap.java    | 54 +++++++++++++++++----
 .../tinkerpop/machine/function/map/ValueMap.java   |  9 +++-
 .../machine/function/reduce/CountReduce.java       |  9 +++-
 .../machine/function/reduce/GroupCountReduce.java  |  9 +++-
 .../machine/function/reduce/ReduceReduce.java      | 10 +++-
 .../machine/function/reduce/SumReduce.java         |  9 +++-
 .../machine/processor/ConstantProcessor.java       | 39 ---------------
 .../machine/processor/HasNextProcessor.java        | 39 ---------------
 .../machine/traverser/path/BasicPath.java          | 54 +++++++++++++++++----
 .../machine/traverser/path/EmptyPath.java          | 15 ++++--
 .../tinkerpop/machine/traverser/path/Path.java     | 22 +++++++--
 .../machine/traverser/species/COP_Traverser.java   |  7 +--
 .../tinkerpop/machine/processor/beam/BeamTest.java |  2 +-
 .../machine/processor/pipes/PipesTest.java         |  6 +++
 40 files changed, 356 insertions(+), 235 deletions(-)

diff --git 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java
 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java
index 53eebb9..5c35849 100644
--- 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java
+++ 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java
@@ -35,7 +35,7 @@ public abstract class AbstractTraversal<C, S, E> implements 
Traversal<C, S, E> {
     protected Coefficient<C> currentCoefficient;
     protected final Bytecode<C> bytecode;
     private Iterator<Traverser<C, E>> traversers = null;
-    private boolean locked = false; // TODO: when a traversal has been 
submitted, we need to make sure new modulations can't happen.
+    private boolean locked = false;
 
     // iteration helpers
     private long lastCount = 0L;
@@ -57,7 +57,7 @@ public abstract class AbstractTraversal<C, S, E> implements 
Traversal<C, S, E> {
     }
 
     private final void prepareTraversal() {
-        if (null == this.traversers) {
+        if (!this.locked) {
             this.locked = true;
             this.traversers = 
BytecodeUtil.getMachine(this.bytecode).get().submit(this.bytecode);
         }
@@ -90,6 +90,7 @@ public abstract class AbstractTraversal<C, S, E> implements 
Traversal<C, S, E> {
         }
     }
 
+    @Override
     public List<E> toList() {
         final List<E> list = new ArrayList<>();
         while (this.hasNext()) {
diff --git 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
index c505d2d..c352b00 100644
--- 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
+++ 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
@@ -29,7 +29,6 @@ import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
 import org.apache.tinkerpop.machine.traverser.path.Path;
 
-import java.util.Arrays;
 import java.util.Map;
 
 /**
@@ -194,7 +193,9 @@ public class CommonTraversal<C, S, E> extends 
AbstractTraversal<C, S, E> {
 
     @Override
     public Traversal<C, S, Path> path(final String... labels) {
-        return this.addInstruction(Symbols.PATH, Arrays.asList(labels));
+        this.addInstruction(Symbols.PATH, labels);
+        this.bytecode.lastInstruction().addArg("|");
+        return (Traversal) this;
     }
 
     @Override
diff --git 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
index df5f9b6..6e8e97a 100644
--- 
a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
+++ 
b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
@@ -30,7 +30,6 @@ import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
 import org.apache.tinkerpop.machine.traverser.path.Path;
 
-import java.util.Arrays;
 import java.util.Map;
 
 /**
@@ -41,11 +40,11 @@ public class CoreTraversal<C, S, E> extends 
AbstractTraversal<C, S, E> {
     // used by __
     CoreTraversal() {
         // TODO: this will cause __ problems
-        super(new Bytecode<>(), (Coefficient<C>) LongCoefficient.create());
+        this(new Bytecode<>(), (Coefficient<C>) LongCoefficient.create());
     }
 
     // used by TraversalSource
-    protected CoreTraversal(final Coefficient<C> unity, final Bytecode<C> 
bytecode) {
+    public CoreTraversal(final Bytecode<C> bytecode, final Coefficient<C> 
unity) {
         super(bytecode, unity);
     }
 
@@ -221,7 +220,9 @@ public class CoreTraversal<C, S, E> extends 
AbstractTraversal<C, S, E> {
 
     @Override
     public Traversal<C, S, Path> path(final String... labels) {
-        return this.addInstruction(Symbols.PATH, Arrays.asList(labels));
+        this.addInstruction(Symbols.PATH, (Object[]) labels);
+        this.bytecode.lastInstruction().addArg("|");
+        return (Traversal) this;
     }
 
     @Override
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/LocalMachine.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/LocalMachine.java
index 760a248..a15c42d 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/LocalMachine.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/LocalMachine.java
@@ -27,7 +27,7 @@ import java.util.Iterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class LocalMachine implements Machine {
+public final class LocalMachine implements Machine {
 
     @Override
     public <C, E> Iterator<Traverser<C, E>> submit(final Bytecode<C> bytecode) 
{
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/Machine.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/Machine.java
index 5ee511a..00aa384 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/Machine.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/Machine.java
@@ -28,5 +28,5 @@ import java.util.Iterator;
  */
 public interface Machine {
 
-    public <C, S> Iterator<Traverser<C, S>> submit(final Bytecode<C> bytecode);
+    public <C, S> Iterator<Traverser<C, S>> submit(final Bytecode<C> 
bytecode); // TODO: should return a "ShellTraverser"
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
index 1c08a58..88f2d62 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
@@ -62,8 +62,10 @@ public final class Instruction<C> {
     }
 
     public void addArg(final Object arg) {
-        this.args = Arrays.copyOf(this.args, this.args.length + 1);
-        this.args[this.args.length - 1] = arg;
+        final Object[] newArgs = new Object[this.args.length + 1];
+        System.arraycopy(this.args, 0, newArgs, 0, this.args.length);
+        newArgs[newArgs.length - 1] = arg;
+        this.args = newArgs;
     }
 
     public void addArgs(final Object... args) {
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
index 7f2690f..8fc29f2 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.machine.bytecode.compiler;
 
 import org.apache.tinkerpop.machine.bytecode.Instruction;
-import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.CFunction;
 import org.apache.tinkerpop.machine.function.barrier.JoinBarrier;
 import org.apache.tinkerpop.machine.function.barrier.StallBarrier;
@@ -32,7 +31,7 @@ import 
org.apache.tinkerpop.machine.function.filter.IdentityFilter;
 import org.apache.tinkerpop.machine.function.filter.IsFilter;
 import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap;
 import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap;
-import org.apache.tinkerpop.machine.function.initial.InjectInitial;
+import org.apache.tinkerpop.machine.function.initial.InitialInitial;
 import org.apache.tinkerpop.machine.function.map.ConstantMap;
 import org.apache.tinkerpop.machine.function.map.IncrMap;
 import org.apache.tinkerpop.machine.function.map.LoopsMap;
@@ -46,7 +45,6 @@ import org.apache.tinkerpop.machine.function.reduce.SumReduce;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -59,7 +57,7 @@ public final class CommonCompiler implements BytecodeCompiler 
{
         // static instance
     }
 
-    public static final CommonCompiler instance() {
+    public static CommonCompiler instance() {
         return INSTANCE;
     }
 
@@ -91,54 +89,51 @@ public final class CommonCompiler implements 
BytecodeCompiler {
 
     @Override
     public <C> CFunction<C> compile(final Instruction<C> instruction) {
-        final String op = instruction.op();
-        final Coefficient<C> coefficient = instruction.coefficient();
-        final Set<String> labels = instruction.labels();
-        switch (op) {
+        switch (instruction.op()) {
             case Symbols.BARRIER:
-                return new StallBarrier<>(coefficient, labels, 1000);
+                return StallBarrier.compile(instruction);
             case Symbols.BRANCH:
-                return new BranchBranch<>(coefficient, labels, 
BranchBranch.makeBranches(instruction.args()));
+                return BranchBranch.compile(instruction);
             case Symbols.CONSTANT:
-                return new ConstantMap<>(coefficient, labels, 
instruction.args()[0]);
+                return ConstantMap.compile(instruction);
             case Symbols.COUNT:
-                return new CountReduce<>(coefficient, labels);
+                return CountReduce.compile(instruction);
             case Symbols.FILTER:
-                return new FilterFilter<>(coefficient, labels, null, 
Argument.create(instruction.args()));
+                return FilterFilter.compile(instruction);
             case Symbols.FLATMAP:
-                return new FlatMapFlatMap<>(coefficient, labels, 
Argument.create(instruction.args()));
+                return FlatMapFlatMap.compile(instruction);
             case Symbols.GROUP_COUNT:
-                return new GroupCountReduce<>(coefficient, labels, 
Compilation.compileOrNull(0, instruction.args()));
+                return GroupCountReduce.compile(instruction);
             case Symbols.HAS_KEY:
-                return new HasKeyFilter<>(coefficient, labels, 
Pred.valueOf(instruction.args()[0]), Argument.create(instruction.args()[1]));
+                return HasKeyFilter.compile(instruction);
             case Symbols.HAS_KEY_VALUE:
-                return new HasKeyValueFilter<>(coefficient, labels, 
Argument.create(instruction.args()[0]), Argument.create(instruction.args()[1]));
+                return HasKeyValueFilter.compile(instruction);
             case Symbols.IDENTITY:
-                return new IdentityFilter<>(coefficient, labels);
+                return IdentityFilter.compile(instruction);
             case Symbols.INCR:
-                return new IncrMap<>(coefficient, labels);
+                return IncrMap.compile(instruction);
             case Symbols.INITIAL:
-                return new InjectInitial<>(coefficient, labels, 
instruction.args());
+                return InitialInitial.compile(instruction);
             case Symbols.IS:
-                return new IsFilter<>(coefficient, labels, 
Pred.valueOf(instruction.args()[0]), Argument.create(instruction.args()[1]));
+                return IsFilter.compile(instruction);
             case Symbols.JOIN:
-                return new JoinBarrier<>(coefficient, labels, 
(CoreCompiler.Symbols.Tokens) instruction.args()[0], 
Compilation.compileOne(instruction.args()[1]), 
Argument.create(instruction.args()[2]));
+                return JoinBarrier.compile(instruction);
             case Symbols.LOOPS:
-                return new LoopsMap<>(coefficient, labels);
+                return LoopsMap.compile(instruction);
             case Symbols.MAP:
-                return new MapMap<>(coefficient, labels, 
Argument.create(instruction.args()));
+                return MapMap.compile(instruction);
             case Symbols.PATH:
-                return new PathMap<>(coefficient, labels, 
Compilation.compile(instruction.args()));
+                return PathMap.compile(instruction);
             case Symbols.REDUCE:
-                return new ReduceReduce<>(coefficient, labels, 
Oper.valueOf(instruction.args()[0]), instruction.args()[1]);
+                return ReduceReduce.compile(instruction);
             case Symbols.REPEAT:
-                return new RepeatBranch<>(coefficient, labels, 
Compilation.repeatCompile(instruction.args()));
+                return RepeatBranch.compile(instruction);
             case Symbols.SUM:
-                return new SumReduce<>(coefficient, labels);
+                return SumReduce.compile(instruction);
             case Symbols.UNFOLD:
-                return new UnfoldFlatMap<>(coefficient, labels);
+                return UnfoldFlatMap.compile(instruction);
             case Symbols.VALUE:
-                return new ValueMap<>(coefficient, labels, 
Argument.create(instruction.args()[0]));
+                return ValueMap.compile(instruction);
             default:
                 return null;
         }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
index 5c9ae05..8474b5a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
@@ -21,8 +21,6 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
 import org.apache.tinkerpop.machine.bytecode.Bytecode;
 import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
 import org.apache.tinkerpop.machine.function.CFunction;
-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;
@@ -147,19 +145,4 @@ public final class Compilation<C, S, E> implements 
Serializable {
         }
         return compilations;
     }
-
-    public static List<Object> repeatCompile(final Object... args) {
-        final List<Object> objects = new ArrayList<>();
-        for (final Object arg : args) {
-            if (arg instanceof Bytecode)
-                objects.add(new Compilation<>((Bytecode<?>) arg));
-            else if (arg instanceof Character)
-                objects.add(arg);
-            else if (arg instanceof Integer)
-                objects.add(new Compilation<>(new LoopsProcessor<>((int) 
arg)));
-            else if (arg instanceof Boolean)
-                objects.add(new Compilation<>(new FilterProcessor<>((boolean) 
arg)));
-        }
-        return objects;
-    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationCircle.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationCircle.java
index 59bf840..831ba14 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationCircle.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationCircle.java
@@ -26,19 +26,21 @@ import java.util.List;
  */
 public final class CompilationCircle<C, S, E> implements Serializable {
 
-    private List<Compilation<C, S, E>> compilations;
+    private final List<Compilation<C, S, E>> compilations;
+    private final boolean hasCompilations;
     private int currentCompilation = -1;
 
     public CompilationCircle(final List<Compilation<C, S, E>> compilations) {
         this.compilations = compilations;
+        this.hasCompilations = !this.compilations.isEmpty();
     }
 
-    public Compilation<C, S, E> next() {
-        if (this.compilations.isEmpty()) {
-            return null;
-        } else {
+    public E process(final S object) {
+        if (this.hasCompilations) {
             this.currentCompilation = (this.currentCompilation + 1) % 
this.compilations.size();
-            return this.compilations.get(this.currentCompilation);
+            return 
this.compilations.get(this.currentCompilation).mapObject(object).object();
+        } else {
+            return (E) object;
         }
     }
 
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
index c0a727d..0ce8a91 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.machine.bytecode.compiler;
 
 import org.apache.tinkerpop.machine.bytecode.Instruction;
-import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.CFunction;
 import org.apache.tinkerpop.machine.function.barrier.JoinBarrier;
 import org.apache.tinkerpop.machine.function.barrier.StallBarrier;
@@ -27,16 +26,14 @@ import 
org.apache.tinkerpop.machine.function.branch.BranchBranch;
 import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
 import org.apache.tinkerpop.machine.function.filter.FilterFilter;
 import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap;
-import org.apache.tinkerpop.machine.function.initial.InjectInitial;
+import org.apache.tinkerpop.machine.function.initial.InitialInitial;
 import org.apache.tinkerpop.machine.function.map.MapMap;
 import org.apache.tinkerpop.machine.function.map.PathMap;
 import org.apache.tinkerpop.machine.function.reduce.GroupCountReduce;
 import org.apache.tinkerpop.machine.function.reduce.ReduceReduce;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -49,7 +46,7 @@ public final class CoreCompiler implements BytecodeCompiler {
         // static instance
     }
 
-    public static final CoreCompiler instance() {
+    public static CoreCompiler instance() {
         return INSTANCE;
     }
 
@@ -70,34 +67,29 @@ public final class CoreCompiler implements BytecodeCompiler 
{
 
     @Override
     public <C> CFunction<C> compile(final Instruction<C> instruction) {
-        final String op = instruction.op();
-        final Coefficient<C> coefficient = instruction.coefficient();
-        final Set<String> labels = instruction.labels();
-        switch (op) {
+        switch (instruction.op()) {
             case Symbols.BARRIER:
-                return new StallBarrier<>(coefficient, labels, 1000);
+                return StallBarrier.compile(instruction);
             case Symbols.BRANCH:
-                return new BranchBranch<>(coefficient, labels, 
BranchBranch.makeBranches(instruction.args()));
+                return BranchBranch.compile(instruction);
             case Symbols.FILTER:
-                return instruction.args().length == 1 ?
-                        new FilterFilter<>(coefficient, labels, null, 
Argument.create(instruction.args())) :
-                        new FilterFilter<>(coefficient, labels, 
Pred.valueOf(instruction.args()[0]), 
Argument.create(Arrays.copyOfRange(instruction.args(), 1, 
instruction.args().length)));
+                return FilterFilter.compile(instruction);
             case Symbols.FLATMAP:
-                return new FlatMapFlatMap<>(coefficient, labels, 
Argument.create(instruction.args()));
+                return FlatMapFlatMap.compile(instruction);
             case Symbols.GROUP_COUNT:
-                return new GroupCountReduce<>(coefficient, labels, 
Compilation.compileOrNull(0, instruction.args()));
+                return GroupCountReduce.compile(instruction);
             case Symbols.INITIAL:
-                return new InjectInitial<>(coefficient, labels, 
instruction.args());
+                return InitialInitial.compile(instruction);
             case Symbols.JOIN:
-                return new JoinBarrier<>(coefficient, labels, (Symbols.Tokens) 
instruction.args()[0], Compilation.compileOne(instruction.args()[1]), 
Argument.create(instruction.args()[2]));
+                return JoinBarrier.compile(instruction);
             case Symbols.MAP:
-                return new MapMap<>(coefficient, labels, 
Argument.create(instruction.args()));
+                return MapMap.compile(instruction);
             case Symbols.PATH:
-                return new PathMap<>(coefficient, labels, 
Compilation.compile(instruction.args()));
+                return PathMap.compile(instruction);
             case Symbols.REDUCE:
-                return new ReduceReduce<>(coefficient, labels, 
Oper.valueOf(instruction.args()[0]), instruction.args()[1]);
+                return ReduceReduce.compile(instruction);
             case Symbols.REPEAT:
-                return new RepeatBranch<>(coefficient, labels, 
Compilation.repeatCompile(instruction.args()));
+                return RepeatBranch.compile(instruction);
             default:
                 return null;
         }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
index bba2fc1..ffa3c7b 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.barrier;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
 import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
@@ -37,16 +38,16 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class JoinBarrier<C, K, V> extends AbstractFunction<C> implements 
BarrierFunction<C, Map<K, V>, Map<K, V>, List<Map<K, V>>> {
+public final class JoinBarrier<C, K, V> extends AbstractFunction<C> implements 
BarrierFunction<C, Map<K, V>, Map<K, V>, List<Map<K, V>>> {
 
     private final CoreCompiler.Symbols.Tokens joinType;
     private final Compilation<C, Map<K, V>, Map<K, V>> joinCompilation;
     private final Argument<K> joinKey;
 
-    public JoinBarrier(final Coefficient<C> coefficient, final Set<String> 
labels,
-                       CoreCompiler.Symbols.Tokens joinType,
-                       final Compilation<C, Map<K, V>, Map<K, V>> 
joinCompilation,
-                       final Argument<K> joinKey) {
+    private JoinBarrier(final Coefficient<C> coefficient, final Set<String> 
labels,
+                        CoreCompiler.Symbols.Tokens joinType,
+                        final Compilation<C, Map<K, V>, Map<K, V>> 
joinCompilation,
+                        final Argument<K> joinKey) {
         super(coefficient, labels);
         this.joinType = joinType;
         this.joinCompilation = joinCompilation;
@@ -91,4 +92,11 @@ public class JoinBarrier<C, K, V> extends 
AbstractFunction<C> implements Barrier
         return StringFactory.makeFunctionString(this, this.joinType, 
this.joinCompilation, this.joinKey);
     }
 
+    public static <C, K, V> JoinBarrier<C, K, V> compile(final Instruction<C> 
instruction) {
+        return new JoinBarrier<>(instruction.coefficient(), 
instruction.labels(),
+                CoreCompiler.Symbols.Tokens.valueOf((String) 
instruction.args()[0]),
+                Compilation.compileOne(instruction.args()[1]),
+                Argument.create(instruction.args()[2]));
+    }
+
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/StallBarrier.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/StallBarrier.java
index 16ca952..e69d240 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/StallBarrier.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/StallBarrier.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.barrier;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.BarrierFunction;
@@ -30,11 +31,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class StallBarrier<C, S, E> extends AbstractFunction<C> implements 
BarrierFunction<C, S, Traverser<C, S>, TraverserSet<C, S>> {
+public final class StallBarrier<C, S> extends AbstractFunction<C> implements 
BarrierFunction<C, S, Traverser<C, S>, TraverserSet<C, S>> {
 
     private final int drainThreshold;
 
-    public StallBarrier(final Coefficient<C> coefficient, final Set<String> 
labels, final int drainThreshold) {
+    private StallBarrier(final Coefficient<C> coefficient, final Set<String> 
labels, final int drainThreshold) {
         super(coefficient, labels);
         this.drainThreshold = drainThreshold;
     }
@@ -60,4 +61,8 @@ public class StallBarrier<C, S, E> extends 
AbstractFunction<C> implements Barrie
     public boolean returnsTraversers() {
         return true;
     }
+
+    public static <C, S> StallBarrier<C, S> compile(final Instruction<C> 
instruction) {
+        return new StallBarrier<>(instruction.coefficient(), 
instruction.labels(), 1000); // TODO
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
index 5af3f0b..2113d01 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.branch;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
 import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
@@ -37,7 +38,7 @@ public final class BranchBranch<C, S, E> extends 
AbstractFunction<C> implements
 
     private final Map<Compilation<C, S, ?>, List<Compilation<C, S, E>>> 
branches;
 
-    public BranchBranch(final Coefficient<C> coefficient, final Set<String> 
labels, final Map<Compilation<C, S, ?>, List<Compilation<C, S, E>>> branches) {
+    private BranchBranch(final Coefficient<C> coefficient, final Set<String> 
labels, final Map<Compilation<C, S, ?>, List<Compilation<C, S, E>>> branches) {
         super(coefficient, labels);
         this.branches = branches;
     }
@@ -47,7 +48,8 @@ public final class BranchBranch<C, S, E> extends 
AbstractFunction<C> implements
         return this.branches;
     }
 
-    public static <C, S, E> Map<Compilation<C, S, ?>, List<Compilation<C, S, 
E>>> makeBranches(final Object... args) {
+    public static <C, S, E> BranchBranch<C, S, E> compile(final Instruction<C> 
instruction) {
+        final Object[] args = instruction.args();
         final Map<Compilation<C, S, ?>, List<Compilation<C, S, E>>> branches = 
new HashMap<>();
         for (int i = 0; i < args.length; i = i + 2) {
             final Compilation<C, S, ?> predicate = 
Symbols.DEFAULT.equals(args[i]) ? null : Compilation.compileOne(args[i]);
@@ -59,6 +61,6 @@ public final class BranchBranch<C, S, E> extends 
AbstractFunction<C> implements
             }
             list.add(branch);
         }
-        return branches;
+        return new BranchBranch<>(instruction.coefficient(), 
instruction.labels(), branches);
     }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
index 6195ad9..90d23f5 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
@@ -18,11 +18,16 @@
  */
 package org.apache.tinkerpop.machine.function.branch;
 
+import org.apache.tinkerpop.machine.bytecode.Bytecode;
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
+import org.apache.tinkerpop.machine.processor.FilterProcessor;
+import org.apache.tinkerpop.machine.processor.LoopsProcessor;
 import org.apache.tinkerpop.machine.util.StringFactory;
 
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -103,4 +108,19 @@ public final class RepeatBranch<C, S> extends 
AbstractFunction<C> {
     public boolean hasEndPredicates() {
         return this.hasEndPredicates;
     }
+
+    public static <C, S> RepeatBranch<C, S> compile(final Instruction<C> 
instruction) {
+        final List<Object> objects = new ArrayList<>();
+        for (final Object arg : instruction.args()) {
+            if (arg instanceof Bytecode)
+                objects.add(new Compilation<>((Bytecode<?>) arg));
+            else if (arg instanceof Character)
+                objects.add(arg);
+            else if (arg instanceof Integer)
+                objects.add(new Compilation<>(new LoopsProcessor<>((int) 
arg)));
+            else if (arg instanceof Boolean)
+                objects.add(new Compilation<>(new FilterProcessor<>((boolean) 
arg)));
+        }
+        return new RepeatBranch<>(instruction.coefficient(), 
instruction.labels(), objects);
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/FilterFilter.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/FilterFilter.java
index 652ec77..75ac63a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/FilterFilter.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/FilterFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.filter;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.bytecode.compiler.Pred;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
@@ -37,7 +38,7 @@ public final class FilterFilter<C, S> extends 
AbstractFunction<C> implements Fil
     private final Argument<S> argument;
 
 
-    public FilterFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred pred, final Argument<S> argument) {
+    private FilterFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred pred, final Argument<S> argument) {
         super(coefficient, labels);
         this.pred = pred;
         this.argument = argument;
@@ -55,4 +56,11 @@ public final class FilterFilter<C, S> extends 
AbstractFunction<C> implements Fil
         return StringFactory.makeFunctionString(this, this.argument);
     }
 
+    public static <C, S> FilterFilter<C, S> compile(final Instruction<C> 
instruction) {
+        final boolean oneArg = instruction.args().length == 1;
+        return new FilterFilter<>(instruction.coefficient(), 
instruction.labels(),
+                oneArg ? null : Pred.valueOf(instruction.args()[0]),
+                Argument.create(oneArg ? instruction.args()[0] : 
instruction.args()[1]));
+    }
+
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java
index 8e41f3b..52f1d10 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.filter;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.bytecode.compiler.Pred;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
@@ -37,7 +38,7 @@ public final class HasKeyFilter<C, K, V> extends 
AbstractFunction<C> implements
     private final Pred predicate;
     private final Argument<K> key;
 
-    public HasKeyFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred predicate, final Argument<K> key) {
+    private HasKeyFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred predicate, final Argument<K> key) {
         super(coefficient, labels);
         this.predicate = predicate;
         this.key = key;
@@ -62,4 +63,8 @@ public final class HasKeyFilter<C, K, V> extends 
AbstractFunction<C> implements
     public String toString() {
         return StringFactory.makeFunctionString(this, this.key);
     }
+
+    public static <C, K, V> HasKeyFilter<C, K, V> compile(final Instruction<C> 
instruction) {
+        return new HasKeyFilter<>(instruction.coefficient(), 
instruction.labels(), Pred.valueOf(instruction.args()[0]), 
Argument.create(instruction.args()[1]));
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
index 74b5cb0..23df704 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.filter;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
@@ -36,7 +37,7 @@ public final class HasKeyValueFilter<C, K, V> extends 
AbstractFunction<C> implem
     private final Argument<K> key;
     private final Argument<V> value;
 
-    public HasKeyValueFilter(final Coefficient<C> coefficient, final 
Set<String> labels, final Argument<K> key, final Argument<V> value) {
+    private HasKeyValueFilter(final Coefficient<C> coefficient, final 
Set<String> labels, final Argument<K> key, final Argument<V> value) {
         super(coefficient, labels);
         this.key = key;
         this.value = value;
@@ -52,4 +53,8 @@ public final class HasKeyValueFilter<C, K, V> extends 
AbstractFunction<C> implem
     public String toString() {
         return StringFactory.makeFunctionString(this, this.key, this.value);
     }
+
+    public static <C, K, V> HasKeyValueFilter<C, K, V> compile(final 
Instruction<C> instruction) {
+        return new HasKeyValueFilter<>(instruction.coefficient(), 
instruction.labels(), Argument.create(instruction.args()[0]), 
Argument.create(instruction.args()[1]));
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IdentityFilter.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IdentityFilter.java
index 3f2d816..53a540e 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IdentityFilter.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IdentityFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.filter;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.FilterFunction;
@@ -30,7 +31,7 @@ import java.util.Set;
  */
 public final class IdentityFilter<C, S> extends AbstractFunction<C> implements 
FilterFunction<C, S> {
 
-    public IdentityFilter(final Coefficient<C> coefficient, final Set<String> 
labels) {
+    private IdentityFilter(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -38,4 +39,8 @@ public final class IdentityFilter<C, S> extends 
AbstractFunction<C> implements F
     public boolean test(final Traverser<C, S> traverser) {
         return true;
     }
+
+    public static <C, S> IdentityFilter<C, S> compile(final Instruction<C> 
instruction) {
+        return new IdentityFilter<>(instruction.coefficient(), 
instruction.labels());
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IsFilter.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IsFilter.java
index 097c375..7f72c4b 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IsFilter.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/IsFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.filter;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.bytecode.compiler.Pred;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
@@ -36,7 +37,7 @@ public final class IsFilter<C, S> extends AbstractFunction<C> 
implements FilterF
     private final Pred predicate;
     private final Argument<S> argument;
 
-    public IsFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred predicate, final Argument<S> argument) {
+    private IsFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final Pred predicate, final Argument<S> argument) {
         super(coefficient, labels);
         this.predicate = predicate;
         this.argument = argument;
@@ -51,4 +52,8 @@ public final class IsFilter<C, S> extends AbstractFunction<C> 
implements FilterF
     public String toString() {
         return StringFactory.makeFunctionString(this, this.predicate, 
this.argument);
     }
+
+    public static <C, S> IsFilter<C, S> compile(final Instruction<C> 
instruction) {
+        return new IsFilter<>(instruction.coefficient(), instruction.labels(), 
Pred.valueOf(instruction.args()[0]), Argument.create(instruction.args()[1]));
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java
index 3caad80..d54adab 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.flatmap;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
@@ -34,11 +35,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class FlatMapFlatMap<C, S, E> extends AbstractFunction<C> implements 
FlatMapFunction<C, S, E> {
+public final class FlatMapFlatMap<C, S, E> extends AbstractFunction<C> 
implements FlatMapFunction<C, S, E> {
 
     private final Argument<E> argument;
 
-    public FlatMapFlatMap(final Coefficient<C> coefficient, final Set<String> 
labels, final Argument<E> argument) {
+    private FlatMapFlatMap(final Coefficient<C> coefficient, final Set<String> 
labels, final Argument<E> argument) {
         super(coefficient, labels);
         this.argument = argument;
     }
@@ -69,4 +70,8 @@ public class FlatMapFlatMap<C, S, E> extends 
AbstractFunction<C> implements Flat
             return new ArrayIterator<>((E[]) objectArray);
         }
     }
+
+    public static <C, S, E> FlatMapFlatMap<C, S, E> compile(final 
Instruction<C> instruction) {
+        return new FlatMapFlatMap<>(instruction.coefficient(), 
instruction.labels(), Argument.create(instruction.args()));
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/UnfoldFlatMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/UnfoldFlatMap.java
index 462e784..c565855 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/UnfoldFlatMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/UnfoldFlatMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.flatmap;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.FlatMapFunction;
@@ -33,9 +34,9 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class UnfoldFlatMap<C, S, E> extends AbstractFunction<C> implements 
FlatMapFunction<C, S, E> {
+public final class UnfoldFlatMap<C, S, E> extends AbstractFunction<C> 
implements FlatMapFunction<C, S, E> {
 
-    public UnfoldFlatMap(final Coefficient<C> coefficient, final Set<String> 
labels) {
+    private UnfoldFlatMap(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -65,4 +66,8 @@ public class UnfoldFlatMap<C, S, E> extends 
AbstractFunction<C> implements FlatM
             return new ArrayIterator<>((E[]) objectArray);
         }
     }
+
+    public static <C, S, E> UnfoldFlatMap<C, S, E> compile(final 
Instruction<C> instruction) {
+        return new UnfoldFlatMap<>(instruction.coefficient(), 
instruction.labels());
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InjectInitial.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
similarity index 77%
rename from 
java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InjectInitial.java
rename to 
java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
index cee6b1a..5799e56 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InjectInitial.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.initial;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.InitialFunction;
@@ -30,11 +31,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class InjectInitial<C, S> extends AbstractFunction<C> implements 
InitialFunction<C, S> {
+public final class InitialInitial<C, S> extends AbstractFunction<C> implements 
InitialFunction<C, S> {
 
     private final S[] objects;
 
-    public InjectInitial(final Coefficient<C> coefficient, final Set<String> 
labels, final S... objects) {
+    private InitialInitial(final Coefficient<C> coefficient, final Set<String> 
labels, final S... objects) {
         super(coefficient, labels);
         this.objects = objects;
     }
@@ -48,4 +49,8 @@ public class InjectInitial<C, S> extends AbstractFunction<C> 
implements InitialF
     public String toString() {
         return StringFactory.makeFunctionString(this, this.objects);
     }
+
+    public static <C, S> InitialInitial<C, S> compile(final Instruction<C> 
instruction) {
+        return new InitialInitial<>(instruction.coefficient(), 
instruction.labels(), (S[]) instruction.args());
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ConstantMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ConstantMap.java
index 72b415f..e1f7b51 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ConstantMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ConstantMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.MapFunction;
@@ -29,11 +30,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class ConstantMap<C, S, E> extends AbstractFunction<C> implements 
MapFunction<C, S, E> {
+public final class ConstantMap<C, S, E> extends AbstractFunction<C> implements 
MapFunction<C, S, E> {
 
     private final E constant;
 
-    public ConstantMap(final Coefficient<C> coefficient, final Set<String> 
labels, final E constant) {
+    private ConstantMap(final Coefficient<C> coefficient, final Set<String> 
labels, final E constant) {
         super(coefficient, labels);
         this.constant = constant;
     }
@@ -47,4 +48,8 @@ public class ConstantMap<C, S, E> extends AbstractFunction<C> 
implements MapFunc
     public String toString() {
         return StringFactory.makeFunctionString(this, this.constant);
     }
+
+    public static <C, S, E> ConstantMap<C, S, E> compile(final Instruction<C> 
instruction) {
+        return new ConstantMap<>(instruction.coefficient(), 
instruction.labels(), (E) instruction.args()[0]);
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/IncrMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/IncrMap.java
index 56af5f6..f91e670 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/IncrMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/IncrMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.MapFunction;
@@ -28,9 +29,9 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class IncrMap<C> extends AbstractFunction<C> implements MapFunction<C, 
Long, Long> {
+public final class IncrMap<C> extends AbstractFunction<C> implements 
MapFunction<C, Long, Long> {
 
-    public IncrMap(final Coefficient<C> coefficient, final Set<String> labels) 
{
+    private IncrMap(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -39,4 +40,8 @@ public class IncrMap<C> extends AbstractFunction<C> 
implements MapFunction<C, Lo
         return traverser.object() + 1L;
     }
 
+    public static <C> IncrMap<C> compile(final Instruction<C> instruction) {
+        return new IncrMap<>(instruction.coefficient(), instruction.labels());
+    }
+
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/LoopsMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/LoopsMap.java
index fa5756c..c2deba4 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/LoopsMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/LoopsMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.MapFunction;
@@ -28,9 +29,9 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class LoopsMap<C, S> extends AbstractFunction<C> implements 
MapFunction<C, S, Integer> {
+public final class LoopsMap<C, S> extends AbstractFunction<C> implements 
MapFunction<C, S, Integer> {
 
-    public LoopsMap(final Coefficient<C> coefficient, final Set<String> 
labels) {
+    private LoopsMap(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -39,4 +40,8 @@ public class LoopsMap<C, S> extends AbstractFunction<C> 
implements MapFunction<C
         return traverser.loops();
     }
 
+    public static <C, S> LoopsMap<C, S> compile(final Instruction<C> 
instruction) {
+        return new LoopsMap<>(instruction.coefficient(), instruction.labels());
+    }
+
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/MapMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/MapMap.java
index 2e75c57..2b32524 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/MapMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/MapMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
@@ -30,11 +31,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class MapMap<C, S, E> extends AbstractFunction<C> implements 
MapFunction<C, S, E> {
+public final class MapMap<C, S, E> extends AbstractFunction<C> implements 
MapFunction<C, S, E> {
 
     private final Argument<E> argument;
 
-    public MapMap(final Coefficient<C> coefficient, final Set<String> labels, 
final Argument<E> argument) {
+    private MapMap(final Coefficient<C> coefficient, final Set<String> labels, 
final Argument<E> argument) {
         super(coefficient, labels);
         this.argument = argument;
     }
@@ -48,4 +49,8 @@ public class MapMap<C, S, E> extends AbstractFunction<C> 
implements MapFunction<
     public String toString() {
         return StringFactory.makeFunctionString(this, this.argument);
     }
+
+    public static <C, S, E> MapMap<C, S, E> compile(final Instruction<C> 
instruction) {
+        return new MapMap<>(instruction.coefficient(), instruction.labels(), 
Argument.create(instruction.args()));
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
index a0ed4c1..949c16e 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
@@ -18,40 +18,74 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
 import org.apache.tinkerpop.machine.bytecode.compiler.CompilationCircle;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.MapFunction;
+import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.traverser.path.BasicPath;
 import org.apache.tinkerpop.machine.traverser.path.Path;
-import org.apache.tinkerpop.machine.traverser.Traverser;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class PathMap<C, S> extends AbstractFunction<C> implements 
MapFunction<C, S, Path> {
+public final class PathMap<C, S> extends AbstractFunction<C> implements 
MapFunction<C, S, Path> {
 
-    private final CompilationCircle<C, Object, Object> compilationCircle;
+    private final List<String> pathLabels;
+    private final CompilationCircle<C, Object, Object> byCompilations;
+    private final boolean hasPathLabels;
+    private final boolean hasByCompilations;
 
-    public PathMap(final Coefficient<C> coefficient, final Set<String> labels, 
final List<Compilation<C, Object, Object>> byMaps) {
+
+    private PathMap(final Coefficient<C> coefficient, final Set<String> 
labels, final List<String> pathLabels, final List<Compilation<C, Object, 
Object>> byCompilations) {
         super(coefficient, labels);
-        this.compilationCircle = new CompilationCircle<>(byMaps);
+        this.pathLabels = pathLabels;
+        this.byCompilations = new CompilationCircle<>(byCompilations);
+        this.hasPathLabels = !pathLabels.isEmpty();
+        this.hasByCompilations = !this.byCompilations.isEmpty();
     }
 
     @Override
     public Path apply(final Traverser<C, S> traverser) {
-        if (!this.compilationCircle.isEmpty()) {
+        if (!this.hasPathLabels && !this.hasByCompilations)
+            return traverser.path();
+        else {
             final Path oldPath = traverser.path();
             final Path newPath = new BasicPath();
-            for (int i = 0; i < oldPath.size(); i++) {
-                newPath.add(oldPath.labels(i), 
this.compilationCircle.next().mapObject(oldPath.object(i)).object());
+            if (this.hasPathLabels) {
+                for (final String label : this.pathLabels) {
+                    newPath.add(Collections.singleton(label), 
this.byCompilations.process(oldPath.get(Path.Pop.last, label)));
+                }
+            } else {
+                for (int i = 0; i < oldPath.size(); i++) {
+                    newPath.add(oldPath.labels(i), 
this.byCompilations.process(oldPath.object(i)));
+                }
             }
             return newPath;
-        } else
-            return traverser.path();
+        }
+    }
+
+    public static <C, S> PathMap<C, S> compile(final Instruction<C> 
instruction) {
+        final List<String> labels = new ArrayList<>();
+        final List<Compilation<C, Object, Object>> compilations = new 
ArrayList<>();
+        boolean processingLabels = true;
+        for (final Object arg : instruction.args()) {
+            if ("|" == arg) {
+                processingLabels = false;
+                continue;
+            }
+            if (processingLabels)
+                labels.add((String) arg);
+            else
+                compilations.add(Compilation.compileOne(arg));
+        }
+        return new PathMap<>(instruction.coefficient(), instruction.labels(), 
labels, compilations);
     }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
index 352cdbf..d7c2de9 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.map;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
@@ -31,11 +32,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class ValueMap<C, K, V> extends AbstractFunction<C> implements 
MapFunction<C, Map<K, V>, V> {
+public final class ValueMap<C, K, V> extends AbstractFunction<C> implements 
MapFunction<C, Map<K, V>, V> {
 
     private final Argument<K> key;
 
-    public ValueMap(final Coefficient<C> coefficient, final Set<String> 
labels, final Argument<K> key) {
+    private ValueMap(final Coefficient<C> coefficient, final Set<String> 
labels, final Argument<K> key) {
         super(coefficient, labels);
         this.key = key;
     }
@@ -49,4 +50,8 @@ public class ValueMap<C, K, V> extends AbstractFunction<C> 
implements MapFunctio
     public String toString() {
         return StringFactory.makeFunctionString(this, this.key);
     }
+
+    public static <C, K, V> ValueMap<C, K, V> compile(final Instruction<C> 
instruction) {
+        return new ValueMap<>(instruction.coefficient(), instruction.labels(), 
Argument.create(instruction.args()[0]));
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/CountReduce.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/CountReduce.java
index 6d0338d..e9ec5ef 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/CountReduce.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/CountReduce.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.reduce;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.ReduceFunction;
@@ -28,9 +29,9 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class CountReduce<C, S> extends AbstractFunction<C> implements 
ReduceFunction<C, S, Long> {
+public final class CountReduce<C, S> extends AbstractFunction<C> implements 
ReduceFunction<C, S, Long> {
 
-    public CountReduce(final Coefficient<C> coefficient, final Set<String> 
labels) {
+    private CountReduce(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -48,4 +49,8 @@ public class CountReduce<C, S> extends AbstractFunction<C> 
implements ReduceFunc
     public Long getInitialValue() {
         return 0L;
     }
+
+    public static <C, S> CountReduce<C, S> compile(final Instruction<C> 
instruction) {
+        return new CountReduce<>(instruction.coefficient(), 
instruction.labels());
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java
index 044a410..3603433 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.reduce;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
@@ -32,11 +33,11 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class GroupCountReduce<C, S, E> extends AbstractFunction<C> implements 
ReduceFunction<C, S, Map<E, Long>> {
+public final class GroupCountReduce<C, S, E> extends AbstractFunction<C> 
implements ReduceFunction<C, S, Map<E, Long>> {
 
     private final Compilation<C, S, E> byCompilation;
 
-    public GroupCountReduce(final Coefficient<C> coefficient, final 
Set<String> labels, final Compilation<C, S, E> byCompilation) {
+    private GroupCountReduce(final Coefficient<C> coefficient, final 
Set<String> labels, final Compilation<C, S, E> byCompilation) {
         super(coefficient, labels);
         this.byCompilation = byCompilation;
     }
@@ -66,4 +67,8 @@ public class GroupCountReduce<C, S, E> extends 
AbstractFunction<C> implements Re
         return StringFactory.makeFunctionString(this, this.byCompilation);
     }
 
+    public static <C, S, E> GroupCountReduce<C, S, E> compile(final 
Instruction<C> instruction) {
+        return new GroupCountReduce<>(instruction.coefficient(), 
instruction.labels(), Compilation.compileOrNull(0, instruction.args()));
+    }
+
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/ReduceReduce.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/ReduceReduce.java
index fae2aeb..e62c158 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/ReduceReduce.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/ReduceReduce.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.machine.function.reduce;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.Oper;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.ReduceFunction;
@@ -29,12 +31,12 @@ import java.util.function.BinaryOperator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class ReduceReduce<C, S> extends AbstractFunction<C> implements 
ReduceFunction<C, S, S> {
+public final class ReduceReduce<C, S> extends AbstractFunction<C> implements 
ReduceFunction<C, S, S> {
 
     private final BinaryOperator<S> operator;
     private final S initialValue;
 
-    public ReduceReduce(final Coefficient<C> coefficient, final Set<String> 
labels, final BinaryOperator<S> operator, final S initialValue) {
+    private ReduceReduce(final Coefficient<C> coefficient, final Set<String> 
labels, final BinaryOperator<S> operator, final S initialValue) {
         super(coefficient, labels);
         this.operator = operator;
         this.initialValue = initialValue;
@@ -54,4 +56,8 @@ public class ReduceReduce<C, S> extends AbstractFunction<C> 
implements ReduceFun
     public S getInitialValue() {
         return this.initialValue;
     }
+
+    public static <C, S> ReduceReduce<C, S> compile(final Instruction<C> 
instruction) {
+        return new ReduceReduce<>(instruction.coefficient(), 
instruction.labels(), (BinaryOperator<S>) Oper.valueOf(instruction.args()[0]), 
(S) instruction.args()[1]);
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/SumReduce.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/SumReduce.java
index 61e1b6d..9e7283e 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/SumReduce.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/SumReduce.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.function.reduce;
 
+import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.ReduceFunction;
@@ -29,9 +30,9 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class SumReduce<C, S extends Number> extends AbstractFunction<C> 
implements ReduceFunction<C, S, S> {
+public final class SumReduce<C, S extends Number> extends AbstractFunction<C> 
implements ReduceFunction<C, S, S> {
 
-    public SumReduce(final Coefficient<C> coefficient, final Set<String> 
labels) {
+    private SumReduce(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
@@ -49,4 +50,8 @@ public class SumReduce<C, S extends Number> extends 
AbstractFunction<C> implemen
     public S getInitialValue() {
         return (S) NumberHelper.add(0, 0);
     }
+
+    public static <C, S extends Number> SumReduce<C, S> compile(final 
Instruction<C> instruction) {
+        return new SumReduce<>(instruction.coefficient(), 
instruction.labels());
+    }
 }
\ No newline at end of file
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ConstantProcessor.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ConstantProcessor.java
deleted file mode 100644
index 5e52aff..0000000
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ConstantProcessor.java
+++ /dev/null
@@ -1,39 +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.traverser.Traverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ConstantProcessor<C, S, E> extends SimpleProcessor<C, S, E> 
{
-
-    private final E constant;
-
-    public ConstantProcessor(final E constant) {
-        this.constant = constant;
-    }
-
-    @Override
-    public void addStart(final Traverser<C, S> traverser) {
-        if (null == this.traverser)
-            this.traverser = traverser.split(this.constant);
-    }
-}
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/HasNextProcessor.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/HasNextProcessor.java
deleted file mode 100644
index ce2b5b1..0000000
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/HasNextProcessor.java
+++ /dev/null
@@ -1,39 +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.compiler.Compilation;
-import org.apache.tinkerpop.machine.traverser.Traverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class HasNextProcessor<C, S> extends SimpleProcessor<C, S, 
Boolean> {
-
-    private final Compilation<C, S, ?> predicate;
-
-    public HasNextProcessor(final Compilation<C, S, ?> predicate) {
-        this.predicate = predicate;
-    }
-
-    @Override
-    public void addStart(final Traverser<C, S> traverser) {
-        this.traverser = 
traverser.split(this.predicate.filterTraverser(traverser));
-    }
-}
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
index 34cd7fe..cbf8a7a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.machine.traverser.path;
 
 import java.util.ArrayList;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -28,8 +28,8 @@ import java.util.Set;
  */
 public final class BasicPath implements Path {
 
-    private final List<Object> objects = new ArrayList<>();
-    private final List<Set<String>> labels = new ArrayList<>();
+    private List<Set<String>> labels = new ArrayList<>();
+    private List<Object> objects = new ArrayList<>();
 
     public BasicPath() {
     }
@@ -39,25 +39,46 @@ public final class BasicPath implements Path {
         this.labels.addAll(path.labels);
     }
 
+    @Override
     public void add(final Set<String> labels, final Object object) {
         this.labels.add(labels);
         this.objects.add(object);
     }
 
-    public void addLabels(final Set<String> labels) {
-        if (this.labels.isEmpty())
-            this.labels.add(new HashSet<>());
-        this.labels.get(this.labels.size() - 1).addAll(labels);
-    }
-
+    @Override
     public Object object(final int index) {
         return this.objects.get(index);
     }
 
+    @Override
     public Set<String> labels(final int index) {
         return this.labels.get(index);
     }
 
+    @Override
+    public Object get(final Pop pop, final String label) {
+        if (Pop.last == pop) {
+            for (int i = this.labels.size() - 1; i >= 0; i--) {
+                if (this.labels.get(i).contains(label))
+                    return this.objects.get(i);
+            }
+        } else if (Pop.all == pop) {
+            final List<Object> objects = new ArrayList<>();
+            for (int i = 0; i < this.labels.size(); i++) {
+                if (this.labels.get(i).contains(label))
+                    objects.add(this.objects.get(i));
+            }
+            return objects;
+        } else { // must be Pop.first
+            for (int i = 0; i < this.labels.size(); i++) {
+                if (this.labels.get(i).contains(label))
+                    return this.objects.get(i);
+            }
+        }
+        throw Path.Exceptions.noObjectsForLabel(label);
+    }
+
+    @Override
     public int size() {
         return this.objects.size();
     }
@@ -66,4 +87,19 @@ public final class BasicPath implements Path {
     public String toString() {
         return this.objects.toString();
     }
+
+    @Override
+    public Path clone() {
+        try {
+            final BasicPath clone = (BasicPath) super.clone();
+            clone.objects = new ArrayList<>(this.objects);
+            clone.labels = new ArrayList<>(this.labels.size());
+            for (final Set<String> labelSet : this.labels) {
+                clone.labels.add(new LinkedHashSet<>(labelSet));
+            }
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
index caeee3f..420d76a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
@@ -38,11 +38,6 @@ public final class EmptyPath implements Path {
     }
 
     @Override
-    public void addLabels(final Set<String> labels) {
-
-    }
-
-    @Override
     public Object object(int index) {
         throw new IllegalStateException("No objects in EmptyPath");
     }
@@ -53,10 +48,20 @@ public final class EmptyPath implements Path {
     }
 
     @Override
+    public Object get(final Pop pop, final String label) {
+        return null;
+    }
+
+    @Override
     public int size() {
         return 0;
     }
 
+    @Override
+    public Path clone() {
+        return INSTANCE;
+    }
+
     public static final EmptyPath instance() {
         return INSTANCE;
     }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
index 4e35c91..567179a 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
@@ -24,15 +24,31 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Path extends Serializable {
+public interface Path extends Serializable, Cloneable {
 
-    public void add(final Set<String> labels, final Object object);
+    public enum Pop {
+        first, last, all;
+    }
 
-    public void addLabels(final Set<String> labels);
+    public void add(final Set<String> labels, final Object object);
 
     public Object object(final int index);
 
     public Set<String> labels(final int index);
 
+    public Object get(final Pop pop, final String label);
+
     public int size();
+
+    public Path clone();
+
+    public static class Exceptions {
+
+        private Exceptions() {
+        }
+
+        public static IllegalArgumentException noObjectsForLabel(final String 
label) {
+            return new IllegalArgumentException("The path does not have an 
object for the provided label: " + label);
+        }
+    }
 }
diff --git 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/species/COP_Traverser.java
 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/species/COP_Traverser.java
index 0ad0e9e..9eaf0e6 100644
--- 
a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/species/COP_Traverser.java
+++ 
b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/species/COP_Traverser.java
@@ -22,13 +22,14 @@ import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.CFunction;
 import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.traverser.path.BasicPath;
+import org.apache.tinkerpop.machine.traverser.path.Path;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class COP_Traverser<C, S> extends CO_Traverser<C, S> {
 
-    private BasicPath path = new BasicPath();
+    private Path path = new BasicPath();
 
     public COP_Traverser(final Coefficient<C> coefficient, final S object) {
         super(coefficient, object);
@@ -42,7 +43,7 @@ public class COP_Traverser<C, S> extends CO_Traverser<C, S> {
         return this.object;
     }
 
-    public BasicPath path() {
+    public Path path() {
         return this.path;
     }
 
@@ -69,7 +70,7 @@ public class COP_Traverser<C, S> extends CO_Traverser<C, S> {
         final COP_Traverser<C, S> clone = (COP_Traverser<C, S>) super.clone();
         clone.object = this.object;
         clone.coefficient = this.coefficient.clone();
-        clone.path = new BasicPath(this.path);
+        clone.path = this.path.clone();
         return clone;
     }
 
diff --git 
a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/BeamTest.java
 
b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/BeamTest.java
index e42efd2..4de0f21 100644
--- 
a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/BeamTest.java
+++ 
b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/BeamTest.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.language.gremlin.P;
 import org.apache.tinkerpop.language.gremlin.Traversal;
 import org.apache.tinkerpop.language.gremlin.TraversalSource;
 import org.apache.tinkerpop.language.gremlin.TraversalUtil;
-import org.apache.tinkerpop.language.gremlin.common.__;
+import org.apache.tinkerpop.language.gremlin.core.__;
 import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
 import org.apache.tinkerpop.machine.strategy.optimization.IdentityStrategy;
 import org.apache.tinkerpop.machine.structure.blueprints.BlueprintsStructure;
diff --git 
a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
 
b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
index 9119d36..e39b7ee 100644
--- 
a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
+++ 
b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
@@ -108,12 +108,18 @@ public class PipesTest {
         System.out.println(traversal);
         System.out.println(traversal.toList());
         System.out.println("\n----------\n");
+        traversal = g.inject(7L).as("a").union(__.<Long>incr().as("b"), 
__.<Long>incr().incr().as("b"), 
__.<Long>incr().incr().incr().as("b")).path("a","b").by(__.incr());
+        System.out.println(TraversalUtil.getBytecode(traversal));
+        System.out.println(traversal);
+        System.out.println(traversal.toList());
+        System.out.println("\n----------\n");
         traversal = g.inject(7L, 7L, 7L, 2L).incr().barrier();
         System.out.println(TraversalUtil.getBytecode(traversal));
         System.out.println(traversal);
         System.out.println(traversal.nextTraverser());
         System.out.println(traversal.nextTraverser());
         System.out.println(traversal.hasNext());
+
     }
 
     @Test

Reply via email to