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