// EdgeMetadata produces an EdgeMetadata for a given edge. func (r Reduce) EdgeMetadata(rpt report.Report, localID, remoteID string) report.EdgeMetadata { metadata := report.EdgeMetadata{} for _, renderer := range r { metadata.Merge(renderer.EdgeMetadata(rpt, localID, remoteID)) } return metadata }
// EdgeMetadata gives the metadata of an edge from the perspective of the // srcRenderableID. Since an edgeID can have multiple edges on the address // level, it uses the supplied mapping function to translate address IDs to // renderable node (mapped) IDs. func (m Map) EdgeMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) report.EdgeMetadata { // First we need to map the ids in this layer into the ids in the underlying layer _, mapped := m.render(rpt) // this maps from old -> new inverted := map[string][]string{} // this maps from new -> old(s) for k, v := range mapped { existing := inverted[v] existing = append(existing, k) inverted[v] = existing } // Now work out a slice of edges this edge is constructed from oldEdges := []struct{ src, dst string }{} for _, oldSrcID := range inverted[srcRenderableID] { for _, oldDstID := range inverted[dstRenderableID] { oldEdges = append(oldEdges, struct{ src, dst string }{oldSrcID, oldDstID}) } } // Now recurse for each old edge output := report.EdgeMetadata{} for _, edge := range oldEdges { metadata := m.Renderer.EdgeMetadata(rpt, edge.src, edge.dst) output.Merge(metadata) } return output }