func Adapt()

in pkg/display/graph/tree/adapter.go [29:75]


func Adapt(trace api.Trace) (roots []*Node, serviceNames []string) {
	all := make(map[string]*Node)
	set := make(map[string]bool)
	var traceID string
	for _, span := range trace.Spans {
		if !set[span.ServiceCode] {
			serviceNames = append(serviceNames, span.ServiceCode)
			set[span.ServiceCode] = true
		}
		all[id(span)] = node(span)
		if traceID == "" {
			traceID = span.TraceID
		}
	}

	seen := make(map[string]bool)

	for _, span := range trace.Spans {
		if isRoot(span) {
			roots = append(roots, all[id(span)])
			seen[id(span)] = true
		}
		for _, ref := range span.Refs {
			if all[id0(ref)] == nil {
				for i := 0; i <= ref.ParentSpanID; i++ {
					if traceID != ref.TraceID {
						continue
					}
					virtualSpan := virtualSpan(i, *ref)
					if all[id(virtualSpan)] != nil {
						continue
					}
					all[id(virtualSpan)] = node(virtualSpan)
					if i == 0 {
						roots = append(roots, all[id(virtualSpan)])
						seen[id(virtualSpan)] = true
					} else if all[id1(ref)] != nil {
						all[id1(ref)].Children = append(all[id1(ref)].Children, all[id(virtualSpan)])
						seen[id(virtualSpan)] = true
					}
				}
			}
		}
	}
	buildTree(all, seen, trace)
	return roots, serviceNames
}