diff --git a/query/gizmo/gizmo_test.go b/query/gizmo/gizmo_test.go index 44060a90a..6adb94f6b 100644 --- a/query/gizmo/gizmo_test.go +++ b/query/gizmo/gizmo_test.go @@ -415,6 +415,14 @@ var testQueries = []struct { tag: "somecool", expect: []string{"cool_person", "cool_person"}, }, + { + message: "save iri no tag", + query: ` + g.V().save(g.IRI("status")).all() + `, + tag: "", + expect: []string{"cool_person", "cool_person", "cool_person", "smart_person", "smart_person"}, + }, { message: "show a simple saveR", query: ` diff --git a/query/gizmo/traversals.go b/query/gizmo/traversals.go index 4035ddf10..171a5d6b0 100644 --- a/query/gizmo/traversals.go +++ b/query/gizmo/traversals.go @@ -26,6 +26,8 @@ import ( "github.com/cayleygraph/cayley/graph/iterator" "github.com/cayleygraph/cayley/graph/path" "github.com/cayleygraph/cayley/graph/shape" + "github.com/cayleygraph/cayley/query" + "github.com/cayleygraph/quad" ) // pathObject is a Path object in Gizmo. @@ -452,7 +454,7 @@ func (p *pathObject) save(call goja.FunctionCall, rev, opt bool) goja.Value { if len(args) > 2 || len(args) == 0 { return throwErr(p.s.vm, errArgCount{Got: len(args)}) } - vtag := args[0] + var vtag interface{} = "" if len(args) == 2 { vtag = args[1] } @@ -463,12 +465,29 @@ func (p *pathObject) save(call goja.FunctionCall, rev, opt bool) goja.Value { via := args[0] if vp, ok := via.(*pathObject); ok { via = vp.path + if tag == "" { + return throwErr(p.s.vm, errors.New("must specify a tag name when saving a path")) + } } else { - var err error - via, err = toQuadValue(via) + qv, err := toQuadValue(via) + via = qv if err != nil { return throwErr(p.s.vm, err) } + if tag == "" { + if p.s.col == query.JSONLD { + switch qv := qv.(type) { + case quad.IRI: + tag = string(qv) + case quad.String: + tag = string(qv) + default: + tag = quad.StringOf(qv) + } + } else { + tag = quad.StringOf(qv) + } + } } np := p.clonePath() if opt {