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() {

Reply via email to