You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/07/17 20:46:49 UTC
incubator-tinkerpop git commit: made Path play well with "local" steps
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master f2f69b329 -> 96d35869c
made Path play well with "local" steps
TINKERPOP-767 #resolve
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/96d35869
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/96d35869
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/96d35869
Branch: refs/heads/master
Commit: 96d35869c11e8e178fe25434ad74dd836762b2e8
Parents: f2f69b3
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Fri Jul 17 20:40:49 2015 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Jul 17 20:40:49 2015 +0200
----------------------------------------------------------------------
.../gremlin/process/traversal/Path.java | 14 ++++--------
.../traversal/step/map/CountLocalStep.java | 8 ++-----
.../traversal/step/map/RangeLocalStep.java | 18 +++++++++------
.../traversal/step/map/TailLocalStep.java | 4 ++--
.../traversal/step/map/GroovyUnfoldTest.groovy | 9 +++++---
.../process/traversal/step/map/UnfoldTest.java | 24 +++++++++++++++-----
6 files changed, 44 insertions(+), 33 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
index f8fa67b..e8b967a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -21,12 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.javatuples.Pair;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@@ -37,7 +33,7 @@ import java.util.stream.Stream;
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface Path extends Cloneable {
+public interface Path extends Cloneable, Iterable<Object> {
/**
* Get the number of step in the path.
@@ -107,7 +103,7 @@ public interface Path extends Cloneable {
* @throws IllegalArgumentException if the path does not contain the label
*/
public default <A> A get(final Pop pop, final String label) throws IllegalArgumentException {
- if(Pop.all == pop) {
+ if (Pop.all == pop) {
if (this.hasLabel(label)) {
final Object object = this.get(label);
if (object instanceof List)
@@ -189,8 +185,8 @@ public interface Path extends Cloneable {
return true;
}
- public default void forEach(final Consumer<Object> consumer) {
- this.objects().forEach(consumer);
+ public default Iterator<Object> iterator() {
+ return this.objects().iterator();
}
public default void forEach(final BiConsumer<Object, Set<String>> consumer) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
index 87b699d..2ef1f82 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
@@ -18,14 +18,12 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-import org.apache.tinkerpop.gremlin.process.traversal.Path;
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.IteratorUtils;
-import java.util.Collection;
import java.util.Collections;
-import java.util.Map;
import java.util.Set;
/**
@@ -41,9 +39,7 @@ public final class CountLocalStep<S> extends MapStep<S, Long> {
@Override
protected Long map(final Traverser.Admin<S> traverser) {
final S item = traverser.get();
- return (item instanceof Collection) ? ((Collection) item).size()
- : (item instanceof Map) ? ((Map) item).size()
- : (item instanceof Path) ? ((Path) item).size() : 1L;
+ return (item instanceof Iterable) ? IteratorUtils.count((Iterable) item) : 1L;
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
index 773a48b..26e7264 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
@@ -68,13 +68,15 @@ public final class RangeLocalStep<S> extends MapStep<S, S> {
static <S> S applyRange(final S start, final long low, final long high) {
if (start instanceof Map) {
return (S) applyRangeMap((Map) start, low, high);
- } else if (start instanceof Collection) {
- return (S) applyRangeCollection((Collection) start, low, high);
+ } else if (start instanceof Iterable) {
+ return (S) applyRangeIterable((Iterable) start, low, high);
}
return start;
}
- /** Extracts specified range of elements from a Map. */
+ /**
+ * Extracts specified range of elements from a Map.
+ */
private static Map applyRangeMap(final Map map, final long low, final long high) {
final long capacity = (high != -1 ? high : map.size()) - low;
final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
@@ -91,8 +93,10 @@ public final class RangeLocalStep<S> extends MapStep<S, S> {
return result;
}
- /** Extracts specified range of elements from a Collection. */
- private static Object applyRangeCollection(final Collection collection, final long low, final long high) {
+ /**
+ * Extracts specified range of elements from a Collection.
+ */
+ private static Object applyRangeIterable(final Iterable<Object> iterable, final long low, final long high) {
// See if we only want a single item. It is also possible that we will allow more than one item, but that the
// incoming container is only capable of producing a single item. In that case, we will still emit a
// container. This allows the result type to be predictable based on the step arguments. It also allows us to
@@ -100,10 +104,10 @@ public final class RangeLocalStep<S> extends MapStep<S, S> {
boolean single = high != -1 ? (high - low == 1) : false;
final Collection resultCollection =
- single ? null : (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+ single ? null : (iterable instanceof Set) ? new LinkedHashSet() : new LinkedList();
Object result = single ? null : resultCollection;
long c = 0L;
- for (final Object item : collection) {
+ for (final Object item : iterable) {
if (c >= low) {
if (c < high || high == -1) {
if (single) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
index 43f6d9d..0cd0bed 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
@@ -23,8 +23,8 @@ 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.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
@@ -49,7 +49,7 @@ public final class TailLocalStep<S> extends MapStep<S, S> {
final S start = traverser.get();
final long high =
start instanceof Map ? ((Map) start).size() :
- start instanceof Collection ? ((Collection) start).size() :
+ start instanceof Iterable ? IteratorUtils.count((Iterable) start) :
this.limit;
final long low = high - this.limit;
final S result = RangeLocalStep.applyRange(start, low, high);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
index 409172f..220951c 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
import org.apache.tinkerpop.gremlin.structure.Edge
import org.apache.tinkerpop.gremlin.structure.Vertex
@@ -39,7 +39,10 @@ public abstract class GroovyUnfoldTest {
public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
TraversalScriptHelper.compute("g.V.valueMap.unfold.map { it.key }", g)
}
- }
-
+ @Override
+ Traversal<Vertex, String> get_g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold(Object v1Id, Object v6Id) {
+ TraversalScriptHelper.compute("g.V(v1Id).repeat(__.both.simplePath).until(hasId(v6Id)).path.by('name').unfold", g, "v1Id", v1Id, "v6Id", v6Id)
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/96d35869/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
index 537b27d..88eda53 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
@@ -22,19 +22,15 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import static org.junit.Assert.*;
/**
@@ -47,6 +43,8 @@ public abstract class UnfoldTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX();
+ public abstract Traversal<Vertex, String> get_g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold(final Object v1Id, final Object v6Id);
+
@Test
@LoadGraphWith(MODERN)
public void g_V_localXoutE_foldX_unfold() {
@@ -92,6 +90,15 @@ public abstract class UnfoldTest extends AbstractGremlinProcessTest {
assertFalse(traversal.hasNext());
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold(
+ convertToVertexId("marko"), convertToVertexId("peter"));
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "lop", "peter", "marko", "josh", "lop", "peter"), traversal);
+ }
+
public static class Traversals extends UnfoldTest {
@Override
@@ -103,5 +110,10 @@ public abstract class UnfoldTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
return g.V().valueMap().<Map.Entry<String, List>>unfold().map(m -> m.get().getKey());
}
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold(Object v1Id, Object v6Id) {
+ return g.V(v1Id).repeat(both().simplePath()).until(hasId(v6Id)).path().by("name").unfold();
+ }
}
}