You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ly...@apache.org on 2022/05/19 20:14:14 UTC
[tinkerpop] branch 3.5-dev updated: refactor ResultSet.One() to handle nil result (#1653)
This is an automated email from the ASF dual-hosted git repository.
lyndonb pushed a commit to branch 3.5-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/3.5-dev by this push:
new f59c47cab9 refactor ResultSet.One() to handle nil result (#1653)
f59c47cab9 is described below
commit f59c47cab9d3e7e385bee2634ecbce92dec074f9
Author: Valentyn Kahamlyk <vk...@users.noreply.github.com>
AuthorDate: Thu May 19 13:14:10 2022 -0700
refactor ResultSet.One() to handle nil result (#1653)
---
gremlin-go/driver/client_test.go | 3 ++-
gremlin-go/driver/connection_test.go | 18 ++++++++++++------
gremlin-go/driver/resultSet.go | 14 ++++++++++----
gremlin-go/driver/resultSet_test.go | 12 ++++++++----
gremlin-go/driver/traversal.go | 3 ++-
5 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/gremlin-go/driver/client_test.go b/gremlin-go/driver/client_test.go
index 266a073461..472d081e8a 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 613cca8dab..39204eb76f 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 fe0e580635..3ff1c458e9 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 73df1a35be..df9752cac8 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 9222fa91c5..a1e5b9cc19 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.