[Catalyst] Adjacency list "trees" and DBIC (recursion fun)
Dylan Vanderhoof
DylanV at semaphore.com
Thu Dec 14 19:16:24 GMT 2006
Hm. This works fine if I create a new resultset and search on parent =>
parent->id, rather than trying to use the DBIC relationships to traverse
the tree.
I can live with that I suppose, but it would be nifty to be able to do
it without instantiating a new resultset.
-D
> -----Original Message-----
> From: Dylan Vanderhoof
> Sent: Thursday, December 14, 2006 11:00 AM
> To: The elegant MVC web framework
> Subject: [Catalyst] Adjacency list "trees" and DBIC (recursion fun)
>
>
> Hello all,
> I have a bit of a niche question, but maybe somebody has run
> into this.
> My environment is Catalyst (latest stable), DBIx::Class and TT. Below
> is a table description and some chunk of code I'm actually using with
> altered names.
>
> I'm wanting to traverse the tree and just have debug
> statements to tell
> me what node I found and what order the node is.
> However, when running, it seems to recurse endlessly, which isn't
> happening in my pure-perl/DBI version. I'm guessing there's something
> about DBIC I'm running into that's making this not work and
> there should
> be a better approach. Anybody have any suggestions? =)
>
> (I put this on the Cat list because I'll almost certainly
> follow up with
> some Catalyst/TT questions, but I can punt it to the DBIC list if that
> makes more sens.)
>
> Thanks,
> Dylan
>
> ---------------------------------------
> Table structure and code follows
>
> I have a self-referencing table that forms a tree using an adjacency
> list, more or less of the format:
>
>
> Table Foo:
>
> id int not null pk
> parent int fk referencing self.id
> is_leaf boolean
> [data columns]
>
>
> A null parent is a root, and any node where is_leaf is true is the end
> of a branch.
>
>
> My DBIC config has (among other things):
>
> __PACKAGE__->has_many(
> "foo",
> "MyApp::Schema::Foo",
> { "foreign.parent" => "self.id" },
> );
>
>
> My thought was that I should be able to do:
>
>
>
> sub someroutine : Whatever {
>
> $rs = $schema->resultset('Foo')->search( { parent => undef } ); # root
> nodes
>
> while( $root_node = $rs->next ) {
> if( $root_node->leaf_node == 0 ) {
> $c->log->debug("Root is a left, stopping");
> } else {
> while ( $child = $root_node->foo->next ) {
> traverse_tree( $c, $root_node, $child, 2);
> }
> }
> }
>
>
> sub traverse_tree {
> my $c = shift;
> my $parent = shift;
> my $child = shift;
> my $order = shift;
> my $next_child;
>
> if( $child->leaf_node == 0 )
> {
> $c->log->debug( "Got order $order child: " .
> $child->description
> );
> while( $next_child = $child->foo->next ) {
> build_tree( $c, $child, $next_child, $order + 1 );
> }
> } else {
> $c->log->debug( "Got order $order child (leaf): " .
> $child->description );
> }
> }
>
> _______________________________________________
> List: Catalyst at lists.rawmode.org
> Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
> Searchable archive:
> http://www.mail-archive.com/catalyst@lists.rawmode.org/
> Dev site: http://dev.catalyst.perl.org/
>
More information about the Catalyst
mailing list