Hi Chris,
no. But it is trivial with web2py.
Here I implemented the example in
http://www.sitepoint.com/print/hierarchical-data-database/
db=SQLDB('sqlite://tree.db')
db.define_table('tree',db.Field('title'),db.Field
('left','integer'),db.Field('right','integer'))
db.tree.insert(title='Food',left=1,right=2)
def add_node(title,parent_title):
"""
add_node
('Fruit','Food')
add_node
('Meat','Food')
add_node
('Red','Fruit')
"""
parent=db(db.tree.title==parent_title).select()[0]
db(db.tree.right>=parent.right).update(right=db.tree.right+2)
db(db.tree.left>=parent.right).update(left=db.tree.left+2)
db.tree.insert(title=title,left=parent.right,right=parent.right+1)
def ancestors(title,*fields):
""" print ancestors('Red',db.tree.title)"""
node=db(db.tree.title==title).select()[0]
return db(db.tree.left<node.left)(db.tree.right>node.right).select
(orderby=db.tree.left,*fields)
def descendants(title,*fields):
""" print ancestors('Fruit',db.tree.title)"""
node=db(db.tree.title==title).select()[0]
return db(db.tree.left>node.left)(db.tree.right<node.right).select
(orderby=db.tree.left,*fields)
def test():
print db().select(db.tree.ALL)
add_node('Fruit','Food')
print db().select(db.tree.ALL)
add_node('Meat','Food')
print db().select(db.tree.ALL)
add_node('Red','Fruit')
print db().select(db.tree.ALL)
print ancestors('Red',db.tree.title)
print descendants('Fruit',db.tree.title)
test()
OUTPUT:
tree.id,tree.title,tree.left,tree.right
1,Food,1,2
tree.id,tree.title,tree.left,tree.right
1,Food,1,4
2,Fruit,2,3
tree.id,tree.title,tree.left,tree.right
1,Food,1,6
2,Fruit,2,3
3,Meat,4,5
tree.id,tree.title,tree.left,tree.right
1,Food,1,8
2,Fruit,2,5
3,Meat,6,7
4,Red,3,4
tree.title
Food
Fruit
tree.title
Red