This is an automated email from the ASF dual-hosted git repository. okram pushed a commit to branch tp4 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/tp4 by this push: new 7595d5f more test case. added flatMap() step. working through numerous nestings to try and expose why a repeat(union()) nest is not working for Pipes and RxJava. Other more complex nestings work fine. Still searching. 7595d5f is described below commit 7595d5ff311154bfec22716ad2b4600bb660e7a9 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Thu Apr 4 08:23:51 2019 -0600 more test case. added flatMap() step. working through numerous nestings to try and expose why a repeat(union()) nest is not working for Pipes and RxJava. Other more complex nestings work fine. Still searching. --- .../tinkerpop/language/gremlin/Traversal.java | 2 + .../language/gremlin/common/CommonTraversal.java | 5 +++ .../tinkerpop/language/gremlin/common/__.java | 18 +++++++- .../language/gremlin/core/CoreTraversal.java | 6 +++ .../machine/bytecode/compiler/Argument.java | 3 ++ .../bytecode/compiler/BytecodeArgument.java | 8 ++++ .../machine/bytecode/compiler/Compilation.java | 2 + .../bytecode/compiler/ConstantArgument.java | 8 ++++ .../machine/bytecode/compiler/MethodArgument.java | 7 ++++ .../machine/function/flatmap/FlatMapFlatMap.java | 10 ++--- .../apache/tinkerpop/machine/SimpleTestSuite.java | 48 +++++++++++++++------- 11 files changed, 96 insertions(+), 21 deletions(-) diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java index f917ee1..98b5d9a 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java @@ -61,6 +61,8 @@ public interface Traversal<C, S, E> extends Iterator<E> { public Traversal<C, S, E> filter(final Traversal<C, E, ?> filterTraversal); + public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal); + public Traversal<C, S, TMap<E, Long>> groupCount(); public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final P<K> predicate); diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java index 0d7ff05..7d44169 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java @@ -129,6 +129,11 @@ public class CommonTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override + public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal) { + return this.addInstruction(Symbols.FLATMAP, TraversalUtil.getBytecode(flatMapTraversal)); + } + + @Override public Traversal<C, S, TMap<E, Long>> groupCount() { return this.addInstruction(Symbols.GROUP_COUNT); } diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java index f678025..0bd98df 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java @@ -38,10 +38,22 @@ public class __ { return __.<C, S>start().c(coefficient); } + public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal, final Traversal<C, S, E> falseTraversal) { + return __.<C, S>start().choose(predicate, trueTraversal, falseTraversal); + } + + public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal) { + return __.<C, S>start().choose(predicate, trueTraversal); + } + public static <C, S> Traversal<C, ?, S> constant(final S constant) { return __.<C, S>start().constant(constant); } + public static <C, S, E> Traversal<C, S, E> flatMap(final Traversal<C, S, E> traversal) { + return __.<C, S>start().flatMap(traversal); + } + public static <C, S> Traversal<C, S, S> identity() { return __.<C, S>start().identity(); } @@ -66,6 +78,10 @@ public class __ { return __.<C, S>start().loops(); } + public static <C, S, E> Traversal<C, S, E> map(final Traversal<C, S, E> traversal) { + return __.<C, S>start().map(traversal); + } + public static <C, S extends Number> Traversal<C, S, S> sum() { return __.<C, S>start().sum(); } @@ -74,7 +90,7 @@ public class __ { return __.<C, S>start().count(); } - public static <C, S, R> Traversal<C, S, R> union(final Traversal<C, S, R>... traversals) { + public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) { return __.<C, S>start().union(traversals); } } diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java index b1a46e9..fdd6762 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java @@ -25,6 +25,7 @@ import org.apache.tinkerpop.language.gremlin.TraversalUtil; import org.apache.tinkerpop.language.gremlin.common.__; import org.apache.tinkerpop.machine.Machine; import org.apache.tinkerpop.machine.bytecode.Bytecode; +import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler; import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols; import org.apache.tinkerpop.machine.bytecode.compiler.Oper; import org.apache.tinkerpop.machine.bytecode.compiler.Order; @@ -134,6 +135,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override + public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal) { + return this.addInstruction(CommonCompiler.Symbols.FLATMAP, TraversalUtil.getBytecode(flatMapTraversal)); + } + + @Override public Traversal<C, S, TMap<E, Long>> groupCount() { return this.addInstruction(Symbols.GROUP_COUNT); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java index f55edc0..85f87c6 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java @@ -23,6 +23,7 @@ import org.apache.tinkerpop.machine.traverser.Traverser; import java.io.Serializable; import java.util.Arrays; +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -31,6 +32,8 @@ public interface Argument<E> extends Serializable, Cloneable { public <C, S> E mapArg(final Traverser<C, S> traverser); + public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser); + public <C, S> boolean filterArg(final Traverser<C, S> traverser); public static <C, S, E> Argument<E> create(final Object... args) { diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeArgument.java index eb2dbaf..f2718a9 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeArgument.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeArgument.java @@ -20,6 +20,9 @@ package org.apache.tinkerpop.machine.bytecode.compiler; import org.apache.tinkerpop.machine.bytecode.Bytecode; import org.apache.tinkerpop.machine.traverser.Traverser; +import org.apache.tinkerpop.machine.util.IteratorUtils; + +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -38,6 +41,11 @@ public class BytecodeArgument<E> implements Argument<E> { } @Override + public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) { + return IteratorUtils.map((Iterator<Traverser<C, E>>) this.compilation.flatMapTraverser(traverser), Traverser::object); + } + + @Override public <C, S> boolean filterArg(final Traverser<C, S> traverser) { return this.compilation.filterTraverser(traverser); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java index 0571a03..6745a68 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java @@ -92,6 +92,8 @@ public final class Compilation<C, S, E> implements Serializable, Cloneable { public Traverser<C, E> mapTraverser(final Traverser<C, S> traverser) { this.prepareProcessor(); this.processor.addStart(this.prepareTraverser(traverser)); + if (!this.processor.hasNext()) + throw new RuntimeException("The nested traversal is not a map function: " + this); return this.processor.next(); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/ConstantArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/ConstantArgument.java index 967d4f1..1b8512d 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/ConstantArgument.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/ConstantArgument.java @@ -19,6 +19,9 @@ package org.apache.tinkerpop.machine.bytecode.compiler; import org.apache.tinkerpop.machine.traverser.Traverser; +import org.apache.tinkerpop.machine.util.IteratorUtils; + +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -37,6 +40,11 @@ public class ConstantArgument<E> implements Argument<E> { } @Override + public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) { + return IteratorUtils.of(this.constant); + } + + @Override public <C, S> boolean filterArg(final Traverser<C, S> traverser) { return (Boolean) this.constant; } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java index eb985d0..f399f2e 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java @@ -20,9 +20,11 @@ package org.apache.tinkerpop.machine.bytecode.compiler; import org.apache.tinkerpop.machine.structure.data.TElement; import org.apache.tinkerpop.machine.traverser.Traverser; +import org.apache.tinkerpop.machine.util.IteratorUtils; import org.apache.tinkerpop.machine.util.NumberHelper; import java.util.Arrays; +import java.util.Iterator; import java.util.Map; /** @@ -60,6 +62,11 @@ public class MethodArgument<E> implements Argument<E> { } @Override + public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) { + return IteratorUtils.of(this.mapArg(traverser)); + } + + @Override public <C, S> boolean filterArg(final Traverser<C, S> traverser) { return false; } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java index 4851bb9..bde11eb 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/FlatMapFlatMap.java @@ -25,11 +25,9 @@ import org.apache.tinkerpop.machine.function.AbstractFunction; import org.apache.tinkerpop.machine.function.FlatMapFunction; import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.ArrayIterator; -import org.apache.tinkerpop.machine.util.IteratorUtils; import java.lang.reflect.Array; import java.util.Iterator; -import java.util.Map; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -45,8 +43,8 @@ public final class FlatMapFlatMap<C, S, E> extends AbstractFunction<C> implement @Override public Iterator<E> apply(final Traverser<C, S> traverser) { - final E object = this.argument.mapArg(traverser); - if (object instanceof Iterator) + return this.argument.flatMapArg(traverser); + /*if (object instanceof Iterator) return (Iterator<E>) object; else if (object instanceof Iterable) return ((Iterable<E>) object).iterator(); @@ -55,10 +53,10 @@ public final class FlatMapFlatMap<C, S, E> extends AbstractFunction<C> implement else if (object.getClass().isArray()) return handleArrays(object); else - return IteratorUtils.of(object); + return IteratorUtils.of(object);*/ } - private final Iterator<E> handleArrays(final Object array) { + private Iterator<E> handleArrays(final Object array) { if (array instanceof Object[]) { return new ArrayIterator<>((E[]) array); } else { diff --git a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java index 49bb764..4b88855 100644 --- a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java +++ b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java @@ -18,7 +18,6 @@ */ package org.apache.tinkerpop.machine; -import org.apache.tinkerpop.language.gremlin.P; import org.apache.tinkerpop.language.gremlin.common.__; import org.apache.tinkerpop.machine.bytecode.Bytecode; import org.apache.tinkerpop.machine.bytecode.compiler.Order; @@ -26,6 +25,9 @@ import org.junit.jupiter.api.Test; import java.util.List; +import static org.apache.tinkerpop.language.gremlin.P.gt; +import static org.apache.tinkerpop.language.gremlin.P.lt; +import static org.apache.tinkerpop.language.gremlin.common.__.choose; import static org.apache.tinkerpop.language.gremlin.common.__.incr; import static org.apache.tinkerpop.language.gremlin.common.__.is; import static org.apache.tinkerpop.language.gremlin.common.__.union; @@ -56,7 +58,7 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { @Test void g_injectX1_2_3X_isXgtX1XX_incr() { verify(List.of(3L, 4L), - g.inject(1L, 2L, 3L).is(P.gt(1)).incr()); + g.inject(1L, 2L, 3L).is(gt(1)).incr()); } // NESTED TESTING @@ -70,13 +72,13 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { @Test void g_injectX1_2_3X_chooseXisXgtX1XX__incrX() { verify(List.of(3L, 4L), - g.inject(1L, 2L, 3L).choose(is(P.gt(1L)), incr())); + g.inject(1L, 2L, 3L).choose(is(gt(1L)), incr())); } @Test void g_injectX1_2_3X_chooseXisXgtX1XX__incr__incr_incrX() { verify(List.of(3L, 3L, 4L), - g.inject(1L, 2L, 3L).choose(is(P.gt(1L)), incr(), __.<Long>incr().incr())); + g.inject(1L, 2L, 3L).choose(is(gt(1L)), incr(), __.<Long>incr().incr())); } @Test @@ -149,12 +151,6 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { // REPEAT TIMES TESTING - // @Test TODO: I mean its right..but. - void g_injectX1_2_3X_repeatXincrX_timesX0X() { // r.t - verify(List.of(2L, 3L, 4L), - g.inject(1L, 2L, 3L).repeat(incr()).times(0)); - } - @Test void g_injectX1_2_3X_repeatXincrX_timesX1X() { // r.t verify(List.of(2L, 3L, 4L), @@ -174,6 +170,12 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { } @Test + void g_injectX1_2_3X_repeatXincr_incrX_timesX3X() { // r.t + verify(List.of(7L, 8L, 9L), + g.inject(1L, 2L, 3L).repeat(__.<Long>incr().incr()).times(3)); + } + + @Test void g_injectX1_2_3X_timesX0X_repeatXincrX() { // t.r verify(List.of(1L, 2L, 3L), g.inject(1L, 2L, 3L).times(0).repeat(incr())); @@ -199,6 +201,18 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { // NESTED REPEAT TESTING + @Test + void g_injectX1_2_3X_repeatXincr_mapXchooseXisXgtX5XX__incr__incr_incrXXX_timesX3X() { + verify(List.of(9L, 9L, 10L), + g.inject(1L, 2L, 3L).repeat(__.<Long>incr().map(choose(is(gt(5L)), incr(), __.<Long>incr().incr()))).times(3)); + } + + @Test + void g_injectX1_2_3X_repeatXincr_flatMapXchooseXisXltX8XX__incrXXX_timesX3X() { + verify(List.of(7L, 8L), + g.inject(1L, 2L, 3L).repeat(__.<Long>incr().flatMap(choose(is(lt(8L)), incr()))).times(3)); + } + //@Test void g_injectX1X_repeatXunionXincr__incr_incrXX_timesX1X() { verify(List.of(2L, 3L), @@ -216,11 +230,17 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> { verify(List.of(4L, 5L, 5L, 6L, 5L, 6L, 6L, 7L), g.inject(1L).repeat(union(incr(), __.<Long>incr().incr())).times(3)); } - // 1 - // 1 2 - // 2 3 3 4 - // 3 4 4 5 4 5 5 6 + // UNFOLD TESTING + + @Test + void g_injectXlistX1_2_3XX_unfold_incr() { + verifyOrder(List.of(2L, 3L, 4L), + g.inject(List.of(1L, 2L, 3L)).unfold().incr()); + } + + + // ORDER TESTING @Test void g_injectX7_3_5_20_1_2_5X_incr_order_byXdescX() {