forked from glennliao/apijson-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnode.go
executable file
·88 lines (72 loc) · 1.87 KB
/
node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package util
import (
"path/filepath"
"github.com/glennliao/apijson-go/consts"
"github.com/glennliao/apijson-go/model"
)
func IsFirstUp(str string) bool {
if len(str) == 0 {
return false
}
firstLetter := str[0]
return firstLetter >= 'A' && firstLetter <= 'Z'
}
// HasFirstUpKey 用户判断是否存在查询节点
func HasFirstUpKey(m model.Map) bool {
for k := range m {
if IsFirstUp(k) {
return true
}
}
return false
}
func RemoveSuffix(key string, suffix string) string {
return key[0 : len(key)-len(suffix)]
}
// ParseRefCol 解析引用字段
// 将 "id@":"[]/User/userId" 解析出引用信息
func ParseRefCol(refStr string) (refPath string, refCol string) {
refCol = filepath.Base(refStr) // userId
if refCol == refStr {
return refStr, ""
}
refPath = refStr[0 : len(refStr)-len(refCol)-1] // []/User
return refPath, refCol
}
// AnalysisOrder 使用拓扑排序 分析节点fetch优先级
func AnalysisOrder(prerequisites [][]string) ([]string, error) {
var pointMap = make(map[string]bool)
for _, prerequisite := range prerequisites {
pointMap[prerequisite[0]] = true
pointMap[prerequisite[1]] = true
}
var pointNum = len(pointMap)
var edgesMap = make(map[string][]string)
var inDeg = make(map[string]int)
var result []string
for _, prerequisite := range prerequisites {
edgesMap[prerequisite[1]] = append(edgesMap[prerequisite[1]], prerequisite[0])
inDeg[prerequisite[0]]++
}
var queue []string
for point, _ := range pointMap {
if inDeg[point] == 0 {
queue = append(queue, point)
}
}
for len(queue) > 0 {
var first string
first, queue = queue[0], queue[1:]
result = append(result, first)
for _, point := range edgesMap[first] {
inDeg[point]--
if inDeg[point] == 0 {
queue = append(queue, point)
}
}
}
if len(result) != pointNum {
return nil, consts.NewValidReqErr("nodes cycle")
}
return result, nil
}