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

spmallette pushed a commit to branch TINKERPOP-3179
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit a47b8217037cd7f6e6e73b11c15932fdfb21feb9
Author: Stephen Mallette <[email protected]>
AuthorDate: Wed Jun 17 09:46:15 2026 -0400

    TINKERPOP-3179 Add WithComputer() to GraphTraversalSource in gremlin-go
    
    Adds the WithComputer() source step to gremlin-go for OLAP configuration
    parity with the Java, Python, JavaScript, and .NET GLVs. It applies a
    VertexProgramStrategy to the traversal source, delegating to WithStrategies.
    
    Enables the @GraphComputerOnly Gherkin scenarios in the Go cucumber suite,
    which previously returned godog.ErrPending, and adds unit coverage for the
    emitted bytecode.
    
    Assisted-by: Claude Code:claude-opus-4-8
---
 CHANGELOG.asciidoc                               |  1 +
 gremlin-go/driver/cucumber/cucumberSteps_test.go |  5 +---
 gremlin-go/driver/graphTraversalSource.go        | 11 ++++++++
 gremlin-go/driver/graphTraversalSource_test.go   | 35 ++++++++++++++++++++++++
 4 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index e07f7b64a1..5a38fea86e 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 === TinkerPop 3.7.7 (Release Date: NOT OFFICIALLY RELEASED YET)
 
 * Added `NextN(n)` to `Traversal` in `gremlin-go` for batched result 
iteration, providing API parity with `next(n)` in the Java, Python, and .NET 
GLVs.
+* Added `WithComputer()` to `GraphTraversalSource` in `gremlin-go`, providing 
OLAP configuration parity with other language variants.
 * Fixed conjoin has incorrect null handling.
 * Expanded `gremlin-python` CI matrix to test against Python 3.9, 3.10, 3.11, 
3.12, and 3.13.
 * Add Node 26 support for `gremlin-javascript` and `gremlint`.
diff --git a/gremlin-go/driver/cucumber/cucumberSteps_test.go 
b/gremlin-go/driver/cucumber/cucumberSteps_test.go
index 3c75fd8d76..dc9a4ec42b 100644
--- a/gremlin-go/driver/cucumber/cucumberSteps_test.go
+++ b/gremlin-go/driver/cucumber/cucumberSteps_test.go
@@ -407,12 +407,9 @@ func (tg *tinkerPopGraph) chooseGraph(graphName string) 
error {
                }
        }
 
-       // TODO: Uncoment code here to use WithComputer once this is 
implemented.
-       // In this version strategies are not implemented (and therefore 
WithComputer also isn't implmented).
        for _, tag := range tg.scenario.Tags {
                if tag.Name == "@GraphComputerOnly" {
-                       return godog.ErrPending
-                       // tg.g.WithComputer()
+                       tg.g = tg.g.WithComputer()
                } else if tag.Name == "@AllowNullPropertyValues" {
                        // The GLV suite does not test against a graph that has 
null property values enabled, skipping via Pending Error
                        return godog.ErrPending
diff --git a/gremlin-go/driver/graphTraversalSource.go 
b/gremlin-go/driver/graphTraversalSource.go
index 68ea13ea5f..ee938753a0 100644
--- a/gremlin-go/driver/graphTraversalSource.go
+++ b/gremlin-go/driver/graphTraversalSource.go
@@ -142,6 +142,17 @@ func (gts *GraphTraversalSource) With(key interface{}, 
value interface{}) *Graph
        return source
 }
 
+// WithComputer adds a GraphComputer to be used to process the Traversal as an 
OLAP job. It applies a
+// VertexProgramStrategy to the traversal source configured with the supplied 
options. Calling it with no
+// configuration submits the Traversal for OLAP execution using the server's 
default GraphComputer.
+func (gts *GraphTraversalSource) WithComputer(config 
...VertexProgramStrategyConfig) *GraphTraversalSource {
+       var c VertexProgramStrategyConfig
+       if len(config) > 0 {
+               c = config[0]
+       }
+       return gts.WithStrategies(VertexProgramStrategy(c))
+}
+
 // WithRemote adds a remote to be used throughout the life of a spawned 
Traversal.
 func (gts *GraphTraversalSource) WithRemote(remoteConnection 
*DriverRemoteConnection) *GraphTraversalSource {
        gts.remoteConnection = remoteConnection
diff --git a/gremlin-go/driver/graphTraversalSource_test.go 
b/gremlin-go/driver/graphTraversalSource_test.go
index 5c957c06c4..e1d883db64 100644
--- a/gremlin-go/driver/graphTraversalSource_test.go
+++ b/gremlin-go/driver/graphTraversalSource_test.go
@@ -66,4 +66,39 @@ func TestGraphTraversalSource(t *testing.T) {
                        assert.Equal(t, map[string]interface{}{"foo": "not 
bar"}, config)
                })
        })
+
+       t.Run("GraphTraversalSource.WithComputer tests", func(t *testing.T) {
+               const vertexProgramStrategyName = 
"org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy"
+
+               t.Run("Test for no configuration", func(t *testing.T) {
+                       g := &GraphTraversalSource{graph: &Graph{}, bytecode: 
NewBytecode(nil), remoteConnection: nil}
+                       source := g.WithComputer()
+                       assert.NotNil(t, source)
+                       assert.Equal(t, 1, 
len(source.bytecode.sourceInstructions))
+                       instruction := source.bytecode.sourceInstructions[0]
+                       assert.Equal(t, "withStrategies", instruction.operator)
+                       strategy := 
instruction.arguments[0].(*traversalStrategy)
+                       assert.Equal(t, vertexProgramStrategyName, 
strategy.name)
+                       // An empty configuration causes the server to fall 
back to its default GraphComputer via instance().
+                       assert.Equal(t, map[string]interface{}{}, 
strategy.configuration)
+               })
+
+               t.Run("Test for configured computer", func(t *testing.T) {
+                       g := &GraphTraversalSource{graph: &Graph{}, bytecode: 
NewBytecode(nil), remoteConnection: nil}
+                       source := g.WithComputer(VertexProgramStrategyConfig{
+                               GraphComputer: 
"org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer",
+                               Workers:       4,
+                       })
+                       assert.NotNil(t, source)
+                       assert.Equal(t, 1, 
len(source.bytecode.sourceInstructions))
+                       instruction := source.bytecode.sourceInstructions[0]
+                       assert.Equal(t, "withStrategies", instruction.operator)
+                       strategy := 
instruction.arguments[0].(*traversalStrategy)
+                       assert.Equal(t, vertexProgramStrategyName, 
strategy.name)
+                       assert.Equal(t, map[string]interface{}{
+                               "graphComputer": 
"org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer",
+                               "workers":       4,
+                       }, strategy.configuration)
+               })
+       })
 }

Reply via email to