Fix _resolve_collapse to always consider the entire chain of parent ids
authorPeter Rabbitson <ribasushi@cpan.org>
Mon, 28 Jan 2013 11:20:45 +0000 (12:20 +0100)
committerPeter Rabbitson <ribasushi@cpan.org>
Thu, 14 Feb 2013 04:58:24 +0000 (05:58 +0100)
commit3faac878c99ac8708c0f1b6655d8e06eca06a9f3
treeb322157f60fcc2a1e85f552f976aeee4002424db
parent82f0e0aa75e07eeb3395c5dd2854073708450b96
Fix _resolve_collapse to always consider the entire chain of parent ids

Instead of relying on a "local column based" resolution for a particular
node, always add all the "collapsers" of the left-side "parents".

In the process cleanup the return of _resolve_collapse, and make it more
generic (after all we are hoping to CPAN the collapser generator some
day).

The change above  solves the following problem: think of an artist with
3 CDs A, B & C:

$cd_rs->search(
  [
    { 'me.title' => 'A', 'cds.title' => { '!=' => 'B' } },
    { 'me.title' => { '!=', => 'A' }, 'cds.title' => 'B' },
  ],
  { prefetch => { artist => 'cds' } },
);

Since an artist is fully defined by its PK (which we already fetch),
an all() run will keep accumulating all 3 CDs under the same already
known hash, representing said artist, because we do not create two
distinct pigeon-hole-hashes for "artist of A" and "artist of non-A".
lib/DBIx/Class/ResultSource/RowParser.pm
t/resultset/rowparser_internals.t