diff --git a/gremlin-go/driver/client_test.go b/gremlin-go/driver/client_test.go index 266a0734618..472d081e8a5 100644 --- a/gremlin-go/driver/client_test.go +++ b/gremlin-go/driver/client_test.go @@ -44,8 +44,9 @@ func TestClient(t *testing.T) { resultSet, err := client.Submit("g.V().count()") assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) client.Close() }) diff --git a/gremlin-go/driver/connection_test.go b/gremlin-go/driver/connection_test.go index 38b59a94975..1c8df0a0ff0 100644 --- a/gremlin-go/driver/connection_test.go +++ b/gremlin-go/driver/connection_test.go @@ -382,8 +382,9 @@ func TestConnection(t *testing.T) { resultSet, err := connection.write(&request) assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) }) @@ -399,8 +400,9 @@ func TestConnection(t *testing.T) { resultSet, err := connection.write(&request) assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) }) @@ -595,8 +597,9 @@ func TestConnection(t *testing.T) { resultSet, err := client.Submit("g.V().count()") assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) g := cloneGraphTraversalSource(&Graph{}, newBytecode(nil), nil) @@ -604,8 +607,9 @@ func TestConnection(t *testing.T) { resultSet, err = client.submitBytecode(b) assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err = resultSet.One() + result, ok, err = resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) }) @@ -625,8 +629,9 @@ func TestConnection(t *testing.T) { resultSet, err := client.Submit("g.V().count()") assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) }) @@ -963,8 +968,9 @@ func TestConnection(t *testing.T) { resultSet, err := client.Submit("x + x", map[string]interface{}{"x": 2}) assert.Nil(t, err) assert.NotNil(t, resultSet) - result, err := resultSet.One() + result, ok, err := resultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.NotNil(t, result) res, err := result.GetInt() assert.Nil(t, err) diff --git a/gremlin-go/driver/resultSet.go b/gremlin-go/driver/resultSet.go index fe0e5806358..3ff1c458e90 100644 --- a/gremlin-go/driver/resultSet.go +++ b/gremlin-go/driver/resultSet.go @@ -37,7 +37,7 @@ type ResultSet interface { Close() Channel() chan *Result addResult(result *Result) - One() (*Result, error) + One() (*Result, bool, error) All() ([]*Result, error) GetError() error setError(error) @@ -149,11 +149,17 @@ func (channelResultSet *channelResultSet) Channel() chan *Result { } // One returns the next Result from the channelResultSet, blocking until one is available. -func (channelResultSet *channelResultSet) One() (*Result, error) { +// The value of ok is true if the value received was delivered by a successful send operation to the channel, +// or false if it is a zero value generated because the channel is closed and empty. +func (channelResultSet *channelResultSet) One() (*Result, bool, error) { if channelResultSet.err != nil { - return nil, channelResultSet.err + return nil, false, channelResultSet.err } - return <-channelResultSet.channel, channelResultSet.err + result, ok := <-channelResultSet.channel + if channelResultSet.err != nil { + return nil, false, channelResultSet.err + } + return result, ok, nil } // All returns all remaining results for the channelResultSet (results grabbed through One will not be present). diff --git a/gremlin-go/driver/resultSet_test.go b/gremlin-go/driver/resultSet_test.go index 73df1a35be3..df9752cac81 100644 --- a/gremlin-go/driver/resultSet_test.go +++ b/gremlin-go/driver/resultSet_test.go @@ -61,14 +61,16 @@ func TestChannelResultSet(t *testing.T) { AddResults(channelResultSet, 10) idx := 0 for i := 0; i < 10; i++ { - result, err := channelResultSet.One() + result, ok, err := channelResultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.Equal(t, result.GetString(), fmt.Sprintf("%v", idx)) idx++ } go closeAfterTime(500, channelResultSet) - res, err := channelResultSet.One() + res, ok, err := channelResultSet.One() assert.Nil(t, err) + assert.False(t, ok) assert.Nil(t, res) }) @@ -77,14 +79,16 @@ func TestChannelResultSet(t *testing.T) { go AddResultsPause(channelResultSet, 10, 500) idx := 0 for i := 0; i < 10; i++ { - result, err := channelResultSet.One() + result, ok, err := channelResultSet.One() assert.Nil(t, err) + assert.True(t, ok) assert.Equal(t, result.GetString(), fmt.Sprintf("%v", idx)) idx++ } go closeAfterTime(500, channelResultSet) - result, err := channelResultSet.One() + result, ok, err := channelResultSet.One() assert.Nil(t, err) + assert.False(t, ok) assert.Nil(t, result) }) diff --git a/gremlin-go/driver/traversal.go b/gremlin-go/driver/traversal.go index ff764b5d9e7..bba022de640 100644 --- a/gremlin-go/driver/traversal.go +++ b/gremlin-go/driver/traversal.go @@ -109,7 +109,8 @@ func (t *Traversal) Next() (*Result, error) { if results.IsEmpty() { return nil, newError(err0903NextNoResultsLeftError) } - return results.One() + result, _, err := results.One() + return result, err } // GetResultSet submits the traversal and returns the ResultSet.