// 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 }
// 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 }
// AggregateMetadata 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 LeafMap) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) AggregateMetadata { t := m.Selector(rpt) metadata := report.EdgeMetadata{} for edgeID, edgeMeta := range t.EdgeMetadatas { src, dst, ok := report.ParseEdgeID(edgeID) if !ok { log.Printf("bad edge ID %q", edgeID) continue } if src != report.TheInternet { mapped, _ := m.Mapper(t.NodeMetadatas[src]) src = mapped.ID } if dst != report.TheInternet { mapped, _ := m.Mapper(t.NodeMetadatas[dst]) dst = mapped.ID } if src == srcRenderableID && dst == dstRenderableID { metadata.Flatten(edgeMeta) } } return AggregateMetadataOf(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 LeafMap) EdgeMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) report.EdgeMetadata { t := m.Selector(rpt) metadata := report.EdgeMetadata{} for edgeID, edgeMeta := range t.EdgeMetadatas { src, dst, ok := report.ParseEdgeID(edgeID) if !ok { log.Printf("bad edge ID %q", edgeID) continue } srcs, dsts := report.MakeIDList(src), report.MakeIDList(dst) if src != report.TheInternet { mapped := m.Mapper(t.NodeMetadatas[src]) srcs = ids(mapped) } if dst != report.TheInternet { mapped := m.Mapper(t.NodeMetadatas[dst]) dsts = ids(mapped) } if srcs.Contains(srcRenderableID) && dsts.Contains(dstRenderableID) { metadata = metadata.Flatten(edgeMeta) } } return metadata }