From: Peter Rabbitson Date: Fri, 2 Mar 2012 10:41:42 +0000 (+0100) Subject: Remove the "row-by-row shift" Ordered.pm pessimization X-Git-Tag: v0.08197~107 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=commitdiff_plain;h=5e6fde33e5a4 Remove the "row-by-row shift" Ordered.pm pessimization The idea this is necessary was born when working with buggy old 1.1x SQLite versions back in 2008. This no longer seems to be necessary, but if I am wrong we can always bring it back with an actual storage capability flag --- diff --git a/Changes b/Changes index 7b3d781..a6b9cf7 100644 --- a/Changes +++ b/Changes @@ -14,6 +14,8 @@ Revision history for DBIx::Class - Fix corner case of forked children disconnecting the parents DBI handle - Fix leakage of $schema on in-memory new_related() calls + - Remove useless vestigial pessimization in Ordered.pm for cases + when the position column is part of a unique constraint * Misc - Codebase is now trailing-whitespace-free diff --git a/lib/DBIx/Class/Ordered.pm b/lib/DBIx/Class/Ordered.pm index 0b4384b..05da117 100644 --- a/lib/DBIx/Class/Ordered.pm +++ b/lib/DBIx/Class/Ordered.pm @@ -713,47 +713,9 @@ sub _shift_siblings { $ord = 'desc'; } - my $shift_rs = $self->_group_rs-> search ({ $position_column => { -between => \@between } }); - - # some databases (sqlite) are dumb and can not do a blanket - # increment/decrement. So what we do here is check if the - # position column is part of a unique constraint, and do a - # one-by-one update if this is the case - # Also we do a one-by-one if the position is part of the PK - # since once we update a column via scalarref we lose the - # ability to retrieve this column back (we do not know the - # id anymore) - - my $rsrc = $self->result_source; - - # set in case there are more cascades combined with $rs->update => $rs_update_all overrides - local $rsrc->schema->{_ORDERED_INTERNAL_UPDATE} = 1; - my @pcols = $rsrc->primary_columns; - my $pos_is_pk = first { $_ eq $position_column } @pcols; - if ( - $pos_is_pk - or - first { $_ eq $position_column } ( map { @$_ } (values %{{ $rsrc->unique_constraints }} ) ) - ) { - my $cursor = $shift_rs->search ( - {}, { order_by => { "-$ord", $position_column }, select => [$position_column, @pcols] } - )->cursor; - my $rs = $self->result_source->resultset; - - my @all_data = $cursor->all; - while (my $data = shift @all_data) { - my $pos = shift @$data; - my $cond; - for my $i (0.. $#pcols) { - $cond->{$pcols[$i]} = $data->[$i]; - } - - $rs->find($cond)->update ({ $position_column => $pos + ( ($op eq '+') ? 1 : -1 ) }); - } - } - else { - $shift_rs->update ({ $position_column => \ "$position_column $op 1" } ); - } + $self->_group_rs + ->search ({ $position_column => { -between => \@between } }) + ->update ({ $position_column => \ "$position_column $op 1" } ); } =head1 PRIVATE METHODS