name TEXT NOT NULL,
position INTEGER NOT NULL
);
+ # Optional: group_id INTEGER NOT NULL
In your Schema or DB class add Positioned to the top
of the component list.
package My::Employee;
__PACKAGE__->position_column('position');
+ __PACKAGE__->collection_column('group_id'); # optional
Thats it, now you can change the position of your objects.
use My::Employee;
my $employee = My::Employee->create({ name=>'Matt S. Trout' });
+ # If using collection_column:
+ my $employee = My::Employee->create({ name=>'Matt S. Trout', group_id=>1 });
my $rs = $employee->siblings();
my @siblings = $employee->siblings();
sub siblings {
my( $self ) = @_;
my $position_column = $self->position_column;
- my $rs = $self->search(
+ my $rs = $self->result_source->resultset->search(
{
$position_column => { '!=' => $self->get_column($position_column) },
$self->_collection_clause(),
my $sibling = $employee->first_sibling();
-Returns the first sibling object.
+Returns the first sibling object, or 0 if the first sibling
+is this sibliing.
=cut
sub first_sibling {
my( $self ) = @_;
- return ($self->search(
- { $self->_collection_clause() },
- { rows=>1, order_by => $self->position_column },
+ return 0 if ($self->get_column($self->position_column())==1);
+ return ($self->result_source->resultset->search(
+ {
+ $self->position_column => 1,
+ $self->_collection_clause(),
+ },
)->all())[0];
}
my $sibling = $employee->last_sibling();
-Return the last sibling.
+Return the last sibling, or 0 if the last sibling is this
+sibling.
=cut
sub last_sibling {
my( $self ) = @_;
- return ($self->search(
- { $self->_collection_clause() },
- { rows=>1, order_by => $self->position_column.' DESC' },
+ my $count = $self->result_source->resultset->search({$self->_collection_clause()})->count();
+ return 0 if ($self->get_column($self->position_column())==$count);
+ return ($self->result_source->resultset->search(
+ {
+ $self->position_column => $count,
+ $self->_collection_clause(),
+ },
)->all())[0];
}
sub previous_sibling {
my( $self ) = @_;
my $position_column = $self->position_column;
- return ($self->search(
+ my $position = $self->get_column( $position_column );
+ return 0 if ($position==1);
+ return ($self->result_source->resultset->search(
{
- $position_column => { '<' => $self->get_column($position_column) },
+ $position_column => $position - 1,
$self->_collection_clause(),
- },
- { rows=>1, order_by => $position_column.' DESC' },
+ }
)->all())[0];
}
sub next_sibling {
my( $self ) = @_;
my $position_column = $self->position_column;
+ my $position = $self->get_column( $position_column );
+ my $count = $self->result_source->resultset->search({$self->_collection_clause()})->count();
+ return 0 if ($position==$count);
return ($self->result_source->resultset->search(
{
- $position_column => { '>' => $self->get_column($position_column) },
+ $position_column => $position + 1,
$self->_collection_clause(),
},
- { rows=>1, order_by => $position_column },
)->all())[0];
}
my $position_column = $self->position_column;
$self->set_column( $position_column => $self->result_source->resultset->search( {$self->_collection_clause()} )->count()+1 )
if (!$self->get_column($position_column));
- $self->next::method( @_ );
+ return $self->next::method( @_ );
}
=head2 delete
sub delete {
my $self = shift;
$self->move_last;
- $self->next::method( @_ );
+ return $self->next::method( @_ );
}
=head1 PRIVATE METHODS
=cut
sub _collection_clause {
- my $self = shift;
+ my( $self ) = @_;
if ($self->collection_column()) {
return ( $self->collection_column() => $self->get_column($self->collection_column()) );
}