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 d56b089fc2b7bdaa2d535858647c731e765cb694 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Thu Mar 7 14:33:33 2019 -0700 Coefficients are now wrapped in Coefficient<C> objects and passed around through functions and traversers. This was the only way to make it clean. Added StringFactory which gives Bytecode and Traversals standard toString() representations. Stubbed the strategy/ package and interface. Processors now implement Iterator<Traverser>. This makes sense as its up to the Traversal to get traversers from the processor and stream them out (unpack them) to the user. The processor is now completel [...] --- .../org/apache/tinkerpop/language/Symbols.java | 1 + .../org/apache/tinkerpop/language/Traversal.java | 36 +++++++- .../apache/tinkerpop/language/TraversalSource.java | 24 ++++-- .../java/org/apache/tinkerpop/language/__.java | 4 +- .../tinkerpop/machine/bytecode/Bytecode.java | 7 +- .../tinkerpop/machine/bytecode/BytecodeUtil.java | 3 +- .../tinkerpop/machine/bytecode/Instruction.java | 10 ++- .../{Coefficients.java => Coefficient.java} | 19 +++-- .../machine/coefficients/LongCoefficient.java | 98 ++++++++++++++++++++++ .../machine/coefficients/LongCoefficients.java | 56 ------------- .../Coefficients.java => compiler/Strategy.java} | 17 ++-- .../machine/functions/AbstractFunction.java | 13 +-- .../tinkerpop/machine/functions/CFunction.java | 4 +- .../machine/functions/filter/IdentityFilter.java | 4 +- .../machine/functions/filter/IsFilter.java | 7 +- .../machine/functions/initial/InjectInitial.java | 9 +- .../tinkerpop/machine/functions/map/IncrMap.java | 5 +- .../tinkerpop/machine/functions/map/MapMap.java | 12 +-- .../tinkerpop/machine/functions/map/PathMap.java | 5 +- .../machine/processor/EmptyProcessor.java | 6 +- .../tinkerpop/machine/processor/Processor.java | 8 +- .../tinkerpop/machine/traversers/Traverser.java | 12 +-- .../tinkerpop/machine/traversers/TraverserSet.java | 13 ++- .../util/FastNoSuchElementException.java | 2 +- .../org/apache/tinkerpop/util/StringFactory.java | 68 +++++++++++++++ .../apache/tinkerpop/machine/TraversalTest.java | 4 +- .../machine/compiler/BytecodeUtilTest.java | 4 +- .../tinkerpop/machine/pipes/AbstractStep.java | 12 +-- .../apache/tinkerpop/machine/pipes/EmptyStep.java | 2 +- .../tinkerpop/machine/pipes/InitialStep.java | 9 +- .../org/apache/tinkerpop/machine/pipes/Pipes.java | 36 ++------ .../org/apache/tinkerpop/machine/pipes/Step.java | 4 +- .../apache/tinkerpop/machine/pipes/PipesTest.java | 11 ++- 33 files changed, 348 insertions(+), 177 deletions(-) diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java b/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java index 387a209..681e26e 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java @@ -24,6 +24,7 @@ package org.apache.tinkerpop.language; public final class Symbols { public static final String AS = "as"; + public static final String C = "c"; public static final String IDENTITY = "identity"; public static final String IS = "is"; public static final String INCR = "incr"; 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 4021d08..7acdd75 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,9 +19,11 @@ package org.apache.tinkerpop.language; import org.apache.tinkerpop.machine.bytecode.Bytecode; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.processor.Processor; import org.apache.tinkerpop.machine.processor.ProcessorFactory; import org.apache.tinkerpop.machine.traversers.Path; +import org.apache.tinkerpop.machine.traversers.Traverser; import java.util.ArrayList; import java.util.Iterator; @@ -33,11 +35,13 @@ import java.util.List; public class Traversal<C, S, E> implements Iterator<E> { protected final Bytecode<C> bytecode; - private C currentCoefficient; + private Coefficient<C> currentCoefficient; private final ProcessorFactory factory; private Processor<C, S, E> processor; + private long lastCount = 0L; + private E lastObject = null; - public Traversal(final C unity, final ProcessorFactory factory) { + public Traversal(final Coefficient<C> unity, final ProcessorFactory factory) { this.currentCoefficient = unity; this.bytecode = new Bytecode<>(); this.factory = factory; @@ -53,6 +57,11 @@ public class Traversal<C, S, E> implements Iterator<E> { return this; } + public Traversal<C, S, E> c(final C coefficient) { + this.currentCoefficient.set(coefficient); + return this; + } + public Traversal<C, S, E> identity() { this.bytecode.addInstruction(this.currentCoefficient, Symbols.IDENTITY); return this; @@ -83,6 +92,9 @@ public class Traversal<C, S, E> implements Iterator<E> { return (Traversal) this; } + /////// + + private void setupProcessor() { if (null == this.processor) this.processor = this.factory.mint(this.bytecode); @@ -91,13 +103,23 @@ public class Traversal<C, S, E> implements Iterator<E> { @Override public boolean hasNext() { this.setupProcessor(); - return this.processor.hasNextTraverser(); + return this.lastCount > 0 || this.processor.hasNext(); } @Override public E next() { this.setupProcessor(); - return this.processor.nextTraverser().object(); + if (this.lastCount > 0) { + this.lastCount--; + return this.lastObject; + } else { + final Traverser<C, E> traverser = this.processor.next(); + if (traverser.coefficient().count() > 1) { + this.lastObject = traverser.object(); + this.lastCount = traverser.coefficient().count() - 1L; + } + return traverser.object(); + } } public List<E> toList() { @@ -108,4 +130,10 @@ public class Traversal<C, S, E> implements Iterator<E> { } return list; } + + @Override + public String toString() { + this.setupProcessor(); + return this.processor.toString(); + } } 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 a268330..be6df43 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,24 +18,31 @@ */ package org.apache.tinkerpop.language; +import org.apache.tinkerpop.machine.coefficients.Coefficient; +import org.apache.tinkerpop.machine.coefficients.LongCoefficient; +import org.apache.tinkerpop.machine.compiler.Strategy; import org.apache.tinkerpop.machine.processor.ProcessorFactory; -import org.apache.tinkerpop.machine.coefficients.Coefficients; -import org.apache.tinkerpop.machine.coefficients.LongCoefficients; + +import java.util.ArrayList; +import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class TraversalSource<C> { - private Coefficients<C> coefficients = (Coefficients) new LongCoefficients(); + private Coefficient<C> coefficient; private ProcessorFactory factory; + private List<Strategy> strategies = new ArrayList<>(); protected TraversalSource() { + this.coefficient = (Coefficient<C>) LongCoefficient.create(); } - public TraversalSource<C> coefficients(final Coefficients coefficients) { - this.coefficients = coefficients; + public TraversalSource<C> coefficient(final Coefficient<C> coefficient) { + this.coefficient = coefficient.clone(); + this.coefficient.unity(); return this; } @@ -48,8 +55,13 @@ public class TraversalSource<C> { return this; } + public TraversalSource<C> strategy(final Strategy strategy) { + this.strategies.add(strategy); + 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); + final Traversal<C, S, S> traversal = new Traversal<>(this.coefficient, 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/__.java index 95f69f9..23fbb65 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java +++ b/java/core/src/main/java/org/apache/tinkerpop/language/__.java @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.language; +import org.apache.tinkerpop.machine.coefficients.LongCoefficient; import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory; /** @@ -26,6 +27,7 @@ import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory; public class __ { public static <C> Traversal<C, Long, Long> incr() { - return (Traversal) new Traversal<>(1L, EmptyProcessorFactory.instance()).incr(); + // this is bad -- it needs to know how to get the coefficient of the parent traversal + return (Traversal) new Traversal<>(LongCoefficient.create(), EmptyProcessorFactory.instance()).incr(); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java index 68e91db..6b53da5 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.machine.bytecode; +import org.apache.tinkerpop.machine.coefficients.Coefficient; + import java.util.ArrayList; import java.util.List; @@ -32,8 +34,9 @@ public class Bytecode<C> { this.instructions = new ArrayList<>(); } - public void addInstruction(final C coefficient, final String op, final Object... args) { - this.instructions.add(new Instruction<>(coefficient, op, args)); + public void addInstruction(final Coefficient<C> coefficient, final String op, final Object... args) { + this.instructions.add(new Instruction<>(coefficient.clone(), op, args)); + coefficient.unity(); } public List<Instruction<C>> getInstructions() { 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 204a7dd..8f560fb 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 @@ -19,6 +19,7 @@ package org.apache.tinkerpop.machine.bytecode; import org.apache.tinkerpop.language.Symbols; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.CFunction; import org.apache.tinkerpop.machine.functions.filter.IdentityFilter; import org.apache.tinkerpop.machine.functions.filter.IsFilter; @@ -56,7 +57,7 @@ public final class BytecodeUtil { private static <C> CFunction<C> generateFunction(final Instruction<C> instruction) { final String op = instruction.op(); - final C coefficient = instruction.coefficient(); + final Coefficient<C> coefficient = instruction.coefficient(); final Set<String> labels = instruction.labels(); switch (op) { case Symbols.IDENTITY: 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 2a5df83..5612a65 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 @@ -20,6 +20,8 @@ package org.apache.tinkerpop.machine.bytecode; import org.apache.tinkerpop.language.Traversal; import org.apache.tinkerpop.language.TraversalUtil; +import org.apache.tinkerpop.machine.coefficients.Coefficient; +import org.apache.tinkerpop.util.StringFactory; import java.util.Arrays; import java.util.HashSet; @@ -30,18 +32,18 @@ import java.util.Set; */ public final class Instruction<C> { - private final C coefficient; + private final Coefficient<C> coefficient; private final String op; private Object[] args; private final Set<String> labels = new HashSet<>(); - public Instruction(final C coefficient, final String op, final Object... args) { + public Instruction(final Coefficient<C> coefficient, final String op, final Object... args) { this.coefficient = coefficient; this.op = op; this.args = args; } - public C coefficient() { + public Coefficient<C> coefficient() { return this.coefficient; } @@ -68,6 +70,6 @@ public final class Instruction<C> { @Override public String toString() { - return "[" + this.coefficient + "]" + this.op + ":" + Arrays.toString(this.args).replace("[", "").replace("]", "" + "@" + this.labels); + return StringFactory.makeInstructionString(this); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java similarity index 71% copy from java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java copy to java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java index e00694f..bfad9d3 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java @@ -21,16 +21,23 @@ package org.apache.tinkerpop.machine.coefficients; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface Coefficients<C> { +public interface Coefficient<C> extends Cloneable { - public C sum(final C coefficientA, final C coefficientB); + public Coefficient<C> sum(final C other); - public C multiply(final C coefficientA, final C coefficientB); + public Coefficient<C> multiply(final C other); - public C unity(); + public Coefficient<C> set(final C other); - public C zero(); + public Coefficient<C> unity(); - public Long count(final Long coefficient); + public Coefficient<C> zero(); + public boolean isUnity(); + + public C value(); + + public Long count(); + + public Coefficient<C> clone(); } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java new file mode 100644 index 0000000..8762553 --- /dev/null +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java @@ -0,0 +1,98 @@ +/* + * 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.coefficients; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public class LongCoefficient implements Coefficient<Long> { + + private Long value; + + private LongCoefficient(final Long value) { + this.value = value; + } + + @Override + public Coefficient<Long> sum(final Long other) { + this.value = this.value + other; + return this; + } + + @Override + public Coefficient<Long> multiply(final Long other) { + this.value = this.value * other; + return this; + } + + @Override + public Coefficient<Long> set(final Long value) { + this.value = value; + return this; + } + + @Override + public Coefficient<Long> unity() { + this.value = 1L; + return this; + } + + @Override + public Coefficient<Long> zero() { + this.value = 0L; + return this; + } + + @Override + public boolean isUnity() { + return this.value == 1L; + } + + @Override + public Long value() { + return this.value; + } + + @Override + public Long count() { + return this.value; + } + + @Override + public String toString() { + return this.value.toString(); + } + + @Override + public LongCoefficient clone() { + try { + return (LongCoefficient) super.clone(); + } catch (final CloneNotSupportedException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static LongCoefficient create(final Long coefficient) { + return new LongCoefficient(coefficient); + } + + public static LongCoefficient create() { + return new LongCoefficient(1L); + } +} diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java deleted file mode 100644 index 49406cf..0000000 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java +++ /dev/null @@ -1,56 +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.coefficients; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public final class LongCoefficients implements Coefficients<Long> { - - private static final LongCoefficients INSTANCE = new LongCoefficients(); - - @Override - public final Long sum(final Long coefficientA, final Long coefficientB) { - return coefficientA + coefficientB; - } - - @Override - public final Long multiply(final Long coefficientA, final Long coefficientB) { - return coefficientA * coefficientB; - } - - @Override - public final Long unity() { - return 1L; - } - - @Override - public final Long zero() { - return 0L; - } - - @Override - public final Long count(final Long coefficient) { - return coefficient; - } - - public static LongCoefficients instance() { - return INSTANCE; - } -} diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java b/java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java similarity index 73% rename from java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java rename to java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java index e00694f..895f94b 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java @@ -16,21 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.coefficients; +package org.apache.tinkerpop.machine.compiler; + +import org.apache.tinkerpop.machine.bytecode.Bytecode; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface Coefficients<C> { - - public C sum(final C coefficientA, final C coefficientB); - - public C multiply(final C coefficientA, final C coefficientB); - - public C unity(); - - public C zero(); - - public Long count(final Long coefficient); +public interface Strategy { + public <C> void process(final Bytecode<C> bytecode); } 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 d759c97..5323696 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 @@ -18,7 +18,9 @@ */ package org.apache.tinkerpop.machine.functions; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.traversers.Traverser; +import org.apache.tinkerpop.util.StringFactory; import java.util.Set; @@ -27,16 +29,16 @@ import java.util.Set; */ public abstract class AbstractFunction<C, S, E> implements CFunction<C> { - protected final C coefficient; + protected final Coefficient<C> coefficient; private Set<String> labels; - public AbstractFunction(final C coefficient, final Set<String> labels) { + public AbstractFunction(final Coefficient<C> coefficient, final Set<String> labels) { this.coefficient = coefficient; this.labels = labels; } @Override - public C coefficient() { + public Coefficient<C> coefficient() { return this.coefficient; } @@ -46,7 +48,8 @@ public abstract class AbstractFunction<C, S, E> implements CFunction<C> { } protected Traverser<C, E> postProcess(final Traverser<C, E> traverser) { - for (final String label : labels) { + traverser.coefficient().multiply(this.coefficient.value()); + for (final String label : this.labels) { traverser.addLabel(label); } return traverser; @@ -55,6 +58,6 @@ public abstract class AbstractFunction<C, S, E> implements CFunction<C> { @Override public String toString() { - return "[" + this.coefficient + "]" + this.getClass().getSimpleName() + "@" + this.labels; + return StringFactory.makeFunctionString(this); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java index 2c5cc18..144b77f 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.machine.functions; +import org.apache.tinkerpop.machine.coefficients.Coefficient; + import java.util.Set; /** @@ -25,7 +27,7 @@ import java.util.Set; */ public interface CFunction<C> { - public C coefficient(); + public Coefficient<C> coefficient(); public Set<String> labels(); 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 42d77b7..544f674 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 @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.machine.functions.filter; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.FilterFunction; import org.apache.tinkerpop.machine.traversers.Traverser; @@ -29,12 +30,13 @@ import java.util.Set; */ public class IdentityFilter<C, S> extends AbstractFunction<C,S,S> implements FilterFunction<C, S> { - public IdentityFilter(final C coefficient, final Set<String> labels) { + public IdentityFilter(final Coefficient<C> coefficient, final Set<String> labels) { super(coefficient, labels); } @Override public boolean test(final Traverser<C, S> traverser) { + super.postProcess(traverser); return true; } } 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 69a64df..c0f2a98 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 @@ -18,9 +18,11 @@ */ package org.apache.tinkerpop.machine.functions.filter; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.FilterFunction; import org.apache.tinkerpop.machine.traversers.Traverser; +import org.apache.tinkerpop.util.StringFactory; import java.util.Set; @@ -31,18 +33,19 @@ public class IsFilter<C, S> extends AbstractFunction<C, S, S> implements FilterF private final S object; - public IsFilter(final C coefficient, final Set<String> labels, final S object) { + public IsFilter(final Coefficient<C> coefficient, final Set<String> labels, final S object) { super(coefficient, labels); this.object = object; } @Override public boolean test(final Traverser<C, S> traverser) { + super.postProcess(traverser); return traverser.object().equals(this.object); } @Override public String toString() { - return "[" + this.coefficient + "]" + this.getClass().getSimpleName() + ":" + this.object; + return StringFactory.makeFunctionString(this, 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 93f5d86..de93cc5 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 @@ -18,11 +18,12 @@ */ package org.apache.tinkerpop.machine.functions.initial; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.InitialFunction; import org.apache.tinkerpop.machine.traversers.Traverser; +import org.apache.tinkerpop.util.StringFactory; -import java.util.Arrays; import java.util.Iterator; import java.util.Set; import java.util.stream.Stream; @@ -34,18 +35,18 @@ public class InjectInitial<C, S> extends AbstractFunction<C, S, S> implements In private final S[] objects; - public InjectInitial(final C coefficient, final Set<String> labels, final S... objects) { + public InjectInitial(final Coefficient<C> coefficient, final Set<String> labels, final S... objects) { super(coefficient, labels); this.objects = objects; } @Override public Iterator<Traverser<C, S>> get() { - return Stream.of(this.objects).map(a -> new Traverser<>(this.coefficient, a)).iterator(); + return Stream.of(this.objects).map(object -> new Traverser<>(this.coefficient.clone(), object)).iterator(); } @Override public String toString() { - return "[" + this.coefficient + "]" + this.getClass().getSimpleName() + ":" + Arrays.toString(this.objects); + return StringFactory.makeFunctionString(this, 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 f0eb939..1e5964f 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 @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.machine.functions.map; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.MapFunction; import org.apache.tinkerpop.machine.traversers.Traverser; @@ -29,12 +30,12 @@ import java.util.Set; */ public class IncrMap<C> extends AbstractFunction<C, Long, Long> implements MapFunction<C, Long, Long> { - public IncrMap(final C coefficient, final Set<String> labels) { + public IncrMap(final Coefficient<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)); + return postProcess(traverser.split(traverser.object() + 1)); } } 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 7d8a7bc..f3681b6 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,12 +18,14 @@ */ package org.apache.tinkerpop.machine.functions.map; -import org.apache.tinkerpop.machine.processor.Processor; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.CFunction; import org.apache.tinkerpop.machine.functions.MapFunction; import org.apache.tinkerpop.machine.functions.NestedFunction; +import org.apache.tinkerpop.machine.processor.Processor; import org.apache.tinkerpop.machine.traversers.Traverser; +import org.apache.tinkerpop.util.StringFactory; import java.util.List; import java.util.Set; @@ -31,12 +33,12 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class MapMap<C, S, E> extends AbstractFunction<C,S,E> 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; - public MapMap(final C coefficient, final Set<String> labels, final List<CFunction<C>> mapFunctions) { + public MapMap(final Coefficient<C> coefficient, final Set<String> labels, final List<CFunction<C>> mapFunctions) { super(coefficient, labels); this.mapFunctions = mapFunctions; } @@ -45,7 +47,7 @@ public class MapMap<C, S, E> extends AbstractFunction<C,S,E> implements MapFunct public Traverser<C, E> apply(final Traverser<C, S> traverser) { this.processor.reset(); this.processor.addStart(traverser); - return traverser.split(this.coefficient, this.processor.nextTraverser().object()); + return super.postProcess(traverser.split(this.processor.next().object())); } public void setProcessor(final Processor<C, S, E> processor) { @@ -58,6 +60,6 @@ public class MapMap<C, S, E> extends AbstractFunction<C,S,E> implements MapFunct @Override public String toString() { - return super.toString() + this.processor; + return StringFactory.makeFunctionString(this, this.mapFunctions.toArray()); } } 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 a8ee4e7..051d647 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 @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.machine.functions.map; +import org.apache.tinkerpop.machine.coefficients.Coefficient; import org.apache.tinkerpop.machine.functions.AbstractFunction; import org.apache.tinkerpop.machine.functions.MapFunction; import org.apache.tinkerpop.machine.traversers.Path; @@ -30,12 +31,12 @@ import java.util.Set; */ public class PathMap<C, S> extends AbstractFunction<C, S, Path> implements MapFunction<C, S, Path> { - public PathMap(final C coefficient, final Set<String> labels) { + public PathMap(final Coefficient<C> coefficient, final Set<String> labels) { super(coefficient, labels); } @Override public Traverser<C, Path> apply(final Traverser<C, S> traverser) { - return traverser.split(this.coefficient, traverser.path()); + return super.postProcess(traverser.split(traverser.path())); } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java index e22ab3e..9b89efd 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java @@ -19,7 +19,7 @@ package org.apache.tinkerpop.machine.processor; import org.apache.tinkerpop.machine.traversers.Traverser; -import org.apache.tinkerpop.machine.util.FastNoSuchElementException; +import org.apache.tinkerpop.util.FastNoSuchElementException; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -37,12 +37,12 @@ public class EmptyProcessor<C, S, E> implements Processor<C, S, E> { } @Override - public Traverser<C, E> nextTraverser() { + public Traverser<C, E> next() { throw FastNoSuchElementException.instance(); } @Override - public boolean hasNextTraverser() { + public boolean hasNext() { return false; } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java index 09fe2b7..a65c9da 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java @@ -20,16 +20,18 @@ package org.apache.tinkerpop.machine.processor; import org.apache.tinkerpop.machine.traversers.Traverser; +import java.util.Iterator; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface Processor<C, S, E> { +public interface Processor<C, S, E> extends Iterator<Traverser<C, E>> { public void addStart(final Traverser<C, S> traverser); - public Traverser<C, E> nextTraverser(); + public Traverser<C, E> next(); - public boolean hasNextTraverser(); + public boolean hasNext(); public void reset(); } 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 f7a94e3..4d2e92a 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 @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.machine.traversers; +import org.apache.tinkerpop.machine.coefficients.Coefficient; + import java.util.Collections; import java.util.HashSet; @@ -26,16 +28,16 @@ import java.util.HashSet; */ public class Traverser<C, S> { - private final C coefficient; + private final Coefficient<C> coefficient; private final S object; private Path path = new Path(); - public Traverser(final C coefficient, final S object) { + public Traverser(final Coefficient<C> coefficient, final S object) { this.coefficient = coefficient; this.object = object; } - public C coefficient() { + public Coefficient<C> coefficient() { return this.coefficient; } @@ -51,8 +53,8 @@ public class Traverser<C, S> { this.path.addLabels(Collections.singleton(label)); } - public <B> Traverser<C, B> split(final C coefficient, final B object) { - final Traverser<C, B> traverser = new Traverser<>(coefficient, object); + public <B> Traverser<C, B> split(final B object) { + final Traverser<C, B> traverser = new Traverser<>(this.coefficient.clone(), object); traverser.path = new Path(this.path); traverser.path.add(new HashSet<>(), object); return traverser; diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java index 90241f9..a7c011b 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java +++ b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java @@ -19,7 +19,7 @@ package org.apache.tinkerpop.machine.traversers; -import org.apache.tinkerpop.machine.util.FastNoSuchElementException; +import org.apache.tinkerpop.util.FastNoSuchElementException; import java.util.AbstractSet; import java.util.Collections; @@ -61,12 +61,11 @@ public class TraverserSet<C, S> extends AbstractSet<Traverser<C, S>> implements } public long bulkSize() { - /*long bulk = 0L; - for (final Traverser<C,S> traverser : this.map.values()) { - bulk = bulk + traverser.bulk(); + long bulk = 0L; + for (final Traverser<C, S> traverser : this.map.values()) { + bulk = bulk + traverser.coefficient().count(); } - return bulk;*/ - return 1L; + return bulk; } @Override @@ -86,7 +85,7 @@ public class TraverserSet<C, S> extends AbstractSet<Traverser<C, S>> implements this.map.put(traverser, traverser); return true; } else { - //existing. + existing.coefficient().sum(traverser.coefficient().value()); return false; } } diff --git a/java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java b/java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java similarity index 97% rename from java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java rename to java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java index 88bcaa4..0903c93 100644 --- a/java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java +++ b/java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.util; +package org.apache.tinkerpop.util; import java.util.NoSuchElementException; diff --git a/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java b/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java new file mode 100644 index 0000000..9679e23 --- /dev/null +++ b/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java @@ -0,0 +1,68 @@ +/* + * 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.util; + +import org.apache.tinkerpop.machine.bytecode.Instruction; +import org.apache.tinkerpop.machine.functions.CFunction; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class StringFactory { + + private StringFactory() { + // do nothing + } + + public static String makeInstructionString(final Instruction<?> instruction) { + String name = instruction.op(); + if (!instruction.coefficient().isUnity()) + name = "|" + instruction.coefficient().value() + "|" + name; + if (instruction.args().length > 0) + name = name + "("; + for (final Object object : instruction.args()) { + name = name + object + ","; + } + if (instruction.args().length > 0) { + name = name.substring(0, name.length() - 1); + name = name + ")"; + } + if (!instruction.labels().isEmpty()) + name = name + "@" + instruction.labels(); + return name; + } + + public static String makeFunctionString(final CFunction<?> function, final Object... args) { + String name = function.getClass().getSimpleName(); + if (!function.coefficient().isUnity()) + name = "|" + function.coefficient().value() + "|" + name; + if (args.length > 0) + name = name + "("; + for (final Object object : args) { + name = name + object + ","; + } + if (args.length > 0) { + name = name.substring(0, name.length() - 1); + name = name + ")"; + } + if (!function.labels().isEmpty()) + name = name + "@" + function.labels(); + return name; + } +} 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 0b0c7ba..a82ac84 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 @@ -22,7 +22,7 @@ import org.apache.tinkerpop.language.Gremlin; 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.coefficients.LongCoefficient; import org.junit.jupiter.api.Test; /** @@ -33,7 +33,7 @@ public class TraversalTest { @Test public void shouldHaveBytecode() throws Exception { TraversalSource<Long> g = Gremlin.traversal(); - g = g.coefficients(LongCoefficients.instance()); + g = g.coefficient(LongCoefficient.create()); final Traversal<Long, Long, Long> traversal = g.inject(7L).is(7L).incr().as("a").is(8L).by(__.incr()); //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 51b819e..cc438f5 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,8 +19,8 @@ package org.apache.tinkerpop.machine.compiler; import org.apache.tinkerpop.language.Traversal; +import org.apache.tinkerpop.machine.coefficients.LongCoefficient; import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory; -import org.apache.tinkerpop.machine.bytecode.BytecodeUtil; import org.junit.jupiter.api.Test; /** @@ -30,7 +30,7 @@ public class BytecodeUtilTest { @Test public void shouldHaveBytecode() throws Exception { - final Traversal<Long, Long, Long> traversal = new Traversal<>(1L, EmptyProcessorFactory.instance()); + final Traversal<Long, Long, Long> traversal = new Traversal<>(LongCoefficient.create(), EmptyProcessorFactory.instance()); traversal.incr().is(2L); //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 2103b96..3136c38 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 @@ -21,7 +21,6 @@ package org.apache.tinkerpop.machine.pipes; import org.apache.tinkerpop.machine.functions.CFunction; import org.apache.tinkerpop.machine.traversers.Traverser; import org.apache.tinkerpop.machine.traversers.TraverserSet; -import org.apache.tinkerpop.machine.util.FastNoSuchElementException; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -37,7 +36,7 @@ public abstract class AbstractStep<C, S, E> implements Step<C, S, E> { this.function = function; } - public void addTraverser(final Traverser<C, S> traverser) { + public void addStart(final Traverser<C, S> traverser) { this.traverserSet.add(traverser); } @@ -52,10 +51,13 @@ public abstract class AbstractStep<C, S, E> implements Step<C, S, E> { protected Traverser<C, S> processNextTraverser() { if (!this.traverserSet.isEmpty()) return this.traverserSet.remove(); - else if (this.previousStep.hasNext()) - return this.previousStep.next(); else - throw FastNoSuchElementException.instance(); + return this.previousStep.next(); + } + + @Override + public void reset() { + this.traverserSet.clear(); } @Override diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java index a8963ac..c1dff07 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java @@ -19,7 +19,7 @@ package org.apache.tinkerpop.machine.pipes; import org.apache.tinkerpop.machine.traversers.Traverser; -import org.apache.tinkerpop.machine.util.FastNoSuchElementException; +import org.apache.tinkerpop.util.FastNoSuchElementException; /** * @author Marko A. Rodriguez (http://markorodriguez.com) diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java index 37bf186..31d3c3e 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.machine.pipes; import org.apache.tinkerpop.machine.functions.InitialFunction; import org.apache.tinkerpop.machine.traversers.Traverser; +import java.util.Collections; import java.util.Iterator; /** @@ -28,7 +29,7 @@ import java.util.Iterator; */ public class InitialStep<C, S> extends AbstractStep<C, S, S> { - private final Iterator<Traverser<C, S>> objects; + private Iterator<Traverser<C, S>> objects; public InitialStep(final InitialFunction<C, S> initialFunction) { super(EmptyStep.instance(), initialFunction); @@ -45,4 +46,10 @@ public class InitialStep<C, S> extends AbstractStep<C, S, S> { return this.objects.next(); } + @Override + public void reset() { + super.reset(); + this.objects = Collections.emptyIterator(); + } + } 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 c7a57eb..bc5028d 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,6 @@ */ package org.apache.tinkerpop.machine.pipes; -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; @@ -26,18 +25,18 @@ import org.apache.tinkerpop.machine.functions.FilterFunction; import org.apache.tinkerpop.machine.functions.InitialFunction; import org.apache.tinkerpop.machine.functions.MapFunction; import org.apache.tinkerpop.machine.functions.NestedFunction; +import org.apache.tinkerpop.machine.processor.Processor; import org.apache.tinkerpop.machine.traversers.Traverser; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Pipes<C, S, E> implements Iterator<E>, Processor<C, S, E> { +public class Pipes<C, S, E> implements Processor<C, S, E> { - private final List<AbstractStep<?, ?, ?>> steps = new ArrayList<>(); + private final List<Step<?, ?, ?>> steps = new ArrayList<>(); private Step<C, ?, E> endStep; private Step<C, S, ?> startStep = EmptyStep.instance(); @@ -70,42 +69,25 @@ public class Pipes<C, S, E> implements Iterator<E>, Processor<C, S, E> { } @Override - public boolean hasNext() { - return this.endStep.hasNext(); - } - - @Override - public E next() { - return this.endStep.next().object(); - } - - public List<E> toList() { - final List<E> list = new ArrayList<>(); - while (this.hasNext()) { - list.add(this.next()); - } - return list; - } - - @Override public void addStart(final Traverser<C, S> traverser) { - this.startStep.addTraverser(traverser); + this.startStep.addStart(traverser); } @Override - public Traverser<C, E> nextTraverser() { + public Traverser<C, E> next() { return this.endStep.next(); } @Override - public boolean hasNextTraverser() { + public boolean hasNext() { return this.endStep.hasNext(); } @Override public void reset() { - while (hasNext()) - next(); + for (final Step<?, ?, ?> step : this.steps) { + step.reset(); + } } @Override diff --git a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java index a24d037..ce801a5 100644 --- a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java +++ b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java @@ -27,7 +27,7 @@ import java.util.Iterator; */ public interface Step<C, S, E> extends Iterator<Traverser<C, E>> { - public void addTraverser(final Traverser<C, S> traverser); + public void addStart(final Traverser<C, S> traverser); - // public void reset(); + 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 e102e6c..38d0df1 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,10 +19,11 @@ 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.apache.tinkerpop.machine.coefficients.LongCoefficient; import org.junit.jupiter.api.Test; /** @@ -33,9 +34,11 @@ public class PipesTest { @Test public void shouldWork() { final TraversalSource<Long> g = Gremlin.<Long>traversal() - .coefficients(LongCoefficients.instance()) + .coefficient(LongCoefficient.create()) .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())); + final Traversal<Long, Long, Long> traversal = g.inject(7L, 10L, 12L).as("a").c(3L).map(__.incr()).identity().incr(); + System.out.println(TraversalUtil.getBytecode(traversal)); + System.out.println(traversal); + System.out.println(traversal.toList()); } }