[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