Bug 24615: Make object.search helper also order by embedded columns
authorAgustin Moyano <agustinmoyano@theke.io>
Sat, 8 Feb 2020 02:54:14 +0000 (23:54 -0300)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Tue, 3 Mar 2020 09:17:43 +0000 (09:17 +0000)
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>

Koha/REST/Plugin/Query.pm
t/db_dependent/Koha/REST/Plugin/Objects.t

index 9f6263e..46296e6 100644 (file)
@@ -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;
     }
 
index d92333e..1d726ce 100644 (file)
@@ -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;
-};
\ No newline at end of file
+};
+
+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;
+}
\ No newline at end of file