-# vim: ts=8:sw=4:sts=4:et
package DBIx::Class::Tree::AdjacencyList;
+# vim: ts=8:sw=4:sts=4:et
+
use strict;
use warnings;
+
use base qw( DBIx::Class );
use Carp qw( croak );
will create a has_many (children) and belongs_to (parent)
relationship.
+This method also setups an additional has_many relationship called
+parents which is useful when you want to treat an adjacency list
+as a DAG.
+
=cut
__PACKAGE__->mk_classdata( '_parent_column' => 'parent_id' );
my $primary_col = ($class->primary_columns())[0];
$class->belongs_to( '_parent' => $class => { "foreign.$primary_col" => "self.$parent_col" } );
$class->has_many( 'children' => $class => { "foreign.$parent_col" => "self.$primary_col" } );
+ $class->has_many( 'parents' => $class => { "foreign.$primary_col" => "self.$parent_col" } );
$class->_parent_column( $parent_col );
return 1;
}
return $self->_parent();
}
+=head2 parents
+
+ my $parents = $node->parents();
+ my @parents = $node->parents();
+
+This has_many relationship is not that useful as it will
+never return more than one parent due to the one-to-many
+structure of adjacency lists. The reason this relationship
+is defined is so that this tree type may be treated as if
+it was a DAG.
+
=head2 children
my $children_rs = $employee->children();
our $NODE_COUNT = 80;
sub count_tests {
- my $count = 11;
+ my $count = 13;
if( TreeTest::Schema::Node->can('position_column') ){
$count ++;
}
ok( ($nodes->find(22)->children->count()==2), 'node 22 has correct number of children' );
ok( ($nodes->find(22)->siblings->count()==3), 'node 22 has correct number of siblings' );
+ ok( ($nodes->find(22)->parents->count()==1), 'node 22 has correct number of parents' );
+ ok( (($nodes->find(22)->parents->all())[0]->id()==$nodes->find(22)->parent->id()), 'node 22 parent matches parents' );
+
if( TreeTest::Schema::Node->can('position_column') ){
ok( check_positions(scalar $root->children()), 'positions are correct' );
}