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();
+        }
     }
 }