Massively refactor and sanify condition collapsing
authorPeter Rabbitson <ribasushi@cpan.org>
Sat, 17 May 2014 09:39:49 +0000 (11:39 +0200)
committerPeter Rabbitson <ribasushi@cpan.org>
Tue, 27 May 2014 17:22:07 +0000 (19:22 +0200)
commit8d005ad9929e4bf227919cb6374e2a9e9689324f
tree6e4672a1456f003123a71613685233529b7f4a2b
parent4f90e9f81ee3fc1ed1a145c15a1676674c0c54b2
Massively refactor and sanify condition collapsing

Wow... what a ride. This commit adds a faithful reimplementation of the
SQLA descend algorithm, but instead of SQL produces a reduced HASH that
nevertheless corresponds to the original query 1:1 (or so I *really* hope)

This is another one of these "I can try it with DQ but I don't even have
tests" stories, so once again opted to implement things the "dumb" way.

The benefits are quite substantial:
- Better deduplication of WHERE condition
- Consolidated functions - the vaguely similar logic in the current version
  of _collapse_cond replaces almost the entirety of:
    ::DBIHacks::_extract_fixed_condition_columns
    ::ResultSet::_collapse_cond
    ::ResultSet::_stack_cond
- Extra fixes for create/populate inheritance corner cases
- More predictable SQL condition generation order (which incidentally may
  prove problematic down the road with broken tests, but oh well, we'll
  burn when we get there)
- Ton of extra tests and corner cases

We even managed to fulfill a longstanding TODO, even though it is a *lucky*
side-effect and not a real fix. Making a note to address this later... sigh.

This work started from d8b7d9f58..337f3ee80, which while taking the right
direction had too many loose ends. ilmari++
Changes
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Storage/DBIHacks.pm
t/101populate_rs.t
t/prefetch/correlated.t
t/relationship/update_or_create_multi.t
t/resultset/as_query.t
t/resultset/bind_attr.t
t/resultset/update_delete.t
t/sqlmaker/dbihacks_internals.t [new file with mode: 0644]
t/sqlmaker/limit_dialects/torture.t