From 1ffcbfbf62cc382883b35934f8fbf751455b0fb7 Mon Sep 17 00:00:00 2001 From: "Marko A. Rodriguez" Date: Tue, 1 Nov 2016 12:15:04 -0600 Subject: [PATCH 1/3] UnfoldStep now handles array unfolding. --- CHANGELOG.asciidoc | 1 + .../traversal/step/map/UnfoldStep.java | 3 +++ .../traversal/step/map/UnfoldStepTest.java | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 344cb510df6..75ec06569de 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.3.0 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* `UnfoldStep` now supports unfolding of arrays. (*breaking*) * Removed all performance tests that were not part of `gremlin-benchmark`. * Removed dependency on `junit-benchmarks` and it's related reference to `h2`. * Moved the source for the "home page" into the repository under `/site` so that it easier to accept contributions. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java index 382815e06f9..2fcc4906106 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java @@ -21,6 +21,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import java.util.Collections; @@ -46,6 +47,8 @@ else if (s instanceof Iterable) return ((Iterable) s).iterator(); else if (s instanceof Map) return ((Map) s).entrySet().iterator(); + else if (s.getClass().isArray()) + return new ArrayIterator((Object[])s); else return IteratorUtils.of((E) s); } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java index aa7cf3dabe8..46c9450a88e 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java @@ -21,10 +21,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest; +import org.junit.Test; import java.util.Collections; import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + /** * @author Daniel Kuppitz (http://gremlin.guru) */ @@ -34,4 +38,19 @@ public class UnfoldStepTest extends StepTest { protected List getTraversals() { return Collections.singletonList(__.unfold()); } + + @Test + public void shouldSupportArrayIteration() { + final Traversal t1 = __.inject(new String[]{"a", "b", "c"}).unfold(); + assertEquals("a", t1.next()); + assertEquals("b", t1.next()); + assertEquals("c", t1.next()); + assertFalse(t1.hasNext()); + // + final Traversal t2 = __.inject(new Object[]{"a", "b", 3}).unfold(); + assertEquals("a", t2.next()); + assertEquals("b", t2.next()); + assertEquals(3, t2.next()); + assertFalse(t2.hasNext()); + } } From b0b65582d0a0d644b15fc61da64c103288d36841 Mon Sep 17 00:00:00 2001 From: "Marko A. Rodriguez" Date: Tue, 1 Nov 2016 15:44:53 -0600 Subject: [PATCH 2/3] support for primitive array unfolding. Wow -- Java sucks. cc/ @twilmes. --- .../process/traversal/step/map/UnfoldStep.java | 15 ++++++++++++++- .../traversal/step/map/UnfoldStepTest.java | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java index 2fcc4906106..c96f4144375 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java @@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; +import java.lang.reflect.Array; import java.util.Collections; import java.util.Iterator; import java.util.Map; @@ -48,7 +49,7 @@ else if (s instanceof Iterable) else if (s instanceof Map) return ((Map) s).entrySet().iterator(); else if (s.getClass().isArray()) - return new ArrayIterator((Object[])s); + return handleArrays(s); else return IteratorUtils.of((E) s); } @@ -57,4 +58,16 @@ else if (s.getClass().isArray()) public Set getRequirements() { return Collections.singleton(TraverserRequirement.OBJECT); } + + private final Iterator handleArrays(Object obj) { + if (obj instanceof Object[]) { + return new ArrayIterator<>((E[]) obj); + } else { + int len = Array.getLength(obj); + final Object[] out = new Object[len]; + for (int i = 0; i < len; i++) + out[i] = Array.get(obj, i); + return new ArrayIterator<>((E[]) out); + } + } } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java index 46c9450a88e..6179c429b87 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStepTest.java @@ -52,5 +52,14 @@ public void shouldSupportArrayIteration() { assertEquals("b", t2.next()); assertEquals(3, t2.next()); assertFalse(t2.hasNext()); + // + final Traversal t3 = __.inject(new Object[]{0, 1, 2, new int[]{3, 4}}).unfold().unfold(); + assertEquals(0, t3.next()); + assertEquals(1, t3.next()); + assertEquals(2, t3.next()); + assertEquals(3, t3.next()); + assertEquals(4, t3.next()); + assertFalse(t3.hasNext()); + } } From 01085339877e1931f66cff3a2b358513e7c09c15 Mon Sep 17 00:00:00 2001 From: "Marko A. Rodriguez" Date: Tue, 1 Nov 2016 15:46:49 -0600 Subject: [PATCH 3/3] minor nothings -- final and better argument name. --- .../process/traversal/step/map/UnfoldStep.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java index c96f4144375..cb4164c5214 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java @@ -59,15 +59,15 @@ public Set getRequirements() { return Collections.singleton(TraverserRequirement.OBJECT); } - private final Iterator handleArrays(Object obj) { - if (obj instanceof Object[]) { - return new ArrayIterator<>((E[]) obj); + private final Iterator handleArrays(final Object array) { + if (array instanceof Object[]) { + return new ArrayIterator<>((E[]) array); } else { - int len = Array.getLength(obj); - final Object[] out = new Object[len]; + int len = Array.getLength(array); + final Object[] objectArray = new Object[len]; for (int i = 0; i < len; i++) - out[i] = Array.get(obj, i); - return new ArrayIterator<>((E[]) out); + objectArray[i] = Array.get(array, i); + return new ArrayIterator<>((E[]) objectArray); } } }