Skip to content

Commit 206d29f

Browse files
Merge branch 'master' into master
2 parents 3dedf1f + 2a1d063 commit 206d29f

File tree

3 files changed

+127
-1
lines changed

3 files changed

+127
-1
lines changed

client_test.go

+90
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@ func TestMatchQuery(t *testing.T) {
6565
t.Error(err)
6666
}
6767

68+
checkQueryResults(t, res)
69+
}
70+
71+
func TestMatchROQuery(t *testing.T) {
72+
q := "MATCH (s)-[e]->(d) RETURN s,e,d"
73+
res, err := graph.ROQuery(q)
74+
if err != nil {
75+
t.Error(err)
76+
}
77+
78+
checkQueryResults(t, res)
79+
}
80+
81+
func checkQueryResults(t *testing.T, res *QueryResult) {
6882
assert.Equal(t, len(res.results), 1, "expecting 1 result record")
6983

7084
res.Next()
@@ -120,6 +134,12 @@ func TestCreateQuery(t *testing.T) {
120134
assert.Equal(t, w.Label, "WorkPlace", "Unexpected node label.")
121135
}
122136

137+
func TestCreateROQueryFailure(t *testing.T) {
138+
q := "CREATE (w:WorkPlace {name:'RedisLabs'})"
139+
_, err := graph.ROQuery(q)
140+
assert.NotNil(t, err, "error should not be nil")
141+
}
142+
123143
func TestErrorReporting(t *testing.T) {
124144
q := "RETURN toupper(5)"
125145
res, err := graph.Query(q)
@@ -399,3 +419,73 @@ func TestQueryStatistics(t *testing.T) {
399419
assert.Nil(t,err)
400420
assert.Equal(t, 1, res.RelationshipsDeleted(), "Expecting 1 relationships deleted")
401421
}
422+
423+
func TestUtils(t *testing.T) {
424+
res := RandomString(10)
425+
assert.Equal(t, len(res), 10)
426+
427+
res = ToString("test_string")
428+
assert.Equal(t, res, "\"test_string\"")
429+
430+
res = ToString(10)
431+
assert.Equal(t, res, "10")
432+
433+
res = ToString(1.2)
434+
assert.Equal(t, res, "1.2")
435+
436+
res = ToString(true)
437+
assert.Equal(t, res, "true")
438+
439+
var arr = []interface{}{1,2,3,"boom"}
440+
res = ToString(arr)
441+
assert.Equal(t, res, "[1,2,3,\"boom\"]")
442+
443+
jsonMap := make(map[string]interface{})
444+
jsonMap["object"] = map[string]interface{} {"foo": 1}
445+
res = ToString(jsonMap)
446+
assert.Equal(t, res, "{object: {foo: 1}}")
447+
}
448+
449+
func TestNodeMapDatatype(t *testing.T) {
450+
graph.Flush()
451+
err := graph.Delete()
452+
assert.Nil(t, err)
453+
454+
// Create 2 nodes connect via a single edge.
455+
japan := NodeNew("Country", "j",
456+
map[string]interface{}{
457+
"name": "Japan",
458+
"population": 126800000,
459+
"states": []string{"Kanto", "Chugoku"},
460+
})
461+
john := NodeNew("Person", "p",
462+
map[string]interface{}{
463+
"name": "John Doe",
464+
"age": 33,
465+
"gender": "male",
466+
"status": "single",
467+
})
468+
edge := EdgeNew("Visited", john, japan, map[string]interface{}{"year": 2017})
469+
// Introduce entities to graph.
470+
graph.AddNode(john)
471+
graph.AddNode(japan)
472+
graph.AddEdge(edge)
473+
474+
// Flush graph to DB.
475+
res, err := graph.Commit()
476+
assert.Nil(t, err)
477+
assert.Equal(t, 2, res.NodesCreated(), "Expecting 2 node created")
478+
assert.Equal(t, 0, res.NodesDeleted(), "Expecting 0 nodes deleted")
479+
assert.Equal(t, 8, res.PropertiesSet(), "Expecting 8 properties set")
480+
assert.Equal(t, 1, res.RelationshipsCreated(), "Expecting 1 relationships created")
481+
assert.Equal(t, 0, res.RelationshipsDeleted(), "Expecting 0 relationships deleted")
482+
assert.Greater(t, res.InternalExecutionTime(), 0.0, "Expecting internal execution time not to be 0.0")
483+
assert.Equal(t, true, res.Empty(), "Expecting empty resultset")
484+
res, err = graph.Query("MATCH p = (:Person)-[:Visited]->(:Country) RETURN p")
485+
assert.Nil(t, err)
486+
assert.Equal(t, len(res.results), 1, "expecting 1 result record")
487+
assert.Equal(t, false, res.Empty(), "Expecting resultset to have records")
488+
res, err = graph.Query("MATCH ()-[r]-() DELETE r")
489+
assert.Nil(t, err)
490+
assert.Equal(t, 1, res.RelationshipsDeleted(), "Expecting 1 relationships deleted")
491+
}

graph.go

+11
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ func (g *Graph) Query(q string) (*QueryResult, error) {
108108
return QueryResultNew(g, r)
109109
}
110110

111+
// ROQuery executes a read only query against the graph.
112+
func (g *Graph) ROQuery(q string) (*QueryResult, error) {
113+
114+
r, err := g.Conn.Do("GRAPH.RO_QUERY", g.Id, q, "--compact")
115+
if err != nil {
116+
return nil, err
117+
}
118+
119+
return QueryResultNew(g, r)
120+
}
121+
111122
func (g *Graph) ParameterizedQuery(q string, params map[string]interface{}) (*QueryResult, error) {
112123
if(params != nil){
113124
q = BuildParamsHeader(params) + q

utils.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,25 @@ func arrayToString(arr []interface{}) string {
1818
return "[" + strings.Join(strArray, ",") + "]"
1919
}
2020

21+
// go array to string is [1 2 3] for [1, 2, 3] array
22+
// cypher expects comma separated array
23+
func strArrayToString(arr []string) string {
24+
var arrayLength = len(arr)
25+
strArray := []string{}
26+
for i := 0; i < arrayLength; i++ {
27+
strArray = append(strArray, ToString(arr[i]))
28+
}
29+
return "[" + strings.Join(strArray, ",") + "]"
30+
}
31+
32+
func mapToString(data map[string]interface{}) string {
33+
pairsArray := []string{}
34+
for k, v := range data {
35+
pairsArray = append(pairsArray, k + ": " + ToString(v))
36+
}
37+
return "{" + strings.Join(pairsArray, ",") + "}"
38+
}
39+
2140
func ToString(i interface{}) string {
2241
if(i == nil) {
2342
return "null"
@@ -33,9 +52,15 @@ func ToString(i interface{}) string {
3352
return strconv.FormatFloat(i.(float64), 'f', -1, 64)
3453
case bool:
3554
return strconv.FormatBool(i.(bool))
36-
case []interface {}:
55+
case []interface{}:
3756
arr := i.([]interface{})
3857
return arrayToString(arr)
58+
case map[string]interface{}:
59+
data := i.(map[string]interface{})
60+
return mapToString(data)
61+
case []string:
62+
arr := i.([]string)
63+
return strArrayToString(arr)
3964
default:
4065
panic("Unrecognized type to convert to string")
4166
}

0 commit comments

Comments
 (0)