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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
"""A basic Adjacency List model tree."""
from sqlalchemy import MetaData, Table, Column, Sequence, ForeignKey
from sqlalchemy import Integer, String
from sqlalchemy.orm import create_session, mapper, relation, backref
from sqlalchemy.orm.collections import attribute_mapped_collection
metadata = MetaData('sqlite:///')
metadata.bind.echo = True
trees = Table('treenodes', metadata,
Column('id', Integer, Sequence('treenode_id_seq', optional=True),
primary_key=True),
Column('parent_id', Integer, ForeignKey('treenodes.id'), nullable=True),
Column('name', String(50), nullable=False))
class TreeNode(object):
"""a rich Tree class which includes path-based operations"""
def __init__(self, name):
self.name = name
self.parent = None
self.id = None
self.parent_id = None
def append(self, node):
if isinstance(node, str):
node = TreeNode(node)
node.parent = self
self.children[node.name] = node
def __repr__(self):
return self._getstring(0, False)
def __str__(self):
return self._getstring(0, False)
def _getstring(self, level, expand = False):
s = (' ' * level) + "%s (%s,%s, %d)" % (
self.name, self.id,self.parent_id,id(self)) + '\n'
if expand:
s += ''.join([n._getstring(level+1, True)
for n in self.children.values()])
return s
def print_nodes(self):
return self._getstring(0, True)
mapper(TreeNode, trees, properties={
'children': relation(TreeNode, cascade="all",
backref=backref("parent", remote_side=[trees.c.id]),
collection_class=attribute_mapped_collection('name'),
lazy=False, join_depth=3)})
print "\n\n\n----------------------------"
print "Creating Tree Table:"
print "----------------------------"
trees.create()
node2 = TreeNode('node2')
node2.append('subnode1')
node = TreeNode('rootnode')
node.append('node1')
node.append(node2)
node.append('node3')
node.children['node2'].append('subnode2')
print "\n\n\n----------------------------"
print "Created new tree structure:"
print "----------------------------"
print node.print_nodes()
print "\n\n\n----------------------------"
print "Flushing:"
print "----------------------------"
session = create_session()
session.save(node)
session.flush()
print "\n\n\n----------------------------"
print "Tree After Save:"
print "----------------------------"
print node.print_nodes()
node.append('node4')
node.children['node4'].append('subnode3')
node.children['node4'].append('subnode4')
node.children['node4'].children['subnode3'].append('subsubnode1')
del node.children['node1']
print "\n\n\n----------------------------"
print "Modified the tree"
print "(added node4, node4/subnode3, node4/subnode4,"
print "node4/subnode3/subsubnode1, deleted node1):"
print "----------------------------"
print node.print_nodes()
print "\n\n\n----------------------------"
print "Flushing:"
print "----------------------------"
session.flush()
print "\n\n\n----------------------------"
print "Tree After Save:"
print "----------------------------"
print node.print_nodes()
nodeid = node.id
print "\n\n\n----------------------------"
print "Clearing session, selecting "
print "tree new where node_id=%d:" % nodeid
print "----------------------------"
session.clear()
t = session.query(TreeNode).filter(TreeNode.id==nodeid)[0]
print "\n\n\n----------------------------"
print "Full Tree:"
print "----------------------------"
print t.print_nodes()
print "\n\n\n----------------------------"
print "Marking root node as deleted"
print "and flushing:"
print "----------------------------"
session.delete(t)
session.flush()
|