X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker%2FLimitDialects.pm;h=6bb7b9282f7964b74e300f5892a6f4b3a6e7192f;hb=7cec43565df63cdbf6320721c7d7c33cb6ce6e96;hp=8e85ac8473b5b4ce8f435bfa8c4898e6f4340e79;hpb=8b31f62e2b395fba451c32e0bbfecbd3e0f673f8;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker/LimitDialects.pm b/lib/DBIx/Class/SQLMaker/LimitDialects.pm index 8e85ac8..6bb7b92 100644 --- a/lib/DBIx/Class/SQLMaker/LimitDialects.pm +++ b/lib/DBIx/Class/SQLMaker/LimitDialects.pm @@ -259,11 +259,16 @@ sub _RowNum { # ordered by a unique set of columns, it is not safe to use the faster # method, and the slower BETWEEN query is used instead # - # FIXME - this is quite expensive, and doe snot perform caching of any sort + # FIXME - this is quite expensive, and does not perform caching of any sort # as soon as some of the DQ work becomes viable consider switching this # over - if ( __order_by_is_unique($rs_attrs) ) { - + if ( + $rs_attrs->{order_by} + and + $rs_attrs->{_rsroot_rsrc}->storage->_order_by_is_stable( + $rs_attrs->{from}, $rs_attrs->{order_by} + ) + ) { # if offset is 0 (first page) the we can skip a subquery if (! $offset) { push @{$self->{limit_bind}}, [ $self->__rows_bindtype => $rows ]; @@ -299,43 +304,6 @@ EOS } } -# determine if the supplied order_by contains a unique column (set) -sub __order_by_is_unique { - my $rs_attrs = shift; - my $rsrc = $rs_attrs->{_rsroot_rsrc}; - my $order_by = $rs_attrs->{order_by} - || return 0; - - my $storage = $rsrc->schema->storage; - - my @order_by_cols = map { $_->[0] } $storage->_extract_order_criteria($order_by) - or return 0; - - my $colinfo = - $storage->_resolve_column_info($rs_attrs->{from}, \@order_by_cols); - - my $sources = { - map {( "$_" => $_ )} map { $_->{-result_source} } values %$colinfo - }; - - my $supplied_order = { - map { $_ => 1 } - grep { exists $colinfo->{$_} and ! $colinfo->{$_}{is_nullable} } - @order_by_cols - }; - - return 0 unless keys %$supplied_order; - - for my $uks ( - map { values %$_ } map { +{ $_->unique_constraints } } values %$sources - ) { - return 1 - unless first { ! exists $supplied_order->{$_} } @$uks; - } - - return 0; -} - # used by _Top and _FetchFirst below sub _prep_for_skimming_limit { my ( $self, $sql, $rs_attrs ) = @_; @@ -682,7 +650,7 @@ $order_sql # # Returns mangled proto-sql, inner/outer strings of SQL QUOTED selectors # with aliases (to be used in whatever select statement), and an alias -# index hashref of QUOTED SEL => QUOTED ALIAS pairs (to maybe be used +# index hashref of QUOTED SEL => QUOTED ALIAS pairs (to maybe be used # for string-subst higher up). # If an order_by is supplied, the inner select needs to bring out columns # used in implicit (non-selected) orders, and the order condition itself