123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- package tree
- import "sort"
- type Tree struct {
- Title string `json:"title"`
- Data interface{} `json:"data"`
- Leaf bool `json:"leaf"`
- Selected bool `json:"checked"`
- PartialSelected bool `json:"partiallySelected"`
- Children []Tree `json:"children"`
- }
- type INode interface {
- GetTitle() string
- GetId() int
- GetPid() int
- GetData() interface{}
- IsRoot() bool
- }
- type INodes []INode
- func (nodes INodes) Len() int {
- return len(nodes)
- }
- func (nodes INodes) Swap(i, j int) {
- nodes[i], nodes[j] = nodes[j], nodes[i]
- }
- func (nodes INodes) Less(i, j int) bool {
- return nodes[i].GetId() < nodes[j].GetId()
- }
- func (Tree) GenerateTree(nodes, selectedNodes []INode) (trees []Tree) {
- trees = []Tree{}
-
- var roots, childs []INode
- for _, v := range nodes {
- if v.IsRoot() {
-
- roots = append(roots, v)
- }
- childs = append(childs, v)
- }
- for _, v := range roots {
- childTree := &Tree{
- Title: v.GetTitle(),
- Data: v.GetData(),
- }
-
- childTree.Selected = nodeSelected(v, selectedNodes, childTree.Children)
-
- recursiveTree(childTree, childs, selectedNodes)
-
- if !childTree.Selected {
- childTree.Selected = nodeSelected(v, selectedNodes, childTree.Children)
- }
-
- childTree.PartialSelected = nodePartialSelected(childTree.Children)
-
- childTree.Leaf = len(childTree.Children) == 0
- trees = append(trees, *childTree)
- }
- return
- }
- func recursiveTree(tree *Tree, nodes, selectedNodes []INode) {
- data := tree.Data.(INode)
- for _, v := range nodes {
- if v.IsRoot() {
-
- continue
- }
- if data.GetId() == v.GetPid() {
- childTree := &Tree{
- Title: v.GetTitle(),
- Data: v.GetData(),
- }
- childTree.Selected = nodeSelected(v, selectedNodes, childTree.Children) || tree.Selected
- recursiveTree(childTree, nodes, selectedNodes)
- if !childTree.Selected {
- childTree.Selected = nodeSelected(v, selectedNodes, childTree.Children)
- }
- childTree.PartialSelected = nodePartialSelected(childTree.Children)
- childTree.Leaf = len(childTree.Children) == 0
- tree.Children = append(tree.Children, *childTree)
- }
- }
- }
- func (Tree) FindRelationNode(nodes, allNodes []INode) (respNodes []INode) {
- nodeMap := make(map[int]INode)
- for _, v := range nodes {
- recursiveFindRelationNode(nodeMap, allNodes, v, 0)
- }
- for _, v := range nodeMap {
- respNodes = append(respNodes, v)
- }
- sort.Sort(INodes(respNodes))
- return
- }
- func recursiveFindRelationNode(nodeMap map[int]INode, allNodes []INode, node INode, t int) {
- nodeMap[node.GetId()] = node
- for _, v := range allNodes {
- if _, ok := nodeMap[v.GetId()]; ok {
- continue
- }
-
- if t == 0 || t == 1 {
- if node.GetPid() == v.GetId() {
- nodeMap[v.GetId()] = v
- if v.IsRoot() {
-
- continue
- }
- recursiveFindRelationNode(nodeMap, allNodes, v, 1)
- }
- }
-
- if t == 0 || t == 2 {
- if node.GetId() == v.GetId() {
- nodeMap[v.GetId()] = v
- recursiveFindRelationNode(nodeMap, allNodes, v, 2)
- }
- }
- }
- }
- func nodeSelected(node INode, selectedNodes []INode, children []Tree) bool {
- for _, v := range selectedNodes {
- if node.GetId() == v.GetId() {
-
- return true
- }
- }
- if len(children) == 0 {
-
- return false
- }
- selectedNum := 0
- for _, v := range children {
- if v.Selected {
- selectedNum++
- }
- }
- if selectedNum == len(children) {
-
- return true
- }
- return false
- }
- func nodePartialSelected(trees []Tree) bool {
- selectedNum := 0
- for _, v := range trees {
- if v.Selected {
- selectedNum++
- }
- }
- if selectedNum == len(trees) || selectedNum == 0 {
-
- return false
- }
- return true
- }
|