You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/07/15 23:31:06 UTC

[tinkerpop] 02/02: TINKERPOP-1921 Add HasNext() to .NET

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch TINKERPOP-1921
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 233eb2d6520a37e9b6a8d79111b7c56bdaec98a0
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Mon Jul 15 19:30:22 2019 -0400

    TINKERPOP-1921 Add HasNext() to .NET
---
 .../Process/Traversal/DefaultTraversal.cs          | 29 ++++++++++++++++++++--
 .../Gremlin.Net/Process/Traversal/ITraversal.cs    |  6 +++++
 .../Process/Traversal/TraversalTests.cs            | 18 ++++++++++++++
 3 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs
index 1ffda51..8f56352 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs
@@ -64,6 +64,9 @@ namespace Gremlin.Net.Process.Traversal
         private IEnumerator<Traverser> TraverserEnumerator
             => _traverserEnumerator ?? (_traverserEnumerator = GetTraverserEnumerator());
 
+        private bool _nextAvailable;
+        private bool _fetchedNext;
+
         /// <inheritdoc />
         public void Dispose()
         {
@@ -73,13 +76,27 @@ namespace Gremlin.Net.Process.Traversal
         /// <inheritdoc />
         public bool MoveNext()
         {
+            var more = MoveNextInternal();            
+            _fetchedNext = false;
+            return more;
+        }
+        
+        private bool MoveNextInternal()
+        {                   
+            if (_fetchedNext) return _nextAvailable;
+            
             var currentTraverser = TraverserEnumerator.Current;
             if (currentTraverser?.Bulk > 1)
             {
                 currentTraverser.Bulk--;
-                return true;
+                _nextAvailable = true;
             }
-            return TraverserEnumerator.MoveNext();
+            else
+            {
+                _nextAvailable = TraverserEnumerator.MoveNext();
+            }
+
+            return _nextAvailable;
         }
 
         /// <summary>
@@ -167,6 +184,14 @@ namespace Gremlin.Net.Process.Traversal
                 await strategy.ApplyAsync(this).ConfigureAwait(false);
         }
 
+        /// <inheritdoc />
+        public bool HasNext()
+        {
+            var more = MoveNextInternal();            
+            _fetchedNext = true;
+            return more;
+        }
+
         /// <summary>
         ///     Gets the next result from the traversal.
         /// </summary>
diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/ITraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/ITraversal.cs
index 498ef7f..48268c1 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/ITraversal.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/ITraversal.cs
@@ -68,6 +68,12 @@ namespace Gremlin.Net.Process.Traversal
         E Next();
 
         /// <summary>
+        ///     Determines if the traversal contains any additional results for iteration.
+        /// </summary>
+        /// <returns>True if there are more results and false otherwise.</returns>
+        bool HasNext();
+
+        /// <summary>
         ///     Gets the next n-number of results from the traversal.
         /// </summary>
         /// <param name="amount">The number of results to get.</param>
diff --git a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/TraversalTests.cs b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/TraversalTests.cs
index f32b567..a7d62ac 100644
--- a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/TraversalTests.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/TraversalTests.cs
@@ -42,6 +42,24 @@ namespace Gremlin.Net.UnitTest.Process.Traversal
             var actualObj = traversal.Next();
 
             Assert.Equal(traverserObj, actualObj);
+
+            Assert.Equal(null, traversal.Next());
+        }
+        [Theory]
+        [InlineData(1)]
+        [InlineData("test")]
+        public void ShouldCheckHasNext(object traverserObj)
+        {
+            var traversal = new TestTraversal(new List<object> {traverserObj});
+
+            Assert.Equal(true, traversal.HasNext());
+            Assert.Equal(true, traversal.HasNext());
+            
+            var actualObj = traversal.Next();
+            Assert.Equal(traverserObj, actualObj);
+            
+            Assert.Equal(false, traversal.HasNext());
+            Assert.Equal(false, traversal.HasNext());
         }
 
         [Theory]