1 # vim: ts=8:sw=4:sts=4:et
2 package DBIx::Class::Tree::AdjacencyList;
5 use base qw( DBIx::Class );
9 DBIx::Class::Tree::AdjacencyList - Manage a tree of data using the common adjacency list model.
13 Create a table for your tree data.
15 CREATE TABLE employees (
16 employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
17 parent_id INTEGER NOT NULL,
21 In your Schema or DB class add Tree::AdjacencyList to the top
22 of the component list.
24 __PACKAGE__->load_components(qw( Tree::AdjacencyList ... ));
25 # If you want positionable data make sure this
26 # module comes first, as in:
27 __PACKAGE__->load_components(qw( Tree::AdjacencyList Positioned ... ));
29 Specify the column that contains the parent ID each row.
32 __PACKAGE__->parent_column('parent_id');
34 Thats it, now you can modify and analyze the tree.
39 my $employee = My::Employee->create({ name=>'Matt S. Trout' });
41 my $rs = $employee->children();
42 my @siblings = $employee->children();
44 my $parent = $employee->parent();
45 $employee->parent( 7 );
49 This module provides methods for working with adjacency lists. The
50 adjacency list model is a very common way of representing a tree structure.
51 In this model each row in a table has a prent ID column that references the
52 primary key of another row in the same table. Because of this the primary
53 key must only be one column and is usually some sort of integer. The row
54 with a parent ID of 0 is the root row and is usually the parent of all
61 __PACKAGE__->parent_column('parent_id');
63 Declares the name of the column that contains the self-referential
64 ID which defines the parent row. Defaults to "parent_id".
68 __PACKAGE__->mk_classdata( 'parent_column' => 'parent_id' );
72 my $parent = $employee->parent();
73 $employee->parent( $parent_obj );
74 $employee->parent( $parent_id );
76 Retrieves the object's parent ID, or sets the object's
77 parent ID. If setting the parent ID then 0 will be returned
78 if the object already has the specified parent, and 1 on
81 If you are using the Positioned component this
82 module will first move the object to the last position of
83 the list, change the parent ID, then move the object to the
84 last position of the new list. This ensures the intergrity
90 my( $self, $new_parent ) = @_;
91 my $parent_column = $self->parent_column();
93 if (ref($new_parent)) {
94 $new_parent = $new_parent->id();
96 return 0 if ($new_parent == $self->get_column($parent_column));
97 my $positioned = $self->can('position_column');
98 $self->move_last if ($positioned);
99 $self->set_column( $parent_column => $new_parent );
102 $self->position_column() => $self->search( {$self->_parent_clause()} )->count() + 1
109 return $self->find( $self->get_column( $parent_column ) );
115 my $children_rs = $employee->children();
116 my @children = $employee->children();
118 Returns a list or record set, depending on context, of all
119 the objects one level below the current one.
121 If you are using the Positioned component then this method
122 will return the children sorted by the position column.
128 my $rs = $self->search(
129 { $self->parent_column()=>$self->id() },
130 ( $self->can('position_column') ? {order_by=>$self->position_column()} : () )
132 return $rs->all() if (wantarray());
138 Same as children. Declared so that this module is
139 compatible with the Tree::NestedSet module.
143 #*descendants = \&children;
145 =head1 PRIVATE METHODS
147 These methods are used internally. You should never have the
150 =head2 _parent_clause
152 This method is provided as an override of the method in
153 DBIC::Positioned. This way Positioned and Tree::AdjacencyList
154 may be used together without conflict. Make sure that in
155 you component list that you load Tree::AdjacencyList before you
158 This method assumes a parent ID of 0 if none is defined. This
159 usually comes in to play if you are just createing the object
160 and it has not yet been assigned a parent.
167 $self->parent_column() =>
168 $self->get_column($self->parent_column()) || 0
177 Aran Deltac <bluefeet@cpan.org>
181 You may distribute this code under the same terms as Perl itself.