prefetch across multiple tables

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

prefetch across multiple tables

John Stoffel

Hi,

I've been pounding my head trying to figure out what I'm doing wrong
here.  I've got a simple three table DB:

Names: full_name, name_id  
has_many:
  Account: account_id, boxfolder_id, URL, comment
    has_one:
      Boxfolder:  boxfolder_id, volume, folder, range

I can do simple SQL queries, looking for full_name like this:

mysql> SELECT n.name_id,n.full_name,a.account_id,b.boxfolder_id,b.volume,b.folder,b.range FROM names as n LEFT JOIN account AS a ON n.name_id = a.name_id LEFT JOIN boxfolder AS b on a.boxfolder_id = b.boxfolder_id WHERE n.full_name LIKE 'Emlen%';
+---------+----------------+------------+--------------+--------+--------+-----------+
| name_id | full_name      | account_id | boxfolder_id | volume | folder | range     |
+---------+----------------+------------+--------------+--------+--------+-----------+
|    8213 | Emlen & Howell |       5920 |          234 | 24     | 10     | 2237-2266 |
|    8213 | Emlen & Howell |       5921 |          249 | 26     | 10     | 2792-2823 |
|    8213 | Emlen & Howell |       5922 |          281 | 28     | 12     | 4022-4063 |
|    8214 | Emlen, Caleb   |       5923 |           14 | 2      | 14     | 322-347   |
|    8214 | Emlen, Caleb   |       5924 |           50 | 6      | 5      | 2035-2082 |
+---------+----------------+------------+--------------+--------+--------+-----------+
5 rows in set (0.00 sec)


Now when I try to use DBIx::Class (inside a Dancer web app) I just
can't make it work.  My code looks like this:

#!/usr/bin/perl -w
use DBIx::Class;
use lib '../lib';
use Carey::Schema;
use Data::Dumper;

my $name = shift @ARGV;
$name .= "%";

my $schema = Carey::Schema->connect('DBI:mysql:database=foo;host=localhost;port=3306', 'password','', { PrintError => 1, RaiseError => 1});

my $rs = $schema->resultset('Name')->search({ full_name => { like => $name }, },
                                            { limit => 10,
                                              order_by => { -asc => 'full_name' },
                                              prefetch => [ 'account', { 'account' => 'boxfolder'}],
                                            });

while (my $r = $rs->next) {
  print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";

  foreach my $a ($r->account()) {
    print "Account: ", $a->account_id();
    print "  (boxfolder_id: ", $a->get_column('boxfolder_id'), ") ";
    my $t = $a->url();
    $t =~ m/value2=(\w+)\&/;
    print "  URL: $1\n";
    $vol = $a->boxfolder()->volume;
    print "VOL: $vol\n";
    print "\n";
  }
}


And in the various schemas, generated with dbicdump, I have stuff like this:

Name.pm:
__PACKAGE__->has_many('account', 'Carey::Schema::Result::Account','name_id');

Account.pm:
__PACKAGE__->belongs_to('name', 'Carey::Schema::Result::Name','account_id');
__PACKAGE__->has_one('boxfolder', 'Carey::Schema::Result::Boxfolder','boxfolder_id' );

Boxfolder.pm:
__PACKAGE__->belongs_to('account','Carey::Schema::Result::Account','boxfolder_id');



Now when I run the above code, looking for a name like "Emlen" (don't ask!  It's not my data... :-)

I get stuff like this:

> ../bin/dbic-test.pl Emlen
DBIx::Class::ResultSet::next(): Prefetching multiple has_many rels account and account at top level will explode the number of row objects retrievable via ->next or ->all. Use at your own risk. at ../bin/dbic-test.pl line 19
Full Name: Emlen & Howell (8213)
Account: 5920  (boxfolder_id: 234)   URL: b16f10
Can't call method "volume" on an undefined value at ../bin/dbic-test.pl line 28.


I've tried multiple variations of the prefetch, like:

   prefetch => { 'account' => 'boxfolder' }
   prefetch => [ 'account', 'boxfolder' }

but I'm missing something, even though I've been reading and
re-reading the DBIx::Class::Manual::Cookbook back and forth and trying
to wrap my brain around what I'm missing.

What am I missing?

Thanks,
John

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

Dagfinn Ilmari Mannsåker
"John Stoffel" <[hidden email]> writes:

> Hi,

Hi John,

> I've been pounding my head trying to figure out what I'm doing wrong
> here.  I've got a simple three table DB:
>
> Names: full_name, name_id  
> has_many:
>   Account: account_id, boxfolder_id, URL, comment
>     has_one:
>       Boxfolder:  boxfolder_id, volume, folder, range
[…]
> Now when I try to use DBIx::Class (inside a Dancer web app) I just
> can't make it work.  My code looks like this:
>
> my $rs = $schema->resultset('Name')->search({ full_name => { like => $name }, },
>                                             { limit => 10,
>                                               order_by => { -asc => 'full_name' },
>                                               prefetch => [ 'account', { 'account' => 'boxfolder'}],

This is not what you want, as that'll join twice to the account table,
and then from one of those instances to the boxfolder table.

>                                             });
[…]

> And in the various schemas, generated with dbicdump, I have stuff like this:
>
> Name.pm:
> __PACKAGE__->has_many('account', 'Carey::Schema::Result::Account','name_id');
>
> Account.pm:
> __PACKAGE__->belongs_to('name', 'Carey::Schema::Result::Name','account_id');
> __PACKAGE__->has_one('boxfolder', 'Carey::Schema::Result::Boxfolder','boxfolder_id' );
>
> Boxfolder.pm:
> __PACKAGE__->belongs_to('account','Carey::Schema::Result::Account','boxfolder_id');

> I get stuff like this:
>
>> ../bin/dbic-test.pl Emlen
> DBIx::Class::ResultSet::next(): Prefetching multiple has_many rels account and account at top level will explode the number of row objects retrievable via ->next or ->all. Use at your own risk. at ../bin/dbic-test.pl line 19

This warning stems from the fact that you're joining twice to the
account table.  However, this warning does not exist in the current DBIC
version. Which version are you running?

> Full Name: Emlen & Howell (8213)
> Account: 5920  (boxfolder_id: 234)   URL: b16f10
> Can't call method "volume" on an undefined value at ../bin/dbic-test.pl line 28.

This error stems from the fact that it's the second instance of account
that has prefetched the boxfolder, not the first.

> I've tried multiple variations of the prefetch, like:
>
>    prefetch => { 'account' => 'boxfolder' }

This is the correct one and should work. Can you run this with the
DBI_TRACE environment variable set to 1, and show us the full output?


--
"The surreality of the universe tends towards a maximum" -- Skud's Law
"Never formulate a law or axiom that you're not prepared to live with
 the consequences of."                              -- Skud's Meta-Law


_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

John Stoffel
>>>>> "Dagfinn" == Dagfinn Ilmari Mannsåker <[hidden email]> writes:

Dagfinn> "John Stoffel" <[hidden email]> writes:
>> Hi,

Dagfinn> Hi John,

>> I've been pounding my head trying to figure out what I'm doing wrong
>> here.  I've got a simple three table DB:
>>
>> Names: full_name, name_id  
>> has_many:
>> Account: account_id, boxfolder_id, URL, comment
>> has_one:
>> Boxfolder:  boxfolder_id, volume, folder, range
Dagfinn> […]
>> Now when I try to use DBIx::Class (inside a Dancer web app) I just
>> can't make it work.  My code looks like this:
>>
>> my $rs = $schema->resultset('Name')->search({ full_name => { like => $name }, },
>> { limit => 10,
>> order_by => { -asc => 'full_name' },
>> prefetch => [ 'account', { 'account' => 'boxfolder'}],

Dagfinn> This is not what you want, as that'll join twice to the account table,
Dagfinn> and then from one of those instances to the boxfolder table.

That's what I figured, esp when I got those errors.  Looking at my
system where I'm trying this, it's a Debian i686 running Wheezy, and
the DBIx::Class::VERSION is

   > perl -e 'use DBIx::Class; print "$DBIx::Class::VERSION\n";'
   0.08196

And the DBIx::Class stuff is:

  > dpkg-query -l | grep dbix
  ii  libdbix-class-cursor-cached-perl           1.001002-1
  all          cursor object with built-in caching support
  ii  libdbix-class-perl                         0.08196-3
  all          extensible and flexible object <-> relational mapper
  ii  libdbix-class-schema-loader-perl           0.07025-1
  all          module to automate definition of a DBIx::Class::Schema
  ii  libdbix-contextualfetch-perl               1.03-3
  all          module to add context aware fetches to DBI


Time to pull out CPAN and upgrade by hand.  Should have tried this
first.  Let me go do that update, and then I'll see what happens when
I have the prefetch set to just:

   prefetch => { 'account' => 'boxfolder' }

Dagfinn> This is the correct one and should work. Can you run this with the
Dagfinn> DBI_TRACE environment variable set to 1, and show us the full output?

Thanks for the reminder, I'll send that info along too if version
0.082810 of DBIx::Class (and dependencies) doesn't work for me.

Thanks!
John

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

John Stoffel
In reply to this post by Dagfinn Ilmari Mannsåker

Hi all,

With a bit of nudging, I had a head-smack moment and upgraded to the
latest version of DBIx::Class on CPAN, and it now looks like things
are working better for me, but I'm still getting some interesting
behavior.  

Before I got errors, now I can do:

   > ../bin/dbic-test.pl Emlen
   DBIx::Class::ResultSet::_construct_results(): Unable to properly collapse has_many results in iterator mode due to order criteria - performed an eager cursor slurp underneath. Consider using ->all() instead at ../bin/dbic-test.pl line 20
   Full Name: Emlen & Howell (8213)
     account_id=5920 boxfolder_id=234  URL: b16f10
     account_id=5921 boxfolder_id=249  URL: b17f10
     account_id=5922 boxfolder_id=281  URL: b19f12
   Full Name: Emlen, Caleb (8214)
     account_id=5923 boxfolder_id=14  URL: b01f14
     account_id=5924 boxfolder_id=50  URL: b04f05


So I think I need to change my loop from:

while (my $r = $rs->next) {
  print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";

  foreach my $a ($r->account()) {
    print "  account_id=", $a->account_id();
    print " boxfolder_id=",$a->boxfolder_id()," ";
    my $t = $a->url();
    $t =~ m/value2=(\w+)\&/;
    print " URL: $1";
    $vol = $a->boxfolder->volume;
    $folder = $a->boxfolder->volume;
    $range = $a->boxfolder->range;
    print " V=$vol " if defined $vol;
    print " F=$folder " if defined $folder;
    print " R=$range " if defined $range;

    print "\n";
  }
}


To something more like this:

   my @r = $rs->all
   foreach my $r (@r) {
     print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";

     foreach my $a ($r->account()) {
       print "  account_id=", $a->account_id();
       print " boxfolder_id=",$a->boxfolder_id()," ";
       my $t = $a->url();
       $t =~ m/value2=(\w+)\&/;
       print " URL: $1";
       $vol = $a->boxfolder->volume;
       $folder = $a->boxfolder->volume;
       $range = $a->boxfolder->range;
       print " V=$vol " if defined $vol;
       print " F=$folder " if defined $folder;
       print " R=$range " if defined $range;

       print "\n";
     }
   }

And that does seem to do the trick.  Now to move onto updating my
Dancer web interface and see if I'm getting proper data out (or that I
even have proper data IN!) of the DB and displayed nicely for the end
users.

Thanks for the help, I feel a little dumb for not thinking to upgrade right off the bat.

Cheers,
John

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

Lasse Makholm


On Wed, Dec 17, 2014 at 7:39 PM, John Stoffel <[hidden email]> wrote:

Hi all,

With a bit of nudging, I had a head-smack moment and upgraded to the
latest version of DBIx::Class on CPAN, and it now looks like things
are working better for me, but I'm still getting some interesting
behavior.

Before I got errors, now I can do:

   > ../bin/dbic-test.pl Emlen
   DBIx::Class::ResultSet::_construct_results(): Unable to properly collapse has_many results in iterator mode due to order criteria - performed an eager cursor slurp underneath. Consider using ->all() instead at ../bin/dbic-test.pl line 20

Do you have proper non-nullable primary keys set up in all the relevant result classes?
 
   Full Name: Emlen & Howell (8213)
     account_id=5920 boxfolder_id=234  URL: b16f10
     account_id=5921 boxfolder_id=249  URL: b17f10
     account_id=5922 boxfolder_id=281  URL: b19f12
   Full Name: Emlen, Caleb (8214)
     account_id=5923 boxfolder_id=14  URL: b01f14
     account_id=5924 boxfolder_id=50  URL: b04f05


So I think I need to change my loop from:

while (my $r = $rs->next) {
  print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";

  foreach my $a ($r->account()) {
    print "  account_id=", $a->account_id();
    print " boxfolder_id=",$a->boxfolder_id()," ";
    my $t = $a->url();
    $t =~ m/value2=(\w+)\&/;
    print " URL: $1";
    $vol = $a->boxfolder->volume;
    $folder = $a->boxfolder->volume;
    $range = $a->boxfolder->range;
    print " V=$vol " if defined $vol;
    print " F=$folder " if defined $folder;
    print " R=$range " if defined $range;

    print "\n";
  }
}


To something more like this:

   my @r = $rs->all
   foreach my $r (@r) {

Be aware that this will cost you in terms of memory because you'll inflate all row objects once. Especially if you prefetch a lot... Depending on your specific result sets, this may not matter to you... But it's definitely something to be aware of...

We've seen lots of worker processes gobble up 50 - 100 MB of extra memory because of this, so we've been converting most uses of foreach my $row ($rs->all) { ... } to while (my $row = $rs->next) { ... }. YMMV.

/L
 
     print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";

     foreach my $a ($r->account()) {
       print "  account_id=", $a->account_id();
       print " boxfolder_id=",$a->boxfolder_id()," ";
       my $t = $a->url();
       $t =~ m/value2=(\w+)\&/;
       print " URL: $1";
       $vol = $a->boxfolder->volume;
       $folder = $a->boxfolder->volume;
       $range = $a->boxfolder->range;
       print " V=$vol " if defined $vol;
       print " F=$folder " if defined $folder;
       print " R=$range " if defined $range;

       print "\n";
     }
   }

And that does seem to do the trick.  Now to move onto updating my
Dancer web interface and see if I'm getting proper data out (or that I
even have proper data IN!) of the DB and displayed nicely for the end
users.

Thanks for the help, I feel a little dumb for not thinking to upgrade right off the bat.

Cheers,
John

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

John Stoffel
>>>>> "Lasse" == Lasse Makholm <[hidden email]> writes:

Lasse> On Wed, Dec 17, 2014 at 7:39 PM, John Stoffel <[hidden email]> wrote:

Lasse>     Hi all,
   
Lasse>     With a bit of nudging, I had a head-smack moment and upgraded to the
Lasse>     latest version of DBIx::Class on CPAN, and it now looks like things
Lasse>     are working better for me, but I'm still getting some interesting
Lasse>     behavior.
   
Lasse>     Before I got errors, now I can do:
   
Lasse>        > ../bin/dbic-test.pl Emlen
Lasse>        DBIx::Class::ResultSet::_construct_results(): Unable to properly collapse has_many results
Lasse>     in iterator mode due to order criteria - performed an eager cursor slurp underneath. Consider
Lasse>     using ->all() instead at ../bin/dbic-test.pl line 20

Lasse> Do you have proper non-nullable primary keys set up in all the
Lasse> relevant result classes?

Maybe... here's my three tables using mysql describe:

  mysql> describe names;
  +------------+--------------+------+-----+---------+----------------+
  | Field      | Type         | Null | Key | Default | Extra          |
  +------------+--------------+------+-----+---------+----------------+
  | name_id    | int(7)       | NO   | PRI | NULL    | auto_increment |
  | full_name  | varchar(50)  | NO   |     | NULL    |                |
  | last_name  | text         | YES  |     | NULL    |                |
  | first_name | text         | YES  |     | NULL    |                |
  | comments   | varchar(100) | YES  |     | NULL    |                |
  +------------+--------------+------+-----+---------+----------------+

  mysql> describe account;
  +----------------+---------------+------+-----+---------+----------------+
  | Field          | Type          | Null | Key | Default | Extra          |
  +----------------+---------------+------+-----+---------+----------------+
  | account_id     | int(7)        | NO   | PRI | NULL    | auto_increment |
  | account_number | varchar(10)   | NO   |     | NULL    |                |
  | boxfolder_id   | int(7)        | NO   |     | NULL    |                |
  | name_id        | int(7)        | YES  |     | NULL    |                |
  | url            | varchar(1028) | YES  |     | NULL    |                |
  | comments       | varchar(100)  | YES  |     | NULL    |                |
  +----------------+---------------+------+-----+---------+----------------+

  mysql> describe boxfolder;        
  +--------------+--------------+------+-----+---------+----------------+
  | Field        | Type         | Null | Key | Default | Extra          |
  +--------------+--------------+------+-----+---------+----------------+
  | boxfolder_id | int(7)       | NO   | PRI | NULL    | auto_increment |
  | volume       | varchar(20)  | NO   |     | NULL    |                |
  | box          | varchar(10)  | NO   |     | NULL    |                |
  | folder       | varchar(20)  | YES  |     | NULL    |                |
  | range        | text         | YES  |     | NULL    |                |
  | comments     | varchar(100) | YES  |     | NULL    |                |
  +--------------+--------------+------+-----+---------+----------------+

I suspect I *might* have a problem, since the Default column shows
NULL for each PRI key defined there.  But a bit of googling seems to
show that I'll be ok here.


Lasse>        Full Name: Emlen & Howell (8213)
Lasse>          account_id=5920 boxfolder_id=234  URL: b16f10
Lasse>          account_id=5921 boxfolder_id=249  URL: b17f10
Lasse>          account_id=5922 boxfolder_id=281  URL: b19f12
Lasse>        Full Name: Emlen, Caleb (8214)
Lasse>          account_id=5923 boxfolder_id=14  URL: b01f14
Lasse>          account_id=5924 boxfolder_id=50  URL: b04f05

Lasse>     So I think I need to change my loop from:
   
Lasse>     while (my $r = $rs->next) {
Lasse>       print "Full Name: ", $r->full_name, " (", $r->name_id, ")\n";
   
Lasse>       foreach my $a ($r->account()) {
Lasse>         print "  account_id=", $a->account_id();
Lasse>         print " boxfolder_id=",$a->boxfolder_id()," ";
Lasse>         my $t = $a->url();
Lasse>         $t =~ m/value2=(\w+)\&/;
Lasse>         print " URL: $1";
Lasse>         $vol = $a->boxfolder->volume;
Lasse>         $folder = $a->boxfolder->volume;
Lasse>         $range = $a->boxfolder->range;
Lasse>         print " V=$vol " if defined $vol;
Lasse>         print " F=$folder " if defined $folder;
Lasse>         print " R=$range " if defined $range;
   
Lasse>         print "\n";
Lasse>       }
Lasse>     }

Lasse>     To something more like this:
   
Lasse>        my @r = $rs->all
Lasse>        foreach my $r (@r) {

Lasse> Be aware that this will cost you in terms of memory because
Lasse> you'll inflate all row objects once.  Especially if you
Lasse> prefetch a lot... Depending on your specific result sets, this
Lasse> may not matter to you... But it's definitely something to be
Lasse> aware of...

Yeah, I think I ran into this.  For the web app side, I really want to
page the results anyway, which is the next step I'm working on, once I
confirm that I'm getting back good search results.

Lasse> We've seen lots of worker processes gobble up 50 - 100 MB of
Lasse> extra memory because of this, so we've been converting most
Lasse> uses of foreach my $row ($rs->all) { ... } to while (my $row =
Lasse> $rs-> next) { ... }. YMMV.

Well.. here's my code that I'm currently using in my Dancer app, which
is based on the Template Toolkit (another thing I'm still learning and
coming upto speed on!).

Now I *know* my query is stupid here.  That's because there's no
actual data in the names table beyond the full_name column and the
primary key.  LOL It's all a conversion from a spreadsheet into a DB.
I think I can get way with:

   full_name REGEXP '[[:<:]]David[[:>:]]'

since it does find more matches, which is a good thing.  

Anyway, my Dancer app looks a little like this:

   sub _perform_search {
     my ($query) = @_;
     my $schema = schema 'Carey';

     # search in Carey
     my @r = $schema->resultset('Name')->search({ -or => [
                                                          full_name => { like => "$query %" },
                                                          full_name => { like => "$query,%" },
                                                          full_name => { like => "% $query" },
                                                         ]
                                                },
                                                {
                                                 group_by => { -asc => "full_name" },
                                                 prefetch => { 'accounts' => 'boxfolder' },
                                                 rows => $limit,
                                                });
     return @r;
   }


And the template:

    <% FOREACH result IN results %>
      <li><% result.full_name.replace("((?i)$query)",'<b>$1</b>') %>
      <ul>
      <% FOREACH a IN result.accounts %>
        <% b = a.boxfolder %>
        <li><a href="<% a.url %>" target="_blank"> Volume <% a.boxfolder.volume %>, Box <% b.box %>\
, Folder <%
b.folder %>: <% b.range %></a><br> Account_id = <% a.account_id %>,
Boxfolder_id = <% b.boxfolder_id %>, URL = <% a.url %>
      <% END %>
      </ul>
    <% END %>


Thanks,
John

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...
Reply | Threaded
Open this post in threaded view
|

Re: prefetch across multiple tables

Peter Rabbitson-2
In reply to this post by John Stoffel
On 12/17/2014 07:39 PM, John Stoffel wrote:

>
> Hi all,
>
> With a bit of nudging, I had a head-smack moment and upgraded to the
> latest version of DBIx::Class on CPAN, and it now looks like things
> are working better for me, but I'm still getting some interesting
> behavior.
>
> Before I got errors, now I can do:
>
>     > ../bin/dbic-test.pl Emlen
>     DBIx::Class::ResultSet::_construct_results(): Unable to properly collapse has_many results in iterator mode due to order criteria - performed an eager cursor slurp underneath. Consider using ->all() instead at ../bin/dbic-test.pl line 20

Hi,

Perhaps the message needs to be improved (please suggest how) - but what
DBIC is telling you is essentially "I do not know where the current
left-most object+ all its right-side related data will end - therefore I
need to get *all* the data, so I can be sure I am giving you the
complete thing when you call ->next". In other words - you need to
order_by "leftmost part" for this message to go away.

Please consider helping me with a better error...

Cheers


_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@...