[Dbix-class] Prefetch + rows

Rob Kinyon rob.kinyon at gmail.com
Sun Mar 1 03:45:45 GMT 2009


All -

    I think I have a solution to the TODO tests in t/98rows_prefetch.t
and I think this may solve other issues, as well.

    The problem: Non-data aspects to the query (such as rows) are
affecting the pull of prefetch'ed data.

    The solution: Put the main query in a subquery. So, if we had

    $foo_rs->search({
        col1 => 3
    }, {
        rows => 2
        prefetch => 'bar',
    });

    That currently translates (in MySQL) to "SELECT me.*, bar.* FROM
foo me JOIN bar USING (...) WHERE me.col1 = 3 LIMIT 2". If there are 3
rows in bar to each row in foo, we still only get the first two rows.
The query -should- be "SELECT me.*, bar.* FROM ( SELECT me.* FROM foo
me WHERE col1 = 3 LIMIT 2 ) me JOIN bar USING (...)". That way, the
limit is against the main query and the prefetch happens outside it.
Thus, the right number of rows are pulled back.

    I think that transformation will work for all prefetches and I'm
working on applying that fix in the prefetch branch. Does anyone see
anything wrong with that?

Rob



More information about the DBIx-Class mailing list