Skip to content

Commit 3545a76

Browse files
committed
Add support for map datatype
1 parent d2a117c commit 3545a76

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

client_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,34 @@ func TestArray(t *testing.T) {
216216
assert.Equal(t, b.GetProperty("array"), resB.GetProperty("array"), "Unexpected property value.")
217217
}
218218

219+
func TestMap(t *testing.T) {
220+
createGraph()
221+
222+
q := "RETURN {val_1: 5, val_2: 'str'}"
223+
res, err := graph.Query(q)
224+
if err != nil {
225+
t.Error(err)
226+
}
227+
res.Next()
228+
r := res.Record()
229+
mapval := r.GetByIndex(0).(map[string]interface{})
230+
231+
expected := map[string]interface{}{"val_1": 5, "val_2": "str"}
232+
assert.Equal(t, mapval, expected, "expecting a map literal")
233+
234+
q = "MATCH (a:Country) RETURN a { .name }"
235+
res, err = graph.Query(q)
236+
if err != nil {
237+
t.Error(err)
238+
}
239+
res.Next()
240+
r = res.Record()
241+
mapval = r.GetByIndex(0).(map[string]interface{})
242+
243+
expected = map[string]interface{}{"name": "Japan"}
244+
assert.Equal(t, mapval, expected, "expecting a map projection")
245+
}
246+
219247
func TestPath(t *testing.T) {
220248
createGraph()
221249
q := "MATCH p = (:Person)-[:Visited]->(:Country) RETURN p"

query_result.go

+16
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const (
4444
VALUE_EDGE
4545
VALUE_NODE
4646
VALUE_PATH
47+
VALUE_MAP
4748
)
4849

4950
type QueryResultHeader struct {
@@ -227,6 +228,18 @@ func (qr *QueryResult) parsePath(cell interface{}) Path {
227228
return PathNew(nodes.([]interface{}), edges.([]interface{}))
228229
}
229230

231+
func (qr *QueryResult) parseMap(cell interface{}) map[string]interface{} {
232+
var raw_map = cell.([]interface{})
233+
var mapLength = len(raw_map)
234+
var parsed_map = make(map[string]interface{})
235+
for i := 0; i < mapLength; i++ {
236+
pair := raw_map[i].([]interface{})
237+
key, _ := redis.String(pair[0], nil)
238+
parsed_map[key] = qr.parseScalar(pair[1].([]interface{}))
239+
}
240+
return parsed_map
241+
}
242+
230243
func (qr *QueryResult) parseScalar(cell []interface{}) interface{} {
231244
t, _ := redis.Int(cell[0], nil)
232245
v := cell[1]
@@ -259,6 +272,9 @@ func (qr *QueryResult) parseScalar(cell []interface{}) interface{} {
259272
case VALUE_PATH:
260273
s = qr.parsePath(v)
261274

275+
case VALUE_MAP:
276+
s = qr.parseMap(v)
277+
262278
case VALUE_UNKNOWN:
263279
panic("Unknown scalar type\n")
264280
}

0 commit comments

Comments
 (0)