You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by xi...@apache.org on 2023/01/03 20:00:30 UTC

[tinkerpop] branch 3.5-dev updated: [TINKERPOP-2849] fix for GraphTraversalSource.With (#1917)

This is an automated email from the ASF dual-hosted git repository.

xiazcy 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 2c63a41e22 [TINKERPOP-2849] fix for GraphTraversalSource.With (#1917)
2c63a41e22 is described below

commit 2c63a41e2279e00ece670d19108749eb3d890007
Author: Valentyn Kahamlyk <vk...@users.noreply.github.com>
AuthorDate: Tue Jan 3 12:00:25 2023 -0800

    [TINKERPOP-2849] fix for GraphTraversalSource.With (#1917)
    
    * fix for GraphTraversalSource.With
    * update changelog
    
    Co-authored-by: valentynk <va...@bitquilltech.com>
    Co-authored-by: Yang Xia <55...@users.noreply.github.com>
---
 CHANGELOG.asciidoc                             |  1 +
 gremlin-go/driver/graphTraversalSource.go      | 18 ++++++-
 gremlin-go/driver/graphTraversalSource_test.go | 69 ++++++++++++++++++++++++++
 3 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index aa6681bb9f..cfdbd55939 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -58,6 +58,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Removed the delay for reconnecting to a potentially unhealthy `Host` only marking it as unavailable after that initial retry fails.
 * Prevented fast `NoHostAvailableException` in favor of more direct exceptions when borrowing connections from the `ConnectionPool`.
 * Fixed an issue in Go and Python GLVs where modifying per request settings to override request_id's was not working correctly.
+* Fixed incorrect implementation for `GraphTraversalSource.With` in `gremlin-go`.
 
 ==== Bugs
 
diff --git a/gremlin-go/driver/graphTraversalSource.go b/gremlin-go/driver/graphTraversalSource.go
index 2cf4470fe1..fa762fdf2c 100644
--- a/gremlin-go/driver/graphTraversalSource.go
+++ b/gremlin-go/driver/graphTraversalSource.go
@@ -122,7 +122,23 @@ func (gts *GraphTraversalSource) WithoutStrategies(args ...TraversalStrategy) *G
 // With provides a configuration to a traversal in the form of a key value pair.
 func (gts *GraphTraversalSource) With(key interface{}, value interface{}) *GraphTraversalSource {
 	source := gts.clone()
-	source.bytecode.AddSource("with", key, value)
+
+	var optionsStrategy TraversalStrategy = nil
+	for _, v := range gts.bytecode.sourceInstructions {
+		if v.operator == "withStrategies" &&
+			v.arguments[0].(*traversalStrategy).name == decorationNamespace+"OptionsStrategy" {
+			optionsStrategy = v.arguments[0]
+			break
+		}
+	}
+
+	if optionsStrategy == nil {
+		optionsStrategy = OptionsStrategy(map[string]interface{}{key.(string): value})
+		return source.WithStrategies(optionsStrategy)
+	}
+
+	options := optionsStrategy.(*traversalStrategy)
+	options.configuration[key.(string)] = value
 	return source
 }
 
diff --git a/gremlin-go/driver/graphTraversalSource_test.go b/gremlin-go/driver/graphTraversalSource_test.go
new file mode 100644
index 0000000000..ce1ad9aac6
--- /dev/null
+++ b/gremlin-go/driver/graphTraversalSource_test.go
@@ -0,0 +1,69 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package gremlingo
+
+import (
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestGraphTraversalSource(t *testing.T) {
+
+	t.Run("GraphTraversalSource.With tests", func(t *testing.T) {
+		t.Run("Test for single param", func(t *testing.T) {
+			g := &GraphTraversalSource{graph: &Graph{}, bytecode: NewBytecode(nil), remoteConnection: nil}
+			traversal := g.With("foo", "bar")
+			assert.NotNil(t, traversal)
+			assert.Equal(t, 1, len(traversal.bytecode.sourceInstructions))
+			instruction := traversal.bytecode.sourceInstructions[0]
+			assert.Equal(t, "withStrategies", instruction.operator)
+			assert.Equal(t, "org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy",
+				instruction.arguments[0].(*traversalStrategy).name)
+			config := instruction.arguments[0].(*traversalStrategy).configuration
+			assert.Equal(t, map[string]interface{}{"foo": "bar"}, config)
+		})
+
+		t.Run("Test for multiple param", func(t *testing.T) {
+			g := &GraphTraversalSource{graph: &Graph{}, bytecode: NewBytecode(nil), remoteConnection: nil}
+			traversal := g.With("foo", "bar").With("foo2", "bar2")
+			assert.NotNil(t, traversal)
+			assert.Equal(t, 1, len(traversal.bytecode.sourceInstructions))
+			instruction := traversal.bytecode.sourceInstructions[0]
+			assert.Equal(t, "withStrategies", instruction.operator)
+			assert.Equal(t, "org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy",
+				instruction.arguments[0].(*traversalStrategy).name)
+			config := instruction.arguments[0].(*traversalStrategy).configuration
+			assert.Equal(t, map[string]interface{}{"foo": "bar", "foo2": "bar2"}, config)
+		})
+
+		t.Run("Test for param replacement", func(t *testing.T) {
+			g := &GraphTraversalSource{graph: &Graph{}, bytecode: NewBytecode(nil), remoteConnection: nil}
+			traversal := g.With("foo", "bar").With("foo", "not bar")
+			assert.NotNil(t, traversal)
+			assert.Equal(t, 1, len(traversal.bytecode.sourceInstructions))
+			instruction := traversal.bytecode.sourceInstructions[0]
+			assert.Equal(t, "withStrategies", instruction.operator)
+			assert.Equal(t, "org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy",
+				instruction.arguments[0].(*traversalStrategy).name)
+			config := instruction.arguments[0].(*traversalStrategy).configuration
+			assert.Equal(t, map[string]interface{}{"foo": "not bar"}, config)
+		})
+	})
+}