func BuildShardTree()

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
}