Skip to content

Commit 4393a5a

Browse files
committed
fix various gremlinlang and serializer bugs in go for http
1 parent a2395a5 commit 4393a5a

28 files changed

Lines changed: 410 additions & 1615 deletions

gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -699,23 +699,13 @@ public static Collection<Object[]> data() {
699699
{"g.withStrategies(ReservedKeysVerificationStrategy(throwException: true, keys: [\"age\"])).addV(\"person\").property(\"age\", 29).property(\"name\", \"marko\")",
700700
"g.withStrategies(ReservedKeysVerificationStrategy(throwException:true, keys:[\"age\"])).addV(\"person\").property(\"age\", 29).property(\"name\", \"marko\")",
701701
"g.withStrategies(ReservedKeysVerificationStrategy(throwException:boolean0, keys:list0)).addV(string0).property(string1, number0).property(string2, string3)",
702-
"g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true, keys: new List<object> { \"age\" })).AddV(\"person\").Property(\"age\", 29).Property(\"name\", \"marko\")",
702+
"g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true, keys: new List<object> { \"age\" })).AddV((string) \"person\").Property(\"age\", 29).Property(\"name\", \"marko\")",
703703
"g.WithStrategies(gremlingo.ReservedKeysVerificationStrategy(gremlingo.ReservedKeysVerificationStrategyConfig{ThrowException: true, Keys: []string{\"age\"}})).AddV(\"person\").Property(\"age\", 29).Property(\"name\", \"marko\")",
704704
"g.withStrategies(new ReservedKeysVerificationStrategy(throwException:true, keys:[\"age\"])).addV(\"person\").property(\"age\", 29).property(\"name\", \"marko\")",
705705
"g.withStrategies(ReservedKeysVerificationStrategy.build().throwException(true).keys(new ArrayList<Object>() {{ add(\"age\"); }}).create()).addV(\"person\").property(\"age\", 29).property(\"name\", \"marko\")",
706706
"g.withStrategies(new ReservedKeysVerificationStrategy({throwException: true, keys: [\"age\"]})).addV(\"person\").property(\"age\", 29).property(\"name\", \"marko\")",
707707
"g.with_strategies(ReservedKeysVerificationStrategy(throw_exception=True, keys=['age'])).add_v('person').property('age', 29).property('name', 'marko')"
708708
},
709-
{"g.withStrategies(OptionsStrategy(myVar: \"myValue\")).V()",
710-
"g.withStrategies(OptionsStrategy(myVar:\"myValue\")).V()",
711-
"g.withStrategies(OptionsStrategy(myVar:string0)).V()",
712-
"g.WithStrategies(new OptionsStrategy(myVar: \"myValue\")).V()",
713-
"g.WithStrategies(gremlingo.OptionsStrategy(map[string]interface{}{\"myVar\": \"myValue\"})).V()",
714-
"g.withStrategies(new OptionsStrategy(myVar:\"myValue\")).V()",
715-
"g.withStrategies(OptionsStrategy.build().myVar(\"myValue\").create()).V()",
716-
"g.withStrategies(new OptionsStrategy({myVar: \"myValue\"})).V()",
717-
"g.with_strategies(OptionsStrategy(my_var='myValue')).V()"
718-
},
719709
{"g.withoutStrategies(ReadOnlyStrategy, PathRetractionStrategy, FilterRankingStrategy)",
720710
null,
721711
null,

gremlin-go/driver/client.go

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package gremlingo
2121

2222
import (
2323
"crypto/tls"
24+
"reflect"
2425
"runtime"
2526
"time"
2627

@@ -134,7 +135,7 @@ func (client *Client) SubmitWithOptions(traversalString string, requestOptions R
134135
request := makeStringRequest(traversalString, client.traversalSource, requestOptions)
135136

136137
// TODO interceptors (ie. auth)
137-
138+
138139
rs, err := client.httpProtocol.send(&request)
139140
return rs, err
140141
}
@@ -156,13 +157,47 @@ func (client *Client) submitGremlinLang(gremlinLang *GremlinLang) (ResultSet, er
156157
client.logHandler.logf(Debug, submitStartedString, *gremlinLang)
157158
// TODO placeholder
158159
requestOptionsBuilder := new(RequestOptionsBuilder)
160+
if len(gremlinLang.GetParameters()) > 0 {
161+
requestOptionsBuilder.SetBindings(gremlinLang.GetParameters())
162+
}
163+
if len(gremlinLang.optionsStrategies) > 0 {
164+
requestOptionsBuilder = applyOptionsConfig(requestOptionsBuilder, gremlinLang.optionsStrategies[0].configuration)
165+
}
166+
159167
request := makeStringRequest(gremlinLang.GetGremlin(), client.traversalSource, requestOptionsBuilder.Create())
160168
return client.httpProtocol.send(&request)
161169
}
162170

163-
// submitBytecode submits Bytecode to the server to execute and returns a ResultSet.
164-
func (client *Client) submitBytecode(bytecode *Bytecode) (ResultSet, error) {
165-
client.logHandler.logf(Debug, submitStartedBytecode, *bytecode)
166-
request := makeBytecodeRequest(bytecode, client.traversalSource)
167-
return client.httpProtocol.send(&request)
171+
func applyOptionsConfig(builder *RequestOptionsBuilder, config map[string]interface{}) *RequestOptionsBuilder {
172+
builderValue := reflect.ValueOf(builder)
173+
174+
// Map configuration keys to setter method names
175+
setterMap := map[string]string{
176+
"requestId": "SetRequestId",
177+
"evaluationTimeout": "SetEvaluationTimeout",
178+
"batchSize": "SetBatchSize",
179+
"userAgent": "SetUserAgent",
180+
"bindings": "SetBindings",
181+
"materializeProperties": "SetMaterializeProperties",
182+
}
183+
184+
for key, value := range config {
185+
if methodName, exists := setterMap[key]; exists {
186+
method := builderValue.MethodByName(methodName)
187+
if method.IsValid() {
188+
args := []reflect.Value{reflect.ValueOf(value)}
189+
method.Call(args)
190+
}
191+
}
192+
}
193+
194+
return builder
168195
}
196+
197+
// submitBytecode submits Bytecode to the server to execute and returns a ResultSet.
198+
// TODO remove
199+
//func (client *Client) submitBytecode(bytecode *Bytecode) (ResultSet, error) {
200+
// client.logHandler.logf(Debug, submitStartedBytecode, *bytecode)
201+
// request := makeBytecodeRequest(bytecode, client.traversalSource)
202+
// return client.httpProtocol.send(&request)
203+
//}

gremlin-go/driver/client_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func TestClient(t *testing.T) {
6262
})
6363
assert.NoError(t, err)
6464
assert.NotNil(t, client)
65-
resultSet, err := client.Submit("2+2")
65+
resultSet, err := client.Submit("g.inject(2)")
6666
assert.NoError(t, err)
6767
assert.NotNil(t, resultSet)
6868

@@ -104,17 +104,17 @@ func TestClient(t *testing.T) {
104104
assert.NotNil(t, client)
105105
defer client.Close()
106106

107-
bindings := map[string]interface{}{"x": 2}
107+
bindings := map[string]interface{}{"x": 1}
108108

109-
resultSet, err := client.Submit("x + x", bindings)
109+
resultSet, err := client.Submit("g.V(x).values(\"name\")", bindings)
110110
assert.NoError(t, err)
111111
assert.NotNil(t, resultSet)
112112

113113
result, ok, err := resultSet.One()
114114
assert.NoError(t, err)
115115
assert.True(t, ok)
116116

117-
assert.Equal(t, int64(4), result.Data)
117+
assert.Equal(t, "marko", result.Data)
118118
})
119119

120120
t.Run("Test client.SubmitWithOptions() with bindings", func(t *testing.T) {
@@ -129,17 +129,17 @@ func TestClient(t *testing.T) {
129129
assert.NotNil(t, client)
130130
defer client.Close()
131131

132-
bindings := map[string]interface{}{"x": 2}
132+
bindings := map[string]interface{}{"x": 1}
133133

134-
resultSet, err := client.SubmitWithOptions("x + x", new(RequestOptionsBuilder).SetBindings(bindings).Create())
134+
resultSet, err := client.SubmitWithOptions("g.V(x).values(\"name\")", new(RequestOptionsBuilder).SetBindings(bindings).Create())
135135
assert.NoError(t, err)
136136
assert.NotNil(t, resultSet)
137137

138138
result, ok, err := resultSet.One()
139139
assert.NoError(t, err)
140140
assert.True(t, ok)
141141

142-
assert.Equal(t, int64(4), result.Data)
142+
assert.Equal(t, "marko", result.Data)
143143
})
144144

145145
t.Run("Test client.submit() with materializeProperties", func(t *testing.T) {

gremlin-go/driver/connection_test.go

Lines changed: 24 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ package gremlingo
2222
import (
2323
"crypto/tls"
2424
"fmt"
25-
"github.com/stretchr/testify/assert"
2625
"math/big"
2726
"os"
2827
"reflect"
2928
"sort"
3029
"strconv"
3130
"sync"
3231
"testing"
32+
33+
"github.com/stretchr/testify/assert"
3334
)
3435

3536
const personLabel = "Person"
@@ -663,142 +664,28 @@ func TestConnection(t *testing.T) {
663664
}
664665
})
665666

666-
t.Run("Test Client.Submit() Simple String Query with Bindings", func(t *testing.T) {
667-
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
668-
669-
client, err := NewClient(testNoAuthUrl,
670-
func(settings *ClientSettings) {
671-
settings.TlsConfig = testNoAuthTlsConfig
672-
settings.AuthInfo = testNoAuthAuthInfo
673-
})
674-
assert.Nil(t, err)
675-
assert.NotNil(t, client)
676-
defer client.Close()
677-
678-
resultSet, err := client.Submit("g.inject(x).math('_+_')", map[string]interface{}{"x": 2})
679-
assert.Nil(t, err)
680-
assert.NotNil(t, resultSet)
681-
result, ok, err := resultSet.One()
682-
assert.Nil(t, err)
683-
assert.True(t, ok)
684-
assert.NotNil(t, result)
685-
res, err := result.GetInt()
686-
assert.Nil(t, err)
687-
assert.Equal(t, 4, res)
688-
})
689-
690-
t.Run("Test Bindings To Server Configured with Modern Graph", func(t *testing.T) {
691-
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthWithAliasEnable)
692-
remote, err := NewDriverRemoteConnection(testNoAuthWithAliasUrl,
693-
func(settings *DriverRemoteConnectionSettings) {
694-
settings.TlsConfig = testNoAuthWithAliasTlsConfig
695-
settings.AuthInfo = testNoAuthWithAliasAuthInfo
696-
settings.TraversalSource = testServerModernGraphAlias
697-
})
698-
assert.Nil(t, err)
699-
assert.NotNil(t, remote)
700-
defer remote.Close()
701-
g := Traversal_().With(remote)
702-
703-
r, err := g.V((&Bindings{}).Of("x", 1)).Out("created").Map(&Lambda{Script: "it.get().value('name').length()", Language: ""}).Sum().ToList()
704-
assert.Nil(t, err)
705-
for _, res := range r {
706-
assert.Equal(t, int32(3), res.GetInterface())
707-
}
708-
r, err = g.V((&Bindings{}).Of("x", 4)).Out("created").Map(&Lambda{Script: "it.get().value('name').length()", Language: ""}).Sum().ToList()
709-
assert.Nil(t, err)
710-
for _, res := range r {
711-
assert.Equal(t, int32(9), res.GetInterface())
712-
}
713-
})
714-
715-
t.Run("Test DriverRemoteConnection Invalid GraphTraversal", func(t *testing.T) {
716-
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
717-
718-
// Initialize graph
719-
g := initializeGraph(t, testNoAuthUrl, testNoAuthAuthInfo, testNoAuthTlsConfig)
720-
721-
// Drop the graph.
722-
dropGraph(t, g)
723-
724-
// Add vertices and edges to graph.
725-
rs, err := g.AddV("person").Property("id", T__.Unfold().Property().AddV()).ToList()
726-
assert.Nil(t, rs)
727-
assert.True(t, isSameErrorCode(newError(err0502ResponseHandlerError), err))
728-
729-
rs, err = g.V().Count().ToList()
730-
assert.NotNil(t, rs)
731-
assert.Nil(t, err)
732-
733-
// Drop the graph.
734-
dropGraph(t, g)
735-
})
736-
737-
t.Run("Test per-request arguments", func(t *testing.T) {
738-
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
739-
740-
g := getTestGraph(t, testNoAuthUrl, testNoAuthAuthInfo, testNoAuthTlsConfig)
741-
defer g.remoteConnection.Close()
742-
743-
reqArgsTests := []struct {
744-
msg string
745-
traversal *GraphTraversal
746-
nilErr bool
747-
}{
748-
{
749-
"Traversal must time out (With)",
750-
g.
751-
With("evaluationTimeout", 10).
752-
Inject(1).
753-
SideEffect(&Lambda{"Thread.sleep(5000)", "gremlin-groovy"}),
754-
false,
755-
},
756-
{
757-
"Traversal must finish (With)",
758-
g.
759-
With("evaluationTimeout", 10000).
760-
Inject(1).
761-
SideEffect(&Lambda{"Thread.sleep(5000)", "gremlin-groovy"}),
762-
true,
763-
},
764-
{
765-
"evaluationTimeout is overridden and traversal must time out (With)",
766-
g.
767-
With("evaluationTimeout", 10000).With("evaluationTimeout", 10).
768-
Inject(1).
769-
SideEffect(&Lambda{"Thread.sleep(5000)", "gremlin-groovy"}),
770-
false,
771-
},
772-
{
773-
"Traversal must time out (OptionsStrategy)",
774-
g.
775-
WithStrategies(OptionsStrategy(map[string]interface{}{"evaluationTimeout": 10})).
776-
Inject(1).
777-
SideEffect(&Lambda{"Thread.sleep(5000)", "gremlin-groovy"}),
778-
false,
779-
},
780-
{
781-
"Traversal must finish (OptionsStrategy)",
782-
g.
783-
WithStrategies(OptionsStrategy(map[string]interface{}{"evaluationTimeout": 10000})).
784-
Inject(1).
785-
SideEffect(&Lambda{"Thread.sleep(5000)", "gremlin-groovy"}),
786-
true,
787-
},
788-
}
789-
790-
gotErrs := make([]<-chan error, len(reqArgsTests))
791-
792-
// Run tests in parallel.
793-
for i, tt := range reqArgsTests {
794-
gotErrs[i] = tt.traversal.Iterate()
795-
}
796-
797-
// Check error promises.
798-
for i, tt := range reqArgsTests {
799-
assert.Equal(t, <-gotErrs[i] == nil, tt.nilErr, tt.msg)
800-
}
801-
})
667+
// TODO enable after error response is deser properly
668+
//t.Run("Test DriverRemoteConnection Invalid GraphTraversal", func(t *testing.T) {
669+
// skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
670+
//
671+
// // Initialize graph
672+
// g := initializeGraph(t, testNoAuthUrl, testNoAuthAuthInfo, testNoAuthTlsConfig)
673+
//
674+
// // Drop the graph.
675+
// dropGraph(t, g)
676+
//
677+
// // Add vertices and edges to graph.
678+
// rs, err := g.AddV("person").Property("id", T__.Unfold().Property().AddV()).ToList()
679+
// assert.Nil(t, rs)
680+
// assert.True(t, isSameErrorCode(newError(err0502ResponseHandlerError), err))
681+
//
682+
// rs, err = g.V().Count().ToList()
683+
// assert.NotNil(t, rs)
684+
// assert.Nil(t, err)
685+
//
686+
// // Drop the graph.
687+
// dropGraph(t, g)
688+
//})
802689

803690
t.Run("Get all properties when materializeProperties is all", func(t *testing.T) {
804691
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)

gremlin-go/driver/cucumber/cucumberSteps_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -951,11 +951,8 @@ func InitializeScenario(ctx *godog.ScenarioContext) {
951951
ctx.Step(`^the result should have a count of (\d+)$`, tg.theResultShouldHaveACountOf)
952952
ctx.Step(`^the traversal of$`, tg.theTraversalOf)
953953
ctx.Step(`^using the parameter (.+) defined as "(.+)"$`, tg.usingTheParameterDefined)
954-
<<<<<<< HEAD
955-
=======
956954
ctx.Step(`^using the parameter (.+) of P\.(.+)\("(.+)"\)$`, tg.usingTheParameterOfP)
957955
ctx.Step(`^using the side effect (.+) defined as"(.+)"$`, tg.usingTheSideEffectDefined)
958-
>>>>>>> 3.8-dev
959956
ctx.Step(`^the traversal will raise an error$`, tg.theTraversalWillRaiseAnError)
960957
ctx.Step(`^the traversal will raise an error with message (\w+) text of "(.+)"$`, tg.theTraversalWillRaiseAnErrorWithMessageContainingTextOf)
961958
}

0 commit comments

Comments
 (0)