This is an automated email from the ASF dual-hosted git repository.
kenhuuu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push:
new 6167becabb Fix up gremlin-go NextN merge CTR
6167becabb is described below
commit 6167becabb576c45e4398b179e07c2acc7baa418
Author: Ken Hu <[email protected]>
AuthorDate: Thu Jun 11 20:57:24 2026 -0700
Fix up gremlin-go NextN merge CTR
---
gremlin-go/driver/traversal.go | 28 --------
gremlin-go/driver/traversal_test.go | 127 ------------------------------------
2 files changed, 155 deletions(-)
diff --git a/gremlin-go/driver/traversal.go b/gremlin-go/driver/traversal.go
index 85ad547db7..a78f6ee9c2 100644
--- a/gremlin-go/driver/traversal.go
+++ b/gremlin-go/driver/traversal.go
@@ -217,34 +217,6 @@ func (t *Traversal) NextN(n int) ([]*Result, error) {
return results, t.results.GetError()
}
-// NextN returns up to n results from the traversal. If the traversal has
-// fewer than n results, only those results are returned. If n is non-positive,
-// an empty slice is returned.
-func (t *Traversal) NextN(n int) ([]*Result, error) {
- if n <= 0 {
- return []*Result{}, nil
- }
- results, err := t.GetResultSet()
- if err != nil {
- return nil, err
- }
- out := make([]*Result, 0, n)
- for i := 0; i < n; i++ {
- if results.IsEmpty() {
- break
- }
- result, ok, err := results.One()
- if err != nil {
- return out, err
- }
- if !ok {
- break
- }
- out = append(out, result)
- }
- return out, results.GetError()
-}
-
// GetResultSet submits the traversal and returns the ResultSet.
func (t *Traversal) GetResultSet() (ResultSet, error) {
if t.results == nil {
diff --git a/gremlin-go/driver/traversal_test.go
b/gremlin-go/driver/traversal_test.go
index 63bab4f615..83c264ec33 100644
--- a/gremlin-go/driver/traversal_test.go
+++ b/gremlin-go/driver/traversal_test.go
@@ -23,7 +23,6 @@ import (
"crypto/tls"
"reflect"
"strings"
- "sync"
"testing"
"github.com/stretchr/testify/assert"
@@ -471,132 +470,6 @@ func TestTraversalNextN(t *testing.T) {
})
}
-func TestTraversalNextN(t *testing.T) {
- // makeClosedResultSet builds a channelResultSet that is already closed
- // after the given results have been pushed onto the channel directly
- // (i.e. without going through addResult, so no bulk unrolling).
- makeClosedResultSet := func(results ...*Result) *channelResultSet {
- rs := newChannelResultSetCapacity("test",
&synchronizedMap{make(map[string]ResultSet), sync.Mutex{}},
len(results)+1).(*channelResultSet)
- for _, r := range results {
- rs.channel <- r
- }
- rs.channelMutex.Lock()
- rs.closed = true
- close(rs.channel)
- rs.channelMutex.Unlock()
- return rs
- }
-
- t.Run("returns exactly n when n is less than available", func(t
*testing.T) {
- rs := makeClosedResultSet(&Result{"a"}, &Result{"b"},
&Result{"c"}, &Result{"d"})
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(3)
- assert.Nil(t, err)
- assert.Equal(t, 3, len(got))
- assert.Equal(t, "a", got[0].Data)
- assert.Equal(t, "b", got[1].Data)
- assert.Equal(t, "c", got[2].Data)
- })
-
- t.Run("returns exactly n when n equals available", func(t *testing.T) {
- rs := makeClosedResultSet(&Result{"a"}, &Result{"b"})
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(2)
- assert.Nil(t, err)
- assert.Equal(t, 2, len(got))
- })
-
- t.Run("returns all available when n exceeds available", func(t
*testing.T) {
- rs := makeClosedResultSet(&Result{"a"}, &Result{"b"})
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(5)
- assert.Nil(t, err)
- assert.Equal(t, 2, len(got))
- assert.Equal(t, "a", got[0].Data)
- assert.Equal(t, "b", got[1].Data)
- })
-
- t.Run("returns empty slice when n is zero", func(t *testing.T) {
- rs := makeClosedResultSet(&Result{"a"})
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(0)
- assert.Nil(t, err)
- assert.NotNil(t, got)
- assert.Equal(t, 0, len(got))
- })
-
- t.Run("returns empty slice when n is negative", func(t *testing.T) {
- rs := makeClosedResultSet(&Result{"a"})
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(-3)
- assert.Nil(t, err)
- assert.NotNil(t, got)
- assert.Equal(t, 0, len(got))
- })
-
- t.Run("returns empty slice when traversal is exhausted", func(t
*testing.T) {
- rs := makeClosedResultSet()
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(3)
- assert.Nil(t, err)
- assert.Equal(t, 0, len(got))
- })
-
- t.Run("unrolls bulked Traverser across the batch", func(t *testing.T) {
- // addResult unrolls bulks when the incoming Result wraps a
slice of *Traverser.
- rs := newChannelResultSetCapacity("test-bulk",
&synchronizedMap{make(map[string]ResultSet), sync.Mutex{}},
8).(*channelResultSet)
- rs.addResult(&Result{[]interface{}{&Traverser{bulk: 3, value:
"x"}}})
- rs.channelMutex.Lock()
- rs.closed = true
- close(rs.channel)
- rs.channelMutex.Unlock()
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(2)
- assert.Nil(t, err)
- assert.Equal(t, 2, len(got))
- assert.Equal(t, "x", got[0].Data)
- assert.Equal(t, "x", got[1].Data)
- })
-
- t.Run("can be called repeatedly to drain in batches", func(t
*testing.T) {
- rs := makeClosedResultSet(&Result{1}, &Result{2}, &Result{3},
&Result{4}, &Result{5})
- trav := &Traversal{results: rs}
-
- first, err := trav.NextN(2)
- assert.Nil(t, err)
- assert.Equal(t, 2, len(first))
-
- second, err := trav.NextN(10)
- assert.Nil(t, err)
- assert.Equal(t, 3, len(second))
-
- third, err := trav.NextN(1)
- assert.Nil(t, err)
- assert.Equal(t, 0, len(third))
- })
-
- t.Run("propagates error from ResultSet", func(t *testing.T) {
- rs := newChannelResultSetCapacity("test-err",
&synchronizedMap{make(map[string]ResultSet), sync.Mutex{}},
1).(*channelResultSet)
- rs.setError(assert.AnError)
- rs.channelMutex.Lock()
- rs.closed = true
- close(rs.channel)
- rs.channelMutex.Unlock()
- trav := &Traversal{results: rs}
-
- got, err := trav.NextN(5)
- assert.Equal(t, assert.AnError, err)
- assert.Equal(t, 0, len(got))
- })
-}
-
func newWithOptionsConnection(t *testing.T) *GraphTraversalSource {
// No authentication integration test with graphs loaded and alias
configured server
testNoAuthWithAliasUrl := getEnvOrDefaultString("GREMLIN_SERVER_URL",
noAuthUrl)