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
commit 342e7604c4b7a053d3f766a67edef67bb9754e87 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Thu Mar 7 11:14:02 2019 -0700 Added ProcessorFactory which is used with a TraversalSource to register the factoryused to mint Processors to execute traversal chains. Thus, g = g.processor(PipesProcessor.class). Everything is moving along nicely. --- .../org/apache/tinkerpop/language/Traversal.java | 44 ++++++++++++++++++---- .../apache/tinkerpop/language/TraversalSource.java | 16 +++++++- .../language/{__.java => TraversalUtil.java} | 13 +++++-- .../java/org/apache/tinkerpop/language/__.java | 4 +- .../tinkerpop/machine/bytecode/BytecodeUtil.java | 10 ++--- .../tinkerpop/machine/bytecode/Instruction.java | 3 +- .../machine/functions/AbstractFunction.java | 4 +- .../machine/functions/FilterFunction.java | 2 +- .../machine/functions/FlatMapFunction.java | 2 +- .../machine/functions/InitialFunction.java | 2 +- .../tinkerpop/machine/functions/MapFunction.java | 2 +- .../machine/functions/NestedFunction.java | 2 +- .../machine/functions/filter/IdentityFilter.java | 2 +- .../machine/functions/filter/IsFilter.java | 8 ++-- .../machine/functions/initial/InjectInitial.java | 22 +++++------ .../tinkerpop/machine/functions/map/IncrMap.java | 2 +- .../tinkerpop/machine/functions/map/MapMap.java | 4 +- .../tinkerpop/machine/functions/map/PathMap.java | 4 +- .../IncrMap.java => processor/EmptyProcessor.java} | 37 +++++++++++++----- .../machine/processor/EmptyProcessorFactory.java} | 21 +++++++---- .../machine/{ => processor}/Processor.java | 2 +- .../processor/ProcessorFactory.java} | 10 ++--- .../tinkerpop/machine/traversers/Traverser.java | 10 ++--- .../apache/tinkerpop/machine/TraversalTest.java | 5 +-- .../machine/compiler/BytecodeUtilTest.java | 7 ++-- .../tinkerpop/machine/pipes/AbstractStep.java | 16 +++----- .../apache/tinkerpop/machine/pipes/FilterStep.java | 6 +-- .../apache/tinkerpop/machine/pipes/MapStep.java | 4 +- .../org/apache/tinkerpop/machine/pipes/Pipes.java | 18 ++++----- .../tinkerpop/machine/pipes/PipesProcessor.java} | 13 +++++-- .../org/apache/tinkerpop/machine/pipes/Step.java} | 9 +++-- .../apache/tinkerpop/machine/pipes/PipesTest.java | 18 ++++----- 32 files changed, 195 insertions(+), 127 deletions(-) diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java b/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java index 06b93bf..4021d08 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java @@ -19,19 +19,28 @@ package org.apache.tinkerpop.language; import org.apache.tinkerpop.machine.bytecode.Bytecode; +import org.apache.tinkerpop.machine.processor.Processor; +import org.apache.tinkerpop.machine.processor.ProcessorFactory; import org.apache.tinkerpop.machine.traversers.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** - * @author Marko S. Rodriguez (http://markorodriguez.com) + * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Traversal<C, S, E> { +public class Traversal<C, S, E> implements Iterator<E> { - private final Bytecode<C> bytecode; + protected final Bytecode<C> bytecode; private C currentCoefficient; + private final ProcessorFactory factory; + private Processor<C, S, E> processor; - public Traversal(final C unity) { + public Traversal(final C unity, final ProcessorFactory factory) { this.currentCoefficient = unity; this.bytecode = new Bytecode<>(); + this.factory = factory; } public Traversal<C, S, E> as(final String label) { @@ -65,7 +74,7 @@ public class Traversal<C, S, E> { } public <R> Traversal<C, S, R> map(final Traversal<C, E, R> mapTraversal) { - this.bytecode.addInstruction(this.currentCoefficient, Symbols.MAP, mapTraversal.getBytecode()); + this.bytecode.addInstruction(this.currentCoefficient, Symbols.MAP, mapTraversal.bytecode); return (Traversal) this; } @@ -74,10 +83,29 @@ public class Traversal<C, S, E> { return (Traversal) this; } + private void setupProcessor() { + if (null == this.processor) + this.processor = this.factory.mint(this.bytecode); + } - // create a utility class that directly access the class field so we don't have to do the Admin stuff in TP4. - public Bytecode<C> getBytecode() { - return this.bytecode; + @Override + public boolean hasNext() { + this.setupProcessor(); + return this.processor.hasNextTraverser(); } + @Override + public E next() { + this.setupProcessor(); + return this.processor.nextTraverser().object(); + } + + public List<E> toList() { + this.setupProcessor(); + final List<E> list = new ArrayList<>(); + while (this.hasNext()) { + list.add(this.next()); + } + return list; + } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java index 01c145a..a268330 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.language; +import org.apache.tinkerpop.machine.processor.ProcessorFactory; import org.apache.tinkerpop.machine.coefficients.Coefficients; import org.apache.tinkerpop.machine.coefficients.LongCoefficients; @@ -27,6 +28,8 @@ import org.apache.tinkerpop.machine.coefficients.LongCoefficients; public class TraversalSource<C> { private Coefficients<C> coefficients = (Coefficients) new LongCoefficients(); + private ProcessorFactory factory; + protected TraversalSource() { } @@ -36,8 +39,17 @@ public class TraversalSource<C> { return this; } - public <A> Traversal<C, A, A> inject(final A... objects) { - final Traversal<C, A, A> traversal = new Traversal<>(this.coefficients.unity()); + public TraversalSource<C> processor(final Class<? extends ProcessorFactory> processor) { + try { + this.factory = processor.newInstance(); + } catch (final Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + return this; + } + + public <S> Traversal<C, S, S> inject(final S... objects) { + final Traversal<C, S, S> traversal = new Traversal<>(this.coefficients.unity(), this.factory); return traversal.inject(objects); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/__.java b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalUtil.java similarity index 77% copy from java/core/src/main/java/org/apache/tinkerpop/language/__.java copy to java/core/src/main/java/org/apache/tinkerpop/language/TraversalUtil.java index e3c693e..758fb47 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalUtil.java @@ -18,12 +18,19 @@ */ package org.apache.tinkerpop.language; +import org.apache.tinkerpop.machine.bytecode.Bytecode; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class __ { +public final class TraversalUtil { + + private TraversalUtil() { + // do nothing + } - public static <C> Traversal<C, Long, Long> incr() { - return (Traversal) new Traversal<>(1L).incr(); + public static <C> Bytecode<C> getBytecode(final Traversal<C, ?, ?> traversal) { + return traversal.bytecode; } + } diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/__.java b/java/core/src/main/java/org/apache/tinkerpop/language/__.java index e3c693e..95f69f9 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/__.java @@ -18,12 +18,14 @@ */ package org.apache.tinkerpop.language; +import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class __ { public static <C> Traversal<C, Long, Long> incr() { - return (Traversal) new Traversal<>(1L).incr(); + return (Traversal) new Traversal<>(1L, EmptyProcessorFactory.instance()).incr(); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java index d7773a8..204a7dd 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java @@ -21,9 +21,9 @@ package org.apache.tinkerpop.machine.bytecode; import org.apache.tinkerpop.language.Symbols; import org.apache.tinkerpop.machine.functions.CFunction; import org.apache.tinkerpop.machine.functions.filter.IdentityFilter; -import org.apache.tinkerpop.machine.functions.map.IncrMap; -import org.apache.tinkerpop.machine.functions.initial.InjectInitial; import org.apache.tinkerpop.machine.functions.filter.IsFilter; +import org.apache.tinkerpop.machine.functions.initial.InjectInitial; +import org.apache.tinkerpop.machine.functions.map.IncrMap; import org.apache.tinkerpop.machine.functions.map.MapMap; import org.apache.tinkerpop.machine.functions.map.PathMap; @@ -46,7 +46,7 @@ public final class BytecodeUtil { return bytecode; } - public static <C> List<CFunction<C>> compile(final Bytecode<C> bytecode) throws Exception { + public static <C> List<CFunction<C>> compile(final Bytecode<C> bytecode) { final List<CFunction<C>> functions = new ArrayList<>(); for (final Instruction<C> instruction : bytecode.getInstructions()) { functions.add(BytecodeUtil.generateFunction(instruction)); @@ -54,7 +54,7 @@ public final class BytecodeUtil { return functions; } - private static <C> CFunction<C> generateFunction(final Instruction<C> instruction) throws Exception { + private static <C> CFunction<C> generateFunction(final Instruction<C> instruction) { final String op = instruction.op(); final C coefficient = instruction.coefficient(); final Set<String> labels = instruction.labels(); @@ -72,7 +72,7 @@ public final class BytecodeUtil { case Symbols.PATH: return new PathMap<>(coefficient, labels); default: - throw new Exception("This is an unknown instruction:" + instruction.op()); + throw new RuntimeException("This is an unknown instruction:" + instruction.op()); } } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java index ae40b1f..2a5df83 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java @@ -19,6 +19,7 @@ package org.apache.tinkerpop.machine.bytecode; import org.apache.tinkerpop.language.Traversal; +import org.apache.tinkerpop.language.TraversalUtil; import java.util.Arrays; import java.util.HashSet; @@ -62,7 +63,7 @@ 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 instanceof Traversal ? ((Traversal) arg).getBytecode() : arg; + this.args[this.args.length - 1] = arg instanceof Traversal ? TraversalUtil.getBytecode(((Traversal) arg)) : arg; } @Override diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java index 048980e..d759c97 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java @@ -25,7 +25,7 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public abstract class AbstractFunction<C> implements CFunction<C> { +public abstract class AbstractFunction<C, S, E> implements CFunction<C> { protected final C coefficient; private Set<String> labels; @@ -45,7 +45,7 @@ public abstract class AbstractFunction<C> implements CFunction<C> { return this.labels; } - protected <A> Traverser<C, A> postProcess(final Traverser<C, A> traverser) { + protected Traverser<C, E> postProcess(final Traverser<C, E> traverser) { for (final String label : labels) { traverser.addLabel(label); } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FilterFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FilterFunction.java index 64622d9..01def6b 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FilterFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FilterFunction.java @@ -25,5 +25,5 @@ import java.util.function.Predicate; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface FilterFunction<C, A> extends Predicate<Traverser<C, A>>, CFunction<C> { +public interface FilterFunction<C, S> extends Predicate<Traverser<C, S>>, CFunction<C> { } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java index 8f5933b..3bc5d68 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java @@ -26,5 +26,5 @@ import java.util.function.Function; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface FlatMapFunction<C, A, B> extends Function<Traverser<C, A>, Iterator<Traverser<C, B>>>, CFunction<C> { +public interface FlatMapFunction<C, S, E> extends Function<Traverser<C, S>, Iterator<Traverser<C, E>>>, CFunction<C> { } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/InitialFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/InitialFunction.java index f4430ce..d44c47b 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/InitialFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/InitialFunction.java @@ -26,5 +26,5 @@ import java.util.function.Supplier; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface InitialFunction<C,A> extends Supplier<Iterator<Traverser<C,A>>>, CFunction<C> { +public interface InitialFunction<C, S> extends Supplier<Iterator<Traverser<C, S>>>, CFunction<C> { } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/MapFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/MapFunction.java index 55fb230..f5b5302 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/MapFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/MapFunction.java @@ -25,6 +25,6 @@ import java.util.function.Function; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface MapFunction<C, A, B> extends Function<Traverser<C, A>, Traverser<C, B>>, CFunction<C> { +public interface MapFunction<C, S, E> extends Function<Traverser<C, S>, Traverser<C, E>>, CFunction<C> { } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/NestedFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/NestedFunction.java index f00abad..3ecfed6 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/NestedFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/NestedFunction.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.machine.functions; -import org.apache.tinkerpop.machine.Processor; +import org.apache.tinkerpop.machine.processor.Processor; import java.util.List; diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java index cd385a7..42d77b7 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java @@ -27,7 +27,7 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class IdentityFilter<C, S> extends AbstractFunction<C> implements FilterFunction<C, S> { +public class IdentityFilter<C, S> extends AbstractFunction<C,S,S> implements FilterFunction<C, S> { public IdentityFilter(final C coefficient, final Set<String> labels) { super(coefficient, labels); diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java index 2bcc74d..69a64df 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java @@ -27,17 +27,17 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class IsFilter<C, A> extends AbstractFunction<C> implements FilterFunction<C, A> { +public class IsFilter<C, S> extends AbstractFunction<C, S, S> implements FilterFunction<C, S> { - private final A object; + private final S object; - public IsFilter(final C coefficient, final Set<String> labels, final A object) { + public IsFilter(final C coefficient, final Set<String> labels, final S object) { super(coefficient, labels); this.object = object; } @Override - public boolean test(final Traverser<C, A> traverser) { + public boolean test(final Traverser<C, S> traverser) { return traverser.object().equals(this.object); } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java index f302df0..93f5d86 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java @@ -22,34 +22,30 @@ import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.InitialFunction; import org.apache.tinkerpop.machine.traversers.Traverser; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; -import java.util.List; import java.util.Set; +import java.util.stream.Stream; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class InjectInitial<C, A> extends AbstractFunction<C> implements InitialFunction<C, A> { +public class InjectInitial<C, S> extends AbstractFunction<C, S, S> implements InitialFunction<C, S> { - private final List<Traverser<C, A>> traversers; + private final S[] objects; - public InjectInitial(final C coefficient, final Set<String> labels, final A... objects) { + public InjectInitial(final C coefficient, final Set<String> labels, final S... objects) { super(coefficient, labels); - this.traversers = new ArrayList<>(); - for (final A object : objects) { - this.traversers.add(new Traverser<>(this.coefficient, object)); - } - + this.objects = objects; } @Override - public Iterator<Traverser<C, A>> get() { - return this.traversers.iterator(); + public Iterator<Traverser<C, S>> get() { + return Stream.of(this.objects).map(a -> new Traverser<>(this.coefficient, a)).iterator(); } @Override public String toString() { - return "[" + this.coefficient + "]" + this.getClass().getSimpleName() + ":" + this.traversers; + return "[" + this.coefficient + "]" + this.getClass().getSimpleName() + ":" + Arrays.toString(this.objects); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java index 4c25bba..f0eb939 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java @@ -27,7 +27,7 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class IncrMap<C> extends AbstractFunction<C> implements MapFunction<C, Long, Long> { +public class IncrMap<C> extends AbstractFunction<C, Long, Long> implements MapFunction<C, Long, Long> { public IncrMap(final C coefficient, final Set<String> labels) { super(coefficient, labels); diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java index 952038d..7d8a7bc 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.machine.functions.map; -import org.apache.tinkerpop.machine.Processor; +import org.apache.tinkerpop.machine.processor.Processor; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.CFunction; import org.apache.tinkerpop.machine.functions.MapFunction; @@ -31,7 +31,7 @@ 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>, NestedFunction<C, S, E> { +public class MapMap<C, S, E> extends AbstractFunction<C,S,E> implements MapFunction<C, S, E>, NestedFunction<C, S, E> { private final List<CFunction<C>> mapFunctions; private Processor<C, S, E> processor; diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java index 9ba9f26..a8ee4e7 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java @@ -28,14 +28,14 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class PathMap<C, A> extends AbstractFunction<C> implements MapFunction<C, A, Path> { +public class PathMap<C, S> extends AbstractFunction<C, S, Path> implements MapFunction<C, S, Path> { public PathMap(final C coefficient, final Set<String> labels) { super(coefficient, labels); } @Override - public Traverser<C, Path> apply(final Traverser<C, A> traverser) { + public Traverser<C, Path> apply(final Traverser<C, S> traverser) { return traverser.split(this.coefficient, traverser.path()); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java similarity index 58% copy from java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java copy to java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java index 4c25bba..e22ab3e 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java @@ -16,25 +16,42 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.functions.map; +package org.apache.tinkerpop.machine.processor; -import org.apache.tinkerpop.machine.functions.AbstractFunction; -import org.apache.tinkerpop.machine.functions.MapFunction; import org.apache.tinkerpop.machine.traversers.Traverser; - -import java.util.Set; +import org.apache.tinkerpop.machine.util.FastNoSuchElementException; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class IncrMap<C> extends AbstractFunction<C> implements MapFunction<C, Long, Long> { +public class EmptyProcessor<C, S, E> implements Processor<C, S, E> { + + private static final EmptyProcessor INSTANCE = new EmptyProcessor(); + + private EmptyProcessor() { + } + + @Override + public void addStart(Traverser<C, S> traverser) { - public IncrMap(final C coefficient, final Set<String> labels) { - super(coefficient, labels); } @Override - public Traverser<C, Long> apply(final Traverser<C, Long> traverser) { - return postProcess(traverser.split(traverser.coefficient(), traverser.object() + 1)); + public Traverser<C, E> nextTraverser() { + throw FastNoSuchElementException.instance(); + } + + @Override + public boolean hasNextTraverser() { + return false; + } + + @Override + public void reset() { + + } + + public static <C, S, E> EmptyProcessor<C, S, E> instance() { + return INSTANCE; } } diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessorFactory.java similarity index 64% copy from java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java copy to java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessorFactory.java index 21a953b..89233df 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessorFactory.java @@ -16,22 +16,27 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.pipes; +package org.apache.tinkerpop.machine.processor; -import org.apache.tinkerpop.machine.functions.MapFunction; -import org.apache.tinkerpop.machine.traversers.Traverser; +import org.apache.tinkerpop.machine.bytecode.Bytecode; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class MapStep<C, S, E> extends AbstractStep<C, S, E> { +public class EmptyProcessorFactory implements ProcessorFactory { + + private static final EmptyProcessorFactory INSTANCE = new EmptyProcessorFactory(); + + private EmptyProcessorFactory() { - public MapStep(final AbstractStep previousStep, final MapFunction<C, S, E> mapFunction) { - super(previousStep, mapFunction); } @Override - public Traverser<C, E> next() { - return ((MapFunction<C, S, E>) this.function).apply(super.getNextTraverser()); + public <C, S, E> Processor<C, S, E> mint(final Bytecode<C> bytecode) { + return EmptyProcessor.instance(); + } + + public static EmptyProcessorFactory instance() { + return INSTANCE; } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/Processor.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java similarity index 95% rename from java/core/src/main/java/org/apache/tinkerpop/machine/Processor.java rename to java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java index b068e01..09fe2b7 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/Processor.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine; +package org.apache.tinkerpop.machine.processor; import org.apache.tinkerpop.machine.traversers.Traverser; diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/__.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java similarity index 80% copy from java/core/src/main/java/org/apache/tinkerpop/language/__.java copy to java/core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java index e3c693e..9eeed95 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java @@ -16,14 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.language; +package org.apache.tinkerpop.machine.processor; + +import org.apache.tinkerpop.machine.bytecode.Bytecode; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class __ { +public interface ProcessorFactory { - public static <C> Traversal<C, Long, Long> incr() { - return (Traversal) new Traversal<>(1L).incr(); - } + public <C, S, E> Processor<C, S, E> mint(final Bytecode<C> bytecode); } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java index 6bd2ea1..f7a94e3 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java @@ -24,13 +24,13 @@ import java.util.HashSet; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Traverser<C, A> { +public class Traverser<C, S> { private final C coefficient; - private final A object; + private final S object; private Path path = new Path(); - public Traverser(final C coefficient, final A object) { + public Traverser(final C coefficient, final S object) { this.coefficient = coefficient; this.object = object; } @@ -39,7 +39,7 @@ public class Traverser<C, A> { return this.coefficient; } - public A object() { + public S object() { return this.object; } @@ -60,7 +60,7 @@ public class Traverser<C, A> { @Override public boolean equals(final Object other) { - return other instanceof Traverser && ((Traverser<C, A>) other).object.equals(this.object); + return other instanceof Traverser && ((Traverser<C, S>) other).object.equals(this.object); } @Override diff --git a/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java b/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java index d54b40b..0b0c7ba 100644 --- a/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java +++ b/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java @@ -23,7 +23,6 @@ import org.apache.tinkerpop.language.Traversal; import org.apache.tinkerpop.language.TraversalSource; import org.apache.tinkerpop.language.__; import org.apache.tinkerpop.machine.coefficients.LongCoefficients; -import org.apache.tinkerpop.machine.bytecode.BytecodeUtil; import org.junit.jupiter.api.Test; /** @@ -36,7 +35,7 @@ public class TraversalTest { TraversalSource<Long> g = Gremlin.traversal(); g = g.coefficients(LongCoefficients.instance()); final Traversal<Long, Long, Long> traversal = g.inject(7L).is(7L).incr().as("a").is(8L).by(__.incr()); - System.out.println(traversal.getBytecode()); - System.out.println(BytecodeUtil.compile(traversal.getBytecode())); + //System.out.println(traversal.bytecode); + //System.out.println(BytecodeUtil.compile(traversal.getBytecode())); } } diff --git a/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java b/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java index c5551ba..51b819e 100644 --- a/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java +++ b/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java @@ -19,6 +19,7 @@ package org.apache.tinkerpop.machine.compiler; import org.apache.tinkerpop.language.Traversal; +import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory; import org.apache.tinkerpop.machine.bytecode.BytecodeUtil; import org.junit.jupiter.api.Test; @@ -29,9 +30,9 @@ public class BytecodeUtilTest { @Test public void shouldHaveBytecode() throws Exception { - final Traversal<Long, Long, Long> traversal = new Traversal<>(1L); + final Traversal<Long, Long, Long> traversal = new Traversal<>(1L, EmptyProcessorFactory.instance()); traversal.incr().is(2L); - System.out.println(traversal.getBytecode()); - System.out.println(BytecodeUtil.compile(traversal.getBytecode())); + //System.out.println(traversal.bytecode); + //System.out.println(BytecodeUtil.compile(traversal.getBytecode())); } } diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java index 72a81b2..2103b96 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java @@ -23,15 +23,13 @@ import org.apache.tinkerpop.machine.traversers.Traverser; import org.apache.tinkerpop.machine.traversers.TraverserSet; import org.apache.tinkerpop.machine.util.FastNoSuchElementException; -import java.util.Iterator; - /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public abstract class AbstractStep<C, S, E> implements Iterator<Traverser<C, E>> { +public abstract class AbstractStep<C, S, E> implements Step<C, S, E> { protected final CFunction<C> function; - protected final AbstractStep previousStep; + protected final AbstractStep<C, ?, S> previousStep; protected TraverserSet<C, S> traverserSet = new TraverserSet<>(); public AbstractStep(final AbstractStep<C, ?, S> previousStep, final CFunction<C> function) { @@ -51,15 +49,13 @@ public abstract class AbstractStep<C, S, E> implements Iterator<Traverser<C, E>> @Override public abstract Traverser<C, E> next(); - protected Traverser<C, S> getNextTraverser() { - Traverser<C, S> traverser = null; + protected Traverser<C, S> processNextTraverser() { if (!this.traverserSet.isEmpty()) - traverser = this.traverserSet.remove(); + return this.traverserSet.remove(); else if (this.previousStep.hasNext()) - traverser = this.previousStep.next(); - if (null == traverser) + return this.previousStep.next(); + else throw FastNoSuchElementException.instance(); - return traverser; } @Override diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/FilterStep.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/FilterStep.java index 19d54e7..eb1d1e2 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/FilterStep.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/FilterStep.java @@ -26,17 +26,17 @@ import org.apache.tinkerpop.machine.traversers.Traverser; */ public class FilterStep<C, S> extends AbstractStep<C, S, S> { - public FilterStep(final AbstractStep previousStep, final FilterFunction<C, S> filterFunction) { + public FilterStep(final AbstractStep<C, ?, S> previousStep, final FilterFunction<C, S> filterFunction) { super(previousStep, filterFunction); } @Override public Traverser<C, S> next() { - Traverser<C, S> traverser = this.getNextTraverser(); + Traverser<C, S> traverser; while (true) { + traverser = this.processNextTraverser(); if (((FilterFunction<C, S>) this.function).test(traverser)) return traverser; - traverser = this.getNextTraverser(); } } } diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java index 21a953b..1216491 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/MapStep.java @@ -26,12 +26,12 @@ import org.apache.tinkerpop.machine.traversers.Traverser; */ public class MapStep<C, S, E> extends AbstractStep<C, S, E> { - public MapStep(final AbstractStep previousStep, final MapFunction<C, S, E> mapFunction) { + public MapStep(final AbstractStep<C, ?, S> previousStep, final MapFunction<C, S, E> mapFunction) { super(previousStep, mapFunction); } @Override public Traverser<C, E> next() { - return ((MapFunction<C, S, E>) this.function).apply(super.getNextTraverser()); + return ((MapFunction<C, S, E>) this.function).apply(super.processNextTraverser()); } } diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java index 775a50b..c7a57eb 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.machine.pipes; -import org.apache.tinkerpop.machine.Processor; +import org.apache.tinkerpop.machine.processor.Processor; import org.apache.tinkerpop.machine.bytecode.Bytecode; import org.apache.tinkerpop.machine.bytecode.BytecodeUtil; import org.apache.tinkerpop.machine.functions.CFunction; @@ -38,19 +38,19 @@ import java.util.List; public class Pipes<C, S, E> implements Iterator<E>, Processor<C, S, E> { private final List<AbstractStep<?, ?, ?>> steps = new ArrayList<>(); - private AbstractStep<C, ?, E> endStep; - private AbstractStep<C, S, ?> startStep = EmptyStep.instance(); + private Step<C, ?, E> endStep; + private Step<C, S, ?> startStep = EmptyStep.instance(); private Pipes(final List<CFunction<C>> functions) { - AbstractStep previousStep = EmptyStep.instance(); + AbstractStep<C, ?, ?> previousStep = EmptyStep.instance(); for (final CFunction<?> function : functions) { if (function instanceof NestedFunction) - ((NestedFunction<C, S, E>) function).setProcessor(new Pipes<>(((NestedFunction<C, S, E>) function).getFunctions())); + ((NestedFunction<C, ?, ?>) function).setProcessor(new Pipes<>(((NestedFunction<C, ?, ?>) function).getFunctions())); final AbstractStep nextStep; if (function instanceof FilterFunction) - nextStep = new FilterStep<>(previousStep, (FilterFunction<C, ?>) function); + nextStep = new FilterStep(previousStep, (FilterFunction<C, ?>) function); else if (function instanceof MapFunction) - nextStep = new MapStep<>(previousStep, (MapFunction<C, ?, ?>) function); + nextStep = new MapStep(previousStep, (MapFunction<C, ?, ?>) function); else if (function instanceof InitialFunction) nextStep = new InitialStep<>((InitialFunction<C, S>) function); else @@ -62,10 +62,10 @@ public class Pipes<C, S, E> implements Iterator<E>, Processor<C, S, E> { this.steps.add(nextStep); previousStep = nextStep; } - this.endStep = previousStep; + this.endStep = (Step<C, ?, E>) previousStep; } - public Pipes(final Bytecode<C> bytecode) throws Exception { + public Pipes(final Bytecode<C> bytecode) { this(BytecodeUtil.compile(BytecodeUtil.optimize(bytecode))); } diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/__.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/PipesProcessor.java similarity index 68% copy from java/core/src/main/java/org/apache/tinkerpop/language/__.java copy to java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/PipesProcessor.java index e3c693e..14f2e7a 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/PipesProcessor.java @@ -16,14 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.language; +package org.apache.tinkerpop.machine.pipes; + +import org.apache.tinkerpop.machine.processor.Processor; +import org.apache.tinkerpop.machine.processor.ProcessorFactory; +import org.apache.tinkerpop.machine.bytecode.Bytecode; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class __ { +public class PipesProcessor implements ProcessorFactory { - public static <C> Traversal<C, Long, Long> incr() { - return (Traversal) new Traversal<>(1L).incr(); + @Override + public <C, S, E> Processor<C, S, E> mint(final Bytecode<C> bytecode) { + return new Pipes<>(bytecode); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java similarity index 82% copy from java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java copy to java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java index 8f5933b..a24d037 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/FlatMapFunction.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java @@ -16,15 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.functions; +package org.apache.tinkerpop.machine.pipes; import org.apache.tinkerpop.machine.traversers.Traverser; import java.util.Iterator; -import java.util.function.Function; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface FlatMapFunction<C, A, B> extends Function<Traverser<C, A>, Iterator<Traverser<C, B>>>, CFunction<C> { +public interface Step<C, S, E> extends Iterator<Traverser<C, E>> { + + public void addTraverser(final Traverser<C, S> traverser); + + // public void reset(); } diff --git a/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java b/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java index 97835e2..e102e6c 100644 --- a/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java +++ b/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java @@ -19,8 +19,8 @@ package org.apache.tinkerpop.machine.pipes; import org.apache.tinkerpop.language.Gremlin; -import org.apache.tinkerpop.language.Traversal; import org.apache.tinkerpop.language.TraversalSource; +import org.apache.tinkerpop.language.TraversalUtil; import org.apache.tinkerpop.language.__; import org.apache.tinkerpop.machine.coefficients.LongCoefficients; import org.junit.jupiter.api.Test; @@ -31,15 +31,11 @@ import org.junit.jupiter.api.Test; public class PipesTest { @Test - public void shouldWork() throws Exception { - final TraversalSource<Long> g = Gremlin.<Long>traversal().coefficients(LongCoefficients.instance()); - //final Traversal<Long, Long, Long> traversal = g.inject(7L, 10L, 12L).incr().incr().incr(); - //final Pipes pipes = new Pipes<Long, Long, Long>(traversal.getBytecode()); - //System.out.println(pipes.hasNext()); - //System.out.println(pipes.toList()); - //System.out.println(pipes.hasNext()); - System.out.println(g.inject(7L, 10L, 12L).map(__.incr()).identity().getBytecode()); - System.out.println(new Pipes<>(g.inject(7L, 10L, 12L).map(__.incr()).identity().getBytecode())); - System.out.println(new Pipes<>(g.inject(7L, 10L, 12L).map(__.incr()).identity().getBytecode()).toList()); + public void shouldWork() { + final TraversalSource<Long> g = Gremlin.<Long>traversal() + .coefficients(LongCoefficients.instance()) + .processor(PipesProcessor.class); + System.out.println(g.inject(7L, 10L, 12L).map(__.incr()).identity().toList()); + System.out.println(TraversalUtil.getBytecode(g.inject(7L, 10L, 12L).map(__.incr()).identity())); } }