Browse Source

Bug 24615: Make object.search helper also order by embedded columns

With this patch REST API request can order results by embedded columns.

Full path to the column must be given for it to work.
For example: If you are on biblio endpoint and you want to order by holding patron's card number you could

> GET /biblio/1?_order_by=item.holds.cardnumber HTTP/1.1
> x-koha-embed: item.holds

To test:
1. apply this patch
2. prove t/db_dependent/Koha/REST/Plugin/Objects.t

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
20.05.x
Agustin Moyano 3 years ago
committed by Martin Renvoize
parent
commit
ef1d49efb5
Signed by: martin.renvoize GPG Key ID: 422B469130441A0F
  1. 2
      Koha/REST/Plugin/Query.pm
  2. 29
      t/db_dependent/Koha/REST/Plugin/Objects.t

2
Koha/REST/Plugin/Query.pm

@ -277,7 +277,7 @@ sub _build_order_atom {
my $param = $string;
$param =~ s/^(\+|\-|\s)//;
if ( $result_set ) {
my $model_param = $result_set->from_api_mapping->{$param};
my $model_param = _from_api_param($param, $result_set);
$param = $model_param if defined $model_param;
}

29
t/db_dependent/Koha/REST/Plugin/Objects.t

@ -72,12 +72,12 @@ get '/biblios' => sub {
}
});
my $biblios = $c->objects->search($biblios_set);
$c->render( status => 200, json => {count => scalar(@$biblios)} );
$c->render( status => 200, json => {count => scalar(@$biblios), biblios => $biblios} );
};
# The tests
use Test::More tests => 8;
use Test::More tests => 9;
use Test::Mojo;
use t::lib::TestBuilder;
@ -327,8 +327,8 @@ subtest 'object.search helper with all query methods' => sub {
$schema->storage->txn_begin;
my $patron1 = $builder->build_object( { class => "Koha::Patrons" , value => {cardnumber => 'cardpatron1', firstname=>'patron1'} } );
my $patron2 = $builder->build_object( { class => "Koha::Patrons" , value => {cardnumber => 'cardpatron2', firstname=>'patron2'} } );
my $patron1 = $builder->build_object( { class => "Koha::Patrons" , value => {firstname=>'patron1'} } );
my $patron2 = $builder->build_object( { class => "Koha::Patrons" , value => {firstname=>'patron2'} } );
my $biblio1 = $builder->build_sample_biblio;
my $biblio2 = $builder->build_sample_biblio;
my $biblio3 = $builder->build_sample_biblio;
@ -346,4 +346,21 @@ subtest 'object.search helper with all query methods' => sub {
->json_is('/count' => 0, 'there shouldn\'t be biblios where suggester has patron1 fistname and patron2 id');
$schema->storage->txn_rollback;
};
};
subtest 'object.search helper order by embedded columns' => sub {
plan tests => 3;
my $patron1 = $builder->build_object( { class => "Koha::Patrons" , value => {firstname=>'patron1'} } );
my $patron2 = $builder->build_object( { class => "Koha::Patrons" , value => {firstname=>'patron2'} } );
my $biblio1 = $builder->build_sample_biblio;
my $biblio2 = $builder->build_sample_biblio;
my $suggestion1 = $builder->build_object( { class => "Koha::Suggestions", value => { suggestedby => $patron1->borrowernumber, biblionumber => $biblio1->biblionumber} } );
my $suggestion2 = $builder->build_object( { class => "Koha::Suggestions", value => { suggestedby => $patron2->borrowernumber, biblionumber => $biblio2->biblionumber} } );
$t->get_ok('/biblios?_order_by=-suggestions.suggester.firstname' => json => [{"me.biblio_id" => $biblio1->biblionumber}, {"me.biblio_id" => $biblio2->biblionumber}])
->json_is('/biblios/0/biblio_id' => $biblio2->biblionumber, 'Biblio 2 should be first')
->json_is('/biblios/1/biblio_id' => $biblio1->biblionumber, 'Biblio 1 should be second');
$schema->storage->txn_begin;
}
Loading…
Cancel
Save