| 92 | |
| 93 | @timeit |
| 94 | def generate(self): |
| 95 | # 准备排序好的资产信息数据 |
| 96 | infos = [] |
| 97 | for node in self.nodes: |
| 98 | assets = self.nodekey_assetsid_mapper.get(node.key, set()) |
| 99 | info = NodeAssetsInfo(key=node.key, assets_amount=0, assets=assets) |
| 100 | infos.append(info) |
| 101 | infos = sorted(infos, key=lambda i: [int(i) for i in i.key.split(':')]) |
| 102 | # 这个守卫需要添加一下,避免最后一个无法出栈 |
| 103 | guarder = NodeAssetsInfo(key='', assets_amount=0, assets=set()) |
| 104 | infos.append(guarder) |
| 105 | |
| 106 | stack = Stack() |
| 107 | for info in infos: |
| 108 | # 如果栈顶的不是这个节点的父祖节点,那么可以出栈了,可以计算资产数量了 |
| 109 | while stack.top and not info.key.startswith(f'{stack.top.key}:'): |
| 110 | pop_info = stack.pop() |
| 111 | pop_info.assets_amount = len(pop_info.assets) |
| 112 | self.nodekey_assetsinfo_mapper[pop_info.key] = pop_info |
| 113 | if not stack.top: |
| 114 | continue |
| 115 | stack.top.assets.update(pop_info.assets) |
| 116 | stack.push(info) |
| 117 | |
| 118 | def get_assets_by_key(self, key): |
| 119 | info = self.nodekey_assetsinfo_mapper[key] |