Repository: tinkerpop
Updated Branches:
  refs/heads/master 3fe139a7b -> 91e82c4ef


TINKERPOP-887 Convert FastNoSuchElementExceptions in to regular 
NoSuchElementExceptions when exiting a traversal for top level traversals.


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

Branch: refs/heads/master
Commit: fe7c422621c46564add54558efdd07d671e751fa
Parents: 1eac35b
Author: BrynCooke <brynco...@gmail.com>
Authored: Wed Nov 2 16:54:46 2016 +0000
Committer: BrynCooke <brynco...@gmail.com>
Committed: Wed Nov 2 16:54:46 2016 +0000

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../upgrade/release-3.2.x-incubating.asciidoc   | 12 +++++++
 .../traversal/util/DefaultTraversal.java        | 21 +++++++++---
 .../process/traversal/CoreTraversalTest.java    | 35 ++++++++++++++++++++
 .../PartitionStrategyProcessTest.java           |  3 +-
 5 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fe7c4226/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index cf8c007..246244e 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -33,6 +33,7 @@ TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET)
 * Added `Pick.none` and `Pick.any` to the serializers and importers.
 * Added a class loader to `TraversalStrategies.GlobalCache` which guarantees 
strategies are registered prior to `GlobalCache.getStrategies()`.
 * Fixed a severe bug where `GraphComputer` strategies are not being loaded 
until the second use of the traversal source.
+* Traversals now throw regular NoSuchElementException instead of 
FastNoSuchElementException.
 
 [[release-3-2-3]]
 TinkerPop 3.2.3 (Release Date: October 17, 2016)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fe7c4226/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc 
b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index 30daae1..1602600 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -29,6 +29,18 @@ TinkerPop 3.2.4
 
 Please see the 
link:https://github.com/apache/tinkerpop/blob/3.2.4/CHANGELOG.asciidoc#release-3-2-4[changelog]
 for a complete list of all the modifications that are part of this release.
 
+Upgrading for Users
+~~~~~~~~~~~~~~~~~~~
+
+FastNoSuchElementException converted to regular NoSuchElementException
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In gremlin 3.2.x a call to Traversal#next() that did not have a result would 
throw a FastNoSuchElementException.
+This has been changed to a regular NoSuchElementException that includes the 
stack trace. Code that explicitly catches
+FastNoSuchElementException should be converted to NoSuchElementException.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-1330[TINKERPOP-1330]
+
 Upgrading for Providers
 ~~~~~~~~~~~~~~~~~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fe7c4226/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
index 5bd01da..a1d21fb 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -40,6 +40,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Optional;
 import java.util.Set;
 
@@ -181,11 +182,21 @@ public class DefaultTraversal<S, E> implements 
Traversal.Admin<S, E> {
 
     @Override
     public E next() {
-        if (!this.locked) this.applyStrategies();
-        if (this.lastTraverser.bulk() == 0L)
-            this.lastTraverser = this.finalEndStep.next();
-        this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L);
-        return this.lastTraverser.get();
+        try {
+            if (!this.locked) this.applyStrategies();
+            if (this.lastTraverser.bulk() == 0L)
+                this.lastTraverser = this.finalEndStep.next();
+            this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L);
+            return this.lastTraverser.get();
+        }
+        catch(FastNoSuchElementException e) {
+            if(parent == EmptyStep.instance()) {
+                throw new NoSuchElementException();
+            }
+            else {
+                throw e;
+            }
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fe7c4226/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 bf3acf3..68f8217 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
@@ -23,7 +23,9 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement;
 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.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -35,6 +37,7 @@ import org.junit.Test;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.NoSuchElementException;
 import java.util.Random;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -272,4 +275,36 @@ public class CoreTraversalTest extends 
AbstractGremlinProcessTest {
         assertEquals(1, IteratorUtils.count(t));
         g.tx().rollback();
     }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void shouldNotThrowFastNoSuchElementException() {
+        //FastNoSuchElement exceptions don't have a stack trace.
+        //They should be converted to regular exceptions before returning to 
the the user.
+        try {
+            g.V().has("foo").next();
+        } catch (NoSuchElementException e) {
+            assertEquals(NoSuchElementException.class, e.getClass());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void shouldThrowFastNoSuchElementExceptionInNestedTraversals() {
+        //The nested traversal should throw a regular 
FastNoSuchElementException
+
+        GraphTraversal<Object, Object> nestedTraversal = __.has("name", "foo");
+        GraphTraversal<Vertex, Object> traversal = g.V().has("name", 
"marko").branch(nestedTraversal);
+
+        GraphTraversal.Admin<Object, Object> nestedTraversalAdmin = 
nestedTraversal.asAdmin();
+        nestedTraversalAdmin.reset();
+        
nestedTraversalAdmin.addStart(nestedTraversalAdmin.getTraverserGenerator().generate(g.V().has("name",
 "marko").next(), (Step)traversal.asAdmin().getStartStep(), 1l));
+
+        try {
+            nestedTraversal.next();
+        } catch (NoSuchElementException e) {
+            assertEquals(FastNoSuchElementException.class, e.getClass());
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fe7c4226/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
index af81542..d1928cd 100644
--- 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
+++ 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
@@ -393,8 +393,7 @@ public class PartitionStrategyProcessTest extends 
AbstractGremlinProcessTest {
             sourceA.E(e.id()).next();
             fail("Edge should not be in this partition");
         } catch (Exception ex) {
-            final Exception expected = FastNoSuchElementException.instance();
-            assertEquals(expected.getClass(), ex.getClass());
+            assertEquals(NoSuchElementException.class, ex.getClass());
         }
     }
 

Reply via email to