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.