Remove the "row-by-row shift" Ordered.pm pessimization
Peter Rabbitson [Fri, 2 Mar 2012 10:41:42 +0000 (11:41 +0100)]
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

Changes
lib/DBIx/Class/Ordered.pm

diff --git a/Changes b/Changes
index 7b3d781..a6b9cf7 100644 (file)
--- 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
index 0b4384b..05da117 100644 (file)
@@ -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