DBIO

 view release on metacpan or  search on metacpan

lib/DBIO/Ordered.pm  view on Meta::CPAN

    if ($self->is_column_changed($_)) {
      $self->store_column($_, delete $self->{_column_data_in_storage}{$_});
      delete $self->{_dirty_columns}{$_};
    }
  }

  if ($self->_is_in_group($to_group)) {
    my $ret;
    if (defined $to_position) {
      $ret = $self->move_to($to_position);
    }
    return $ret || 0;
  }

  my $guard = $self->result_source->schema->txn_scope_guard;

  $self->move_last;

  $self->set_inflated_columns({ %$to_group, $position_column => undef });
  my $new_group_last_posval = $self->_last_sibling_posval;
  my $new_group_last_position = $self->_position_from_value($new_group_last_posval);

  if (not defined($to_position) or $to_position > $new_group_last_position) {
    $self->set_column(
      $position_column => $new_group_last_position
        ? $self->_next_position_value($new_group_last_posval)
        : $self->_initial_position_value
    );
  }
  else {
    my $bumped_pos_val = $self->_position_value($to_position);
    my @between = map { $self->_position_value($_) } ($to_position, $new_group_last_position);
    $self->_shift_siblings(1, @between);
    $self->set_column($position_column => $bumped_pos_val);
  }

  $self->_ordered_internal_update;
  $guard->commit;
  return 1;
}


sub insert {
  my $self = shift;
  my $position_column = $self->position_column;

  unless ($self->get_column($position_column)) {
    my $lsib_posval = $self->_last_sibling_posval;
    $self->set_column(
      $position_column => (defined $lsib_posval
        ? $self->_next_position_value($lsib_posval)
        : $self->_initial_position_value
      )
    );
  }

  return $self->next::method(@_);
}


sub update {
  my $self = shift;

  return $self->next::method(@_) if $self->result_source->schema->{_ORDERED_INTERNAL_UPDATE};

  my $upd = shift;
  $self->set_inflated_columns($upd) if $upd;

  my $position_column = $self->position_column;
  my @group_columns = $self->_grouping_columns;

  my $changed_ordering_cols = { map { $_ => $self->get_column($_) } grep { $self->is_column_changed($_) } ($position_column, @group_columns) };

  if (! keys %$changed_ordering_cols) {
    return $self->next::method(undef, @_);
  }
  elsif (grep { exists $changed_ordering_cols->{$_} } @group_columns) {
    $self->move_to_group(
      { $self->_grouping_clause },
      (exists $changed_ordering_cols->{$position_column}
        ? $changed_ordering_cols->{$position_column}
        : $self->_position
      ),
    );
  }
  else {
    $self->move_to($changed_ordering_cols->{$position_column});
  }

  return $self;
}


sub delete {
  my $self = shift;
  my $guard = $self->result_source->schema->txn_scope_guard;
  $self->move_last;
  $self->next::method(@_);
  $guard->commit;
  return $self;
}

sub _track_storage_value {
  my ($self, $col) = @_;
  return (
    $self->next::method($col)
      ||
    grep { $_ eq $col } ($self->position_column, $self->_grouping_columns)
  );
}


sub _position_from_value {
  my ($self, $val) = @_;
  return 0 unless defined $val;
  return $val;
}


sub _position_value {
  my ($self, $pos) = @_;



( run in 0.654 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )