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 <[email protected]>
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() {