From: Lebbeous Fogle-Weekley Date: Thu, 13 Dec 2012 23:02:07 +0000 (-0500) Subject: custom best-hold sort order: start of middle layer work X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=a6010cc3a2a34002d26d3eed167f25e1b59d49b5;p=evergreen%2Fequinox.git custom best-hold sort order: start of middle layer work Signed-off-by: Lebbeous Fogle-Weekley --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm index 60fe6b784c..50844fea8e 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm @@ -282,6 +282,55 @@ __PACKAGE__->register_method( method => 'grab_overdue', ); +sub get_hold_sort_order { + my ($ou) = @_; + + my $dbh = action::hold_request->db_Main; + + # The purpose of this function is to return column names in a DB-configured + # order, so it won't do to add columns here or change column names unless + # you also change the expectation of anything calling this function. + + my $row = $dbh->selectrow_hashref( + q! + SELECT + cbho.pprox, cbho.hprox, cbho.aprox, cbho.priority, + cbho.cut, cbho.depth, cbho.htime, cbho.rtime + FROM config.best_hold_order cbho + WHERE id = ( + SELECT oils_json_to_text(value)::INT + FROM actor.org_unit_ancestor_setting('circ.hold_capture_order', ?) + ) + !, undef, $ou + ) || { + pprox => 1, hprox => 8, aprox => 2, priority => 3, + cut => 4, depth => 5, htime => 7, rtime => 6 + }; + + # Return only the keys of our hash, sorted by value, + # keys for null values omitted. + return grep { defined $row->{$_} } ( + sort {$row->{$a} cmp $row->{$b}} keys %$row + ); +} + +sub build_hold_sort_clause { + my (@columns) = @_; + + my %HOLD_SORT_EXPRESSIONS = ( + pprox => 'p.prox', + hprox => '', + aprox => '', + priority => 'pgt.hold_priority', + cut => '', + depth => 'h.selection_depth', + rtime => 'h.request_time', + htime => '' + ); + + +} + sub nearest_hold { my $self = shift; my $client = shift; @@ -291,11 +340,16 @@ sub nearest_hold { my $age = shift() || '0 seconds'; my $fifo = shift(); - local $OpenILS::Application::Storage::WRITE = 1; + if (isTrue($fifo)) { + $log->info("deprecated 'fifo' param true, but ignored"); + } - my $holdsort = isTrue($fifo) ? - "pgt.hold_priority, CASE WHEN h.cut_in_line IS TRUE THEN 0 ELSE 1 END, h.request_time, h.selection_depth DESC, COALESCE(hm.proximity, h.prox) " : - "COALESCE(hm.proximity, h.prox), pgt.hold_priority, CASE WHEN h.cut_in_line IS TRUE THEN 0 ELSE 1 END, h.selection_depth DESC, h.request_time "; +# my $holdsort = isTrue($fifo) ? +# "pgt.hold_priority, CASE WHEN h.cut_in_line IS TRUE THEN 0 ELSE 1 END, h.request_time, h.selection_depth DESC, COALESCE(hm.proximity, h.prox) " : +# "COALESCE(hm.proximity, h.prox), pgt.hold_priority, CASE WHEN h.cut_in_line IS TRUE THEN 0 ELSE 1 END, h.selection_depth DESC, h.request_time "; + my $holdsort = build_hold_sort_clause(get_hold_sort_order($here)); + + local $OpenILS::Application::Storage::WRITE = 1; my $ids = action::hold_request->db_Main->selectcol_arrayref(<<" SQL", {}, $here, $cp, $age); SELECT h.id