diff --git a/server/meta/node.go b/server/meta/node.go index 392b7b9712920e84cef51f31f12cb8083191dda8..94c0b16bf586cefb61962186d39da168c76d79a7 100755 --- a/server/meta/node.go +++ b/server/meta/node.go @@ -7,8 +7,10 @@ import ( ) type Nodes struct { - Lookup map[string]*Node - Nodes []*Node + Lookup map[string]*Node + LookupByType map[string][]*Node + LookupByUUID map[string][]*Node + Nodes []*Node } type Node struct { @@ -32,18 +34,35 @@ func (ns *Nodes) Add(node *Node) { } ns.Lookup[node.ID] = node + ns.LookupByType[node.Type] = append(ns.LookupByType[node.Type], node) + ns.LookupByUUID[node.UUID] = append(ns.LookupByUUID[node.UUID], node) ns.Nodes = append(ns.Nodes, node) } -func (ns *Nodes) Remove(id string) error { +func (ns *Nodes) Remove(node *Node) error { for i := 0; i < len(ns.Nodes); i++ { - if ns.Nodes[i].ID != id { + if ns.Nodes[i].ID != node.ID { continue } + + for j, n := range ns.LookupByType[ns.Nodes[i].Type] { + if n.ID == node.ID { + ns.LookupByType[ns.Nodes[i].Type] = append(ns.LookupByType[ns.Nodes[i].Type][:j], ns.LookupByType[ns.Nodes[i].Type][j+1:]...) + break + } + } + + for j, n := range ns.LookupByUUID[ns.Nodes[i].UUID] { + if n.ID == node.ID { + ns.LookupByUUID[ns.Nodes[i].Type] = append(ns.LookupByUUID[ns.Nodes[i].UUID][:j], ns.LookupByUUID[ns.Nodes[i].UUID][j+1:]...) + } + } + ns.Nodes = append(ns.Nodes[:i], ns.Nodes[i+1:]...) - delete(ns.Lookup, id) + delete(ns.Lookup, node.ID) + return nil } - return errors.New(fmt.Sprintf("node %s not found**9", id)) + return errors.New(fmt.Sprintf("node %s not found**9", node.ID)) } diff --git a/server/processor/processor.go b/server/processor/processor.go index dd844af98dcdca930b1524a04c7475d0bdb296bc..ad69f9837cfa028ec0d9e60c639ea6a5c376f85e 100644 --- a/server/processor/processor.go +++ b/server/processor/processor.go @@ -24,8 +24,10 @@ func CreateDataProcesser() *DataProcesser { func (d *DataProcesser) Process_data() (*meta.Nodes, *meta.Edges, []error, []error) { nodes := &meta.Nodes{ - Lookup: make(map[string]*meta.Node, 0), - Nodes: make([]*meta.Node, 0), + Lookup: make(map[string]*meta.Node, 0), + LookupByType: make(map[string][]*meta.Node, 0), + LookupByUUID: make(map[string][]*meta.Node, 0), + Nodes: make([]*meta.Node, 0), } edges := &meta.Edges{ SrcToDsts: make(map[string][]string, 0),