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=6469bb0eb36c9390d8dbe5feab731b43f66ac846;hpb=2b3fc4088d96e40ac23b3871b26d4a1faff17aed;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker/LimitDialects.pm b/lib/DBIx/Class/SQLMaker/LimitDialects.pm index 6469bb0..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 ) = @_;