TT#37375 Allow additional "order by" columns specifications

Change-Id: Id37c305b2abeba87bd5ba25f97399888411eeab3
changes/31/21631/9
Irina Peshinskaya 8 years ago
parent 239555fc58
commit cc6cf3b067

@ -156,18 +156,22 @@ sub GET : Allow {
my ($form) = $full_mod->get_form($c);
my $sorting_cols = [];
if (my $order_by_cols = eval { $full_mod->order_by_cols(); }) {
$sorting_cols = [ sort keys %$order_by_cols ];
} else {
my ($explicit_order_cols, $explicit_order_cols_params);
if ($full_mod->can('order_by_cols')) {
($explicit_order_cols,$explicit_order_cols_params) = $full_mod->order_by_cols();
$sorting_cols = [ sort keys %$explicit_order_cols ];
$explicit_order_cols_params //= {};
}
if (!$explicit_order_cols || $explicit_order_cols_params->{columns_are_additional}) {
my $item_rs;
try {
$item_rs = $full_mod->item_rs($c, "");
}
if ($item_rs) {
if(ref $item_rs eq "ARRAY") {
$sorting_cols = [map { $_->{name} } @{ $item_rs }];
$sorting_cols = [sort (@$sorting_cols, map { $_->{name} } @{ $item_rs })];
} else {
$sorting_cols = [$item_rs->result_source->columns];
$sorting_cols = [sort (@$sorting_cols, $item_rs->result_source->columns)];
}
}
}

@ -263,6 +263,17 @@ sub query_params {
return $params;
}
sub order_by_cols {
return
{ create_timestamp => 'provisioning_voip_subscriber.create_timestamp' },
{
columns_are_additional => 1,
create_timestamp => {
join => 'provisioning_voip_subscriber',
},
};
}
sub GET :Allow {
my ($self, $c) = @_;
my $page = $c->request->params->{page} // 1;

@ -701,19 +701,31 @@ sub paginate_order_collection_rs {
rows => $rows,
});
$self->define_collection_infinite_pager($c, undef, $item_rs, $rows, $no_count);
if ($order_by && ((my $explicit = ($self->can('order_by_cols') && exists $self->order_by_cols()->{$order_by})) or $item_rs->result_source->has_column($order_by))) {
my $col = ($explicit ? $self->order_by_cols()->{$order_by} : $item_rs->current_source_alias . '.' . $order_by);
if (lc($direction) eq 'desc') {
$item_rs = $item_rs->search(undef, {
order_by => {-desc => $col},
});
$c->log->debug("ordering by $col DESC");
} else {
$item_rs = $item_rs->search(undef, {
order_by => "$col",
});
$c->log->debug("ordering by $col");
if ($order_by) {
my $explicit_order_col_spec;
if ($self->can('order_by_cols')) {
my($explicit_order_cols,$explicit_order_cols_params) = $self->order_by_cols();
$explicit_order_col_spec = $explicit_order_cols->{$order_by};
$explicit_order_cols_params //= {};
if ( exists $explicit_order_cols_params->{$order_by}->{join} ) {
$item_rs = $item_rs->search(undef, {
join => $explicit_order_cols_params->{$order_by}->{join},
});
}
}
if ($explicit_order_col_spec or $item_rs->result_source->has_column($order_by)) {
my $col = $explicit_order_col_spec || $item_rs->current_source_alias . '.' . $order_by;
if (lc($direction) eq 'desc') {
$item_rs = $item_rs->search(undef, {
order_by => {-desc => $col},
});
$c->log->debug("ordering by $col DESC");
} else {
$item_rs = $item_rs->search(undef, {
order_by => "$col",
});
$c->log->debug("ordering by $col");
}
}
}
my $result_class_after = $item_rs->result_class();

Loading…
Cancel
Save