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 <[email protected]> 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]
