You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/25 01:51:55 UTC

incubator-tinkerpop git commit: AbstractStep now is the gatekeeper for determing whether a traverser is propagated to the next step -- it is NOT if its bulk == 0 or its value == null. Added two test cases to CoreTraversalTest that verify this behavior.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 7b27da5ac -> 39cc7a6b3


AbstractStep now is the gatekeeper for determing whether a traverser is propagated to the next step -- it is NOT if its bulk == 0 or its value == null. Added two test cases to CoreTraversalTest that verify this behavior.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/39cc7a6b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/39cc7a6b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/39cc7a6b

Branch: refs/heads/master
Commit: 39cc7a6b31044a66ea15c113521caaf2ed63ae03
Parents: 7b27da5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 24 17:51:51 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 24 17:51:51 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../traversal/step/filter/FilterStep.java       |  3 +-
 .../process/traversal/step/map/MapStep.java     |  8 ++---
 .../traversal/step/util/AbstractStep.java       |  5 ++-
 .../process/traversal/CoreTraversalTest.java    | 33 +++++++++++++++++---
 5 files changed, 34 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/39cc7a6b/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index a8ba61b..b63f6c1 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* `AbstractStep` now guarantees that bulk-less and null-valued traversers are never propagated.
 * Added `dedup(string...)` which allows for the deduplication of a stream based on unique scope values.
 * Fixed multiple bugs in the Gephi Plugin related to refactoring of traversal side-effects.
 * Split `WhereStep` into `WherePredicateStep` and `WhereTraversalStep` to simplify internals.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/39cc7a6b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
index ab364d8..f5f0597 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
@@ -35,9 +35,8 @@ public abstract class FilterStep<S> extends AbstractStep<S, S> {
     protected Traverser<S> processNextStart() {
         while (true) {
             final Traverser.Admin<S> traverser = this.starts.next();
-            if (this.filter(traverser)) {
+            if (this.filter(traverser))
                 return traverser;
-            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/39cc7a6b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
index edf3501..a0890c1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
@@ -33,12 +33,8 @@ public abstract class MapStep<S, E> extends AbstractStep<S, E> {
 
     @Override
     protected Traverser<E> processNextStart() {
-        while (true) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            final E e = this.map(traverser);
-            if (null != e)
-                return traverser.split(e, this);
-        }
+        final Traverser.Admin<S> traverser = this.starts.next();
+        return traverser.split(this.map(traverser), this);
     }
 
     protected abstract E map(final Traverser.Admin<S> traverser);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/39cc7a6b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
index 4802e37..399c902 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -124,9 +124,8 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
         } else {
             while (true) {
                 final Traverser<E> traverser = this.processNextStart();
-                if (0 != traverser.bulk()) {
+                if (0 != traverser.bulk() && null != traverser.get())
                     return this.prepareTraversalForNextStep(traverser);
-                }
             }
         }
     }
@@ -139,7 +138,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
             try {
                 while (true) {
                     this.nextEnd = this.processNextStart();
-                    if (0 != this.nextEnd.bulk())
+                    if (0 != this.nextEnd.bulk() && null != this.nextEnd.get())
                         return true;
                     else
                         this.nextEnd = null;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/39cc7a6b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index 5fd4825..930030e 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -24,11 +24,18 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Transaction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
 
-import java.util.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
@@ -49,10 +56,26 @@ import static org.junit.Assert.*;
 public class CoreTraversalTest extends AbstractGremlinProcessTest {
 
     @Test
+    @LoadGraphWith
+    public void shouldNeverPropagateANoBulkTraverser() {
+        assertFalse(g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).hasNext());
+        assertEquals(0, g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).toList().size());
+        g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).sideEffect(t -> fail("this should not have happened")).iterate();
+    }
+
+    @Test
+    @LoadGraphWith
+    public void shouldNeverPropagateANullValuedTraverser() {
+        assertFalse(g.V().map(t -> null).hasNext());
+        assertEquals(0, g.V().map(t -> null).toList().size());
+        g.V().map(t -> null).sideEffect(t -> fail("this should not have happened")).iterate();
+    }
+
+    @Test
     @LoadGraphWith(MODERN)
     public void shouldLoadVerticesViaIds() {
         final List<Vertex> vertices = g.V().toList();
-        final List<Object> ids = vertices.stream().map(v->v.id()).collect(Collectors.toList());
+        final List<Object> ids = vertices.stream().map(Vertex::id).collect(Collectors.toList());
         final List<Vertex> verticesReloaded = g.V(ids.toArray()).toList();
         assertEquals(vertices.size(), verticesReloaded.size());
         assertEquals(new HashSet<>(vertices), new HashSet<>(verticesReloaded));
@@ -62,7 +85,7 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void shouldLoadEdgesViaIds() {
         final List<Edge> edges = g.E().toList();
-        final List<Object> ids = edges.stream().map(e->e.id()).collect(Collectors.toList());
+        final List<Object> ids = edges.stream().map(Edge::id).collect(Collectors.toList());
         final List<Edge> edgesReloaded = g.E(ids.toArray()).toList();
         assertEquals(edges.size(), edgesReloaded.size());
         assertEquals(new HashSet<>(edges), new HashSet<>(edgesReloaded));
@@ -153,7 +176,7 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void shouldHavePropertyForEachRemainingBehaviorEvenWithStrategyRewrite() {
-        final GraphTraversal<Vertex, Map<Object,Long>> traversal = g.V().out().groupCount();
+        final GraphTraversal<Vertex, Map<Object, Long>> traversal = g.V().out().groupCount();
         traversal.forEachRemaining(Map.class, map -> assertTrue(map instanceof Map));
     }