X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FOrdered.pm;h=5e40dc0c25c5333f50695d114f4798b21f4d2cae;hb=fcf32d045;hp=0b4384ba5475dda62abe77dd2f84e491152dad87;hpb=8273e845426f0187b4ad6c4a1b42286fa09a648f;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Ordered.pm b/lib/DBIx/Class/Ordered.pm index 0b4384b..5e40dc0 100644 --- a/lib/DBIx/Class/Ordered.pm +++ b/lib/DBIx/Class/Ordered.pm @@ -275,7 +275,7 @@ sub last_sibling { return defined $lsib ? $lsib : 0; } -# an optimized method to get the last sibling position value without inflating a row object +# an optimized method to get the last sibling position value without inflating a result object sub _last_sibling_posval { my $self = shift; my $position_column = $self->position_column; @@ -581,19 +581,11 @@ sub delete { $self->move_last; - my @res; - if (not defined wantarray) { - $self->next::method( @_ ); - } - elsif (wantarray) { - @res = $self->next::method( @_ ); - } - else { - $res[0] = $self->next::method( @_ ); - } + $self->next::method( @_ ); $guard->commit; - return wantarray ? @res : $res[0]; + + return $self; } # add the current position/group to the things we track old values for @@ -715,30 +707,22 @@ sub _shift_siblings { 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) - + # some databases (sqlite, pg, perhaps others) are dumb and can not do a + # blanket increment/decrement without violating a unique constraint. + # 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. 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 $rs = $rsrc->resultset; my @all_data = $cursor->all; while (my $data = shift @all_data) { @@ -756,28 +740,16 @@ sub _shift_siblings { } } -=head1 PRIVATE METHODS - -These methods are used internally. You should never have the -need to use them. - -=head2 _group_rs -This method returns a resultset containing all members of the row -group (including the row itself). - -=cut +# This method returns a resultset containing all members of the row +# group (including the row itself). sub _group_rs { my $self = shift; return $self->result_source->resultset->search({$self->_grouping_clause()}); } -=head2 _siblings - -Returns an unordered resultset of all objects in the same group -excluding the object you called this method on. - -=cut +# Returns an unordered resultset of all objects in the same group +# excluding the object you called this method on. sub _siblings { my $self = shift; my $position_column = $self->position_column; @@ -790,38 +762,24 @@ sub _siblings { ; } -=head2 _position - - my $num_pos = $item->_position; - -Returns the B of the current object, with the -first object being at position 1, its sibling at position 2 and so on. - -=cut +# Returns the B of the current object, with the +# first object being at position 1, its sibling at position 2 and so on. sub _position { my $self = shift; return $self->_position_from_value ($self->get_column ($self->position_column) ); } -=head2 _grouping_clause - -This method returns one or more name=>value pairs for limiting a search -by the grouping column(s). If the grouping column is not defined then -this will return an empty list. - -=cut +# This method returns one or more name=>value pairs for limiting a search +# by the grouping column(s). If the grouping column is not defined then +# this will return an empty list. sub _grouping_clause { my( $self ) = @_; return map { $_ => $self->get_column($_) } $self->_grouping_columns(); } -=head2 _get_grouping_columns - -Returns a list of the column names used for grouping, regardless of whether -they were specified as an arrayref or a single string, and returns () -if there is no grouping. - -=cut +# Returns a list of the column names used for grouping, regardless of whether +# they were specified as an arrayref or a single string, and returns () +# if there is no grouping. sub _grouping_columns { my( $self ) = @_; my $col = $self->grouping_column(); @@ -834,13 +792,7 @@ sub _grouping_columns { } } -=head2 _is_in_group - - $item->_is_in_group( {user => 'fred', list => 'work'} ) - -Returns true if the object is in the group represented by hashref $other - -=cut +# Returns true if the object is in the group represented by hashref $other sub _is_in_group { my ($self, $other) = @_; my $current = {$self->_grouping_clause}; @@ -858,23 +810,18 @@ sub _is_in_group { return 1; } -=head2 _ordered_internal_update - -This is a short-circuited method, that is used internally by this -module to update positioning values in isolation (i.e. without -triggering any of the positioning integrity code). - -Some day you might get confronted by datasets that have ambiguous -positioning data (e.g. duplicate position values within the same group, -in a table without unique constraints). When manually fixing such data -keep in mind that you can not invoke L like -you normally would, as it will get confused by the wrong data before -having a chance to update the ill-defined row. If you really know what -you are doing use this method which bypasses any hooks introduced by -this module. - -=cut - +# This is a short-circuited method, that is used internally by this +# module to update positioning values in isolation (i.e. without +# triggering any of the positioning integrity code). +# +# Some day you might get confronted by datasets that have ambiguous +# positioning data (e.g. duplicate position values within the same group, +# in a table without unique constraints). When manually fixing such data +# keep in mind that you can not invoke L like +# you normally would, as it will get confused by the wrong data before +# having a chance to update the ill-defined row. If you really know what +# you are doing use this method which bypasses any hooks introduced by +# this module. sub _ordered_internal_update { my $self = shift; local $self->result_source->schema->{_ORDERED_INTERNAL_UPDATE} = 1;