in nimo-shake/common/shard.go [23:66]
func BuildShardTree(shards []*dynamodbstreams.Shard, table string, ShardArn string) *ShardNode {
pathMap := make(map[string]*ShardNode, len(shards)) // store the inheritance relationship
inDegree := make(map[string]bool, len(shards))
// initial
for _, shard := range shards {
pathMap[*shard.ShardId] = &ShardNode{
Shard: shard,
ShardArn: ShardArn,
Sons: make(map[string]*ShardNode),
Table: table,
}
inDegree[*shard.ShardId] = false
}
// build path
for _, shard := range shards {
node := pathMap[*shard.ShardId]
father := shard.ParentShardId
if father != nil {
if _, ok := pathMap[*father]; !ok {
// father node isn't exist on the pathMap, which means deleted
continue
}
inDegree[*shard.ShardId] = true
pathMap[*father].Sons[*shard.ShardId] = node
}
}
// root is fake node
rootNode := &ShardNode{
Shard: nil,
ShardArn: "",
Sons: make(map[string]*ShardNode),
Table: table,
}
for key, val := range inDegree {
if val == false {
rootNode.Sons[key] = pathMap[key]
// fmt.Printf("root->%s\n", key)
}
}
return rootNode
}