Perferred language query fix
authorMike Rylander <miker@esilibrary.com>
Fri, 17 Jan 2014 22:09:00 +0000 (17:09 -0500)
committerMike Rylander <mrylander@gmail.com>
Wed, 22 Jan 2014 14:45:01 +0000 (09:45 -0500)
Signed-off-by: Mike Rylander <miker@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index 72cbead..074d309 100644 (file)
@@ -770,14 +770,17 @@ sub toSQL {
         $sort_filter = 'rel';
     }
 
-    my $lang_with = '';
+    my $lang_join = '';
     if (($filters{preferred_language} || $self->QueryParser->default_preferred_language) && ($filters{preferred_language_multiplier} || $self->QueryParser->default_preferred_language_multiplier)) {
     
         my $pl = $self->QueryParser->quote_value( $filters{preferred_language} ? $filters{preferred_language} : $self->QueryParser->default_preferred_language );
-        $lang_with = "lang_with AS (SELECT id FROM config.coded_value_map WHERE ctype = 'item_lang' AND value = $pl)";
+        $$flat_plan{with} .= ',' if $$flat_plan{with};
+        $$flat_plan{with} .= "lang_with AS (SELECT id FROM config.coded_value_map WHERE ctype = 'item_lang' AND code = $pl)";
+        $lang_join = ",lang_with";
 
         my $plw = $filters{preferred_language_multiplier} ? $filters{preferred_language_multiplier} : $self->QueryParser->default_preferred_language_multiplier;
         $rel = "($rel * COALESCE( NULLIF( FIRST(mrv.vlist \@> ARRAY[lang_with.id]), FALSE )::INT * $plw, 1))";
+        $$flat_plan{uses_mrv} = 1;
     }
     $rel = "1.0/($rel)::NUMERIC";
 
@@ -834,11 +837,6 @@ sub toSQL {
     my $with = $$flat_plan{with};
     $with= "\nWITH $with" if $with;
 
-    if ($lang_with) {
-        $with .= ",\n" if $with;
-        $with .= $lang_with;
-    }
-
     # Need an array for query parser db function; this gives a better plan
     # than the ARRAY_AGG(DISTINCT m.source) option as of PostgreSQL 9.1
     my $agg_records = 'ARRAY[m.source] AS records';
@@ -860,6 +858,7 @@ SELECT  $key AS id,
         $mra_join
         $mrv_join
         $bre_join
+        $lang_join
   WHERE 1=1
         $flat_where
   GROUP BY 1