在python中预先计算lft / rgt

时间:2013-12-08 01:13:30

标签: python mptt

我们有几个MySQL表,其中包含lft / rgt(嵌套的set / modified preorder树遍历),parent_idlevel列。每天晚上我们擦除表格并从客户端获取新数据。由于我们从客户端数据库中获取数据的方式,我们可以轻松计算parent_idlevel,但在我们与存储过程同步后设置lgtrgt。到目前为止,我们只需要处理非常小的结果集,不超过30,000行。但是现在我们正在关注超过200,000个em,而且它将永远消失。我已经让同步运行了一个多小时但仍然没有完成,通常需要大约5-15分钟(我觉得有点多)。

在存储到db之前,是否有另一种计算lft / rgt的方法? (最好用python)

我们的同步看起来的一些伪代码:

class Node(object):
    def __init__(self, id, data=None):
        self.id = id
        self.children = []
        self.data = data
        self.parent = None

    def add_child(self, child):
        self.children.append(child)
        child.parent = self

def sync(source_sql_result):
    node_map = {}
    current_id = 0
    parent_node = None

    for source_row in source_sql_result:
        for i, row in enumerate(get_subrows(source_row), 1):
            try:
                parent_node = node_map[row['identifier']]
            except KeyError:
                # New node found
                current_id += 1
                row['level'] = i
                node = Node(id=current_id, data=row)
                if parent_node is not None:
                    parent_node.add_child(node)
                node_map[row['identifier']] = node
                parent_node = node

    for node in node_map.values():
        yield node.data

0 个答案:

没有答案