func (wk *worker) runIterator(it graph.Iterator) { if wk.wantShape() { iterator.OutputQueryShapeForIterator(it, wk.qs, wk.shape) return } it, _ = it.Optimize() if clog.V(2) { b, err := json.MarshalIndent(it.Describe(), "", " ") if err != nil { clog.Infof("failed to format description: %v", err) } else { clog.Infof("%s", b) } } for { select { case <-wk.kill: return default: } if !graph.Next(it) { break } tags := make(map[string]graph.Value) it.TagResults(tags) if !wk.send(&Result{actualResults: tags}) { break } for it.NextPath() { select { case <-wk.kill: return default: } tags := make(map[string]graph.Value) it.TagResults(tags) if !wk.send(&Result{actualResults: tags}) { break } } } if clog.V(2) { bytes, _ := json.MarshalIndent(graph.DumpStats(it), "", " ") clog.Infof(string(bytes)) } it.Close() }
func (s *Session) ShapeOf(query string) (interface{}, error) { var mqlQuery interface{} err := json.Unmarshal([]byte(query), &mqlQuery) if err != nil { return nil, err } s.currentQuery = NewQuery(s) s.currentQuery.BuildIteratorTree(mqlQuery) output := make(map[string]interface{}) iterator.OutputQueryShapeForIterator(s.currentQuery.it, s.qs, output) nodes := make([]iterator.Node, 0) for _, n := range output["nodes"].([]iterator.Node) { n.Tags = nil nodes = append(nodes, n) } output["nodes"] = nodes return output, nil }
func (wk *worker) runIterator(it graph.Iterator) { if wk.wantShape() { iterator.OutputQueryShapeForIterator(it, wk.qs, wk.shape) return } ctx, cancel := wk.newContext() defer cancel() err := graph.Iterate(ctx, it).Paths(true).TagEach(func(tags map[string]graph.Value) { if !wk.send(ctx, &Result{actualResults: tags}) { cancel() } }) if err != nil { clog.Errorf("gremlin: %v", err) } }