[Bast-commits] r8336 - in DBIx-Class/0.08/branches/prefetch_pager:
lib/DBIx/Class lib/DBIx/Class/Storage t/count t/prefetch t/search
ribasushi at dev.catalyst.perl.org
ribasushi at dev.catalyst.perl.org
Sun Jan 17 12:44:00 GMT 2010
Author: ribasushi
Date: 2010-01-17 12:44:00 +0000 (Sun, 17 Jan 2010)
New Revision: 8336
Modified:
DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSet.pm
DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSource.pm
DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBI.pm
DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBIHacks.pm
DBIx-Class/0.08/branches/prefetch_pager/t/count/count_rs.t
DBIx-Class/0.08/branches/prefetch_pager/t/count/prefetch.t
DBIx-Class/0.08/branches/prefetch_pager/t/prefetch/grouped.t
DBIx-Class/0.08/branches/prefetch_pager/t/search/preserve_original_rs.t
DBIx-Class/0.08/branches/prefetch_pager/t/search/subquery.t
Log:
Getting warmer
Modified: DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSet.pm
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSet.pm 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSet.pm 2010-01-17 12:44:00 UTC (rev 8336)
@@ -1253,16 +1253,15 @@
# extra selectors do not go in the subquery and there is no point of ordering it
delete $sub_attrs->{$_} for qw/collapse select _prefetch_select as order_by/;
- # if we prefetch, we group_by primary keys only as this is what we would get out
- # of the rs via ->next/->all. We DO WANT to clobber old group_by regardless
- if ( keys %{$attrs->{collapse}} ) {
+ # if we multi-prefetch we group_by primary keys only as this is what we would
+ # get out of the rs via ->next/->all. We *DO WANT* to clobber old group_by regardless
+ if ( keys %{$attrs->{collapse}} ) {
$sub_attrs->{group_by} = [ map { "$attrs->{alias}.$_" } ($rsrc->primary_columns) ]
}
$sub_attrs->{select} = $rsrc->storage->_subq_count_select ($rsrc, $sub_attrs);
# this is so that the query can be simplified e.g.
- # * non-limiting joins can be pruned
# * ordering can be thrown away in things like Top limit
$sub_attrs->{-for_count_only} = 1;
@@ -2927,7 +2926,7 @@
my $jpath = $j->[0]{-join_path};
my $p = $paths;
- $p = $p->{$_} ||= {} for @{$jpath}[$cur_depth/2 .. $#$jpath]; #only even depths are actual jpath boundaries
+ $p = $p->{$_} ||= {} for @{$jpath}[ ($cur_depth/2) .. $#$jpath]; #only even depths are actual jpath boundaries
push @{$p->{-join_aliases} }, $j->[0]{-alias};
}
Modified: DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSource.pm
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSource.pm 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/ResultSource.pm 2010-01-17 12:44:00 UTC (rev 8336)
@@ -1262,6 +1262,7 @@
: $rel_info->{attrs}{join_type}
,
-join_path => [@$jpath, $join],
+ -is_single => (List::Util::first { $rel_info->{attrs}{accessor} eq $_ } (qw/single filter/) ),
-alias => $as,
-relation_chain_depth => $seen->{-relation_chain_depth} || 0,
},
Modified: DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBI.pm
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBI.pm 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBI.pm 2010-01-17 12:44:00 UTC (rev 8336)
@@ -1740,7 +1740,7 @@
select => $select,
from => $ident,
where => $where,
- $rs_alias
+ $rs_alias && $alias2source->{$rs_alias}
? ( _source_handle => $alias2source->{$rs_alias}->handle )
: ()
,
@@ -1858,6 +1858,9 @@
push @limit, $attrs->{rows}, $attrs->{offset};
}
+ # try to simplify the joinmap further (prune unreferenced type-single joins)
+ $ident = $self->_prune_unused_joins ($ident, $select, $where, $attrs);
+
###
# This would be the point to deflate anything found in $where
# (and leave $attrs->{bind} intact). Problem is - inflators historically
Modified: DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBIHacks.pm
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBIHacks.pm 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/lib/DBIx/Class/Storage/DBIHacks.pm 2010-01-17 12:44:00 UTC (rev 8336)
@@ -17,9 +17,7 @@
#
# This code will remove non-selecting/non-restricting joins from
-# {from} specs, aiding the RDBMS query optimizer. It will leave any
-# unused type-multi joins, if the amount of returned rows is
-# important (i.e. count without collapse)
+# {from} specs, aiding the RDBMS query optimizer.
#
sub _prune_unused_joins {
my $self = shift;
@@ -29,13 +27,17 @@
return $from; # only standard {from} specs are supported
}
- my $aliastypes = $self->_resolve_aliases_from_select_args($from, @_);
+ my $aliastypes = $self->_resolve_aliastypes_from_select_args($from, @_);
my @newfrom = $from->[0]; # FROM head is always present
my %need_joins = (map { %{$_||{}} } (values %$aliastypes) );
for my $j (@{$from}[1..$#$from]) {
- push @newfrom, $j if $need_joins{$j->[0]{-alias}};
+ push @newfrom, $j if (
+ ! $j->[0]{-alias} # legacy crap
+ ||
+ $need_joins{$j->[0]{-alias}}
+ );
}
return \@newfrom;
@@ -92,20 +94,14 @@
# construct the inner $from for the subquery
my $inner_from = $self->_prune_unused_joins ($from, $inner_select, $where, $inner_attrs);
- # if a multi-type join was needed in the subquery ("multi" is indicated by
- # presence in {collapse}) - add a group_by to simulate the collapse in the subq
- unless ($inner_attrs->{group_by}) {
- for my $alias (map { $_->[0]{-alias} } (@{$inner_from}[1 .. $#$inner_from]) ) {
+ # if a multi-type join was needed in the subquery - add a group_by to simulate the
+ # collapse in the subq
+ $inner_attrs->{group_by} ||= $inner_select
+ if List::Util::first
+ { ! $_->[0]{-is_single} }
+ (@{$inner_from}[1 .. $#$inner_from])
+ ;
- # the dot comes from some weirdness in collapse
- # remove after the rewrite
- if ($attrs->{collapse}{".$alias"}) {
- $inner_attrs->{group_by} ||= $inner_select;
- last;
- }
- }
- }
-
# generate the subquery
my $subq = $self->_select_args_to_query (
$inner_from,
@@ -153,7 +149,7 @@
# scan the from spec against different attributes, and see which joins are needed
# in what role
my $outer_aliastypes =
- $self->_resolve_aliases_from_select_args( $from, $outer_select, $where, $outer_attrs );
+ $self->_resolve_aliastypes_from_select_args( $from, $outer_select, $where, $outer_attrs );
# see what's left - throw away if not selecting/restricting
# also throw in a group_by if restricting to guard against
@@ -167,22 +163,7 @@
}
elsif ($outer_aliastypes->{restrict}{$alias}) {
push @outer_from, $j;
-
- # FIXME - this should be obviated by SQLA2, as I'll be able to
- # have restrict_inner and restrict_outer... or something to that
- # effect... I think...
-
- # FIXME2 - I can't find a clean way to determine if a particular join
- # is a multi - instead I am just treating everything as a potential
- # explosive join (ribasushi)
- #
- # if (my $handle = $j->[0]{-source_handle}) {
- # my $rsrc = $handle->resolve;
- # ... need to bail out of the following if this is not a multi,
- # as it will be much easier on the db ...
-
- $outer_attrs->{group_by} ||= $outer_select;
- # }
+ $outer_attrs->{group_by} ||= $outer_select unless $j->[0]{-is_single};
}
}
@@ -208,7 +189,7 @@
# happen is for it to fail due to an unqualified column, which in
# turn will result in a vocal exception. Qualifying the column will
# invariably solve the problem.
-sub _resolve_aliases_from_select_args {
+sub _resolve_aliastypes_from_select_args {
my ( $self, $from, $select, $where, $attrs ) = @_;
$self->throw_exception ('Unable to analyze custom {from}')
@@ -219,10 +200,15 @@
# see what aliases are there to work with
my $alias_list;
- my @from = @$from; # if I don't copy weird shit happens
- for my $j (@from) {
+ for (@$from) {
+ my $j = $_;
$j = $j->[0] if ref $j eq 'ARRAY';
- $alias_list->{$j->{-alias}} = $j;
+ my $al = $j->{-alias}
+ or next;
+
+ $alias_list->{$al} = $j;
+ $aliases_by_type->{multiplying}{$al} = 1
+ unless $j->{-is_single};
}
# set up a botched SQLA
Modified: DBIx-Class/0.08/branches/prefetch_pager/t/count/count_rs.t
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/t/count/count_rs.t 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/t/count/count_rs.t 2010-01-17 12:44:00 UTC (rev 8336)
@@ -35,7 +35,6 @@
FROM cd me
JOIN track tracks ON tracks.cd = me.cdid
JOIN cd disc ON disc.cdid = tracks.cd
- LEFT JOIN lyrics lyrics ON lyrics.track_id = tracks.trackid
WHERE ( ( position = ? OR position = ? ) )
',
[ qw/'1' '2'/ ],
@@ -53,7 +52,6 @@
FROM cd me
JOIN track tracks ON tracks.cd = me.cdid
JOIN cd disc ON disc.cdid = tracks.cd
- LEFT JOIN lyrics lyrics ON lyrics.track_id = tracks.trackid
WHERE ( ( position = ? OR position = ? ) )
LIMIT 3 OFFSET 8
) count_subq
Modified: DBIx-Class/0.08/branches/prefetch_pager/t/count/prefetch.t
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/t/count/prefetch.t 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/t/count/prefetch.t 2010-01-17 12:44:00 UTC (rev 8336)
@@ -72,7 +72,7 @@
{
my $rs = $schema->resultset("CD")
->search_related('tracks',
- { position => [1,2] },
+ { position => [1,2], 'lyrics.lyric_id' => undef },
{ prefetch => [qw/disc lyrics/] },
);
is ($rs->all, 10, 'Correct number of objects');
@@ -88,7 +88,7 @@
JOIN track tracks ON tracks.cd = me.cdid
JOIN cd disc ON disc.cdid = tracks.cd
LEFT JOIN lyrics lyrics ON lyrics.track_id = tracks.trackid
- WHERE position = ? OR position = ?
+ WHERE lyrics.lyric_id IS NULL AND (position = ? OR position = ?)
)',
[ map { [ position => $_ ] } (1, 2) ],
);
Modified: DBIx-Class/0.08/branches/prefetch_pager/t/prefetch/grouped.t
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/t/prefetch/grouped.t 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/t/prefetch/grouped.t 2010-01-17 12:44:00 UTC (rev 8336)
@@ -149,7 +149,6 @@
SELECT me.cdid
FROM cd me
LEFT JOIN track tracks ON tracks.cd = me.cdid
- LEFT JOIN liner_notes liner_notes ON liner_notes.liner_id = me.cdid
WHERE ( me.cdid IS NOT NULL )
GROUP BY me.cdid
LIMIT 2
Modified: DBIx-Class/0.08/branches/prefetch_pager/t/search/preserve_original_rs.t
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/t/search/preserve_original_rs.t 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/t/search/preserve_original_rs.t 2010-01-17 12:44:00 UTC (rev 8336)
@@ -89,4 +89,3 @@
is_same_sql_bind ($rs->as_query, $q{$s}{query}, "$s resultset unmodified (as_query matches)" );
}
-
Modified: DBIx-Class/0.08/branches/prefetch_pager/t/search/subquery.t
===================================================================
--- DBIx-Class/0.08/branches/prefetch_pager/t/search/subquery.t 2010-01-17 10:33:55 UTC (rev 8335)
+++ DBIx-Class/0.08/branches/prefetch_pager/t/search/subquery.t 2010-01-17 12:44:00 UTC (rev 8336)
@@ -76,9 +76,13 @@
{
rs => $art_rs,
attrs => {
- from => [ { 'me' => 'artist' },
- [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
- { 'me.artistid' => 'cds_artist' } ] ]
+ from => [
+ { 'me' => 'artist' },
+ [
+ { 'cds' => $cdrs->search({}, { 'select' => [\'me.artist as cds_artist' ]})->as_query },
+ { 'me.artistid' => 'cds_artist' }
+ ]
+ ]
},
sqlbind => \[
"( SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist )"
More information about the Bast-commits
mailing list