Correctly quote regexp-y characters in phrase quoting helper
authorMike Rylander <mrylander@gmail.com>
Fri, 24 Feb 2012 18:40:06 +0000 (13:40 -0500)
committerMike Rylander <mrylander@gmail.com>
Fri, 24 Feb 2012 18:40:06 +0000 (13:40 -0500)
There was one extra character that caused the use of quotemeta() to not
actually happen.  This broke two things:

  1) phrase searching when the phrase had certain special characters in it
        -- test case: "c++"
  2) use of relevance bumps in the same situation

Signed-off-by: Mike Rylander <mrylander@gmail.com>

Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index 8affc65..c38f574 100644 (file)
@@ -28,7 +28,7 @@ sub quote_phrase_value {
     my $right_anchored = $value =~ m/\$$/;
     $value =~ s/\^//   if $left_anchored;
     $value =~ s/\$$//  if $right_anchored;
-    $value =~ quotemeta($value);
+    $value = quotemeta($value);
     $value = '^' . $value if $left_anchored;
     $value = "$value\$"   if $right_anchored;
     return $self->quote_value($value);
@@ -693,13 +693,13 @@ sub rel_bump {
     return '' if (!@$only_atoms);
 
     if ($bump eq 'first_word') {
-        return " /* first_word */ COALESCE(NULLIF( (search_normalize(".$node->table_alias.".value) ~ ('^'||search_normalize(".$self->QueryParser->quote_value($only_atoms->[0]->content)."))), FALSE )::INT * $multiplier, 1)";
+        return " /* first_word */ COALESCE(NULLIF( (search_normalize(".$node->table_alias.".value) ~ ('^'||search_normalize(".$self->QueryParser->quote_phrase_value($only_atoms->[0]->content)."))), FALSE )::INT * $multiplier, 1)";
     } elsif ($bump eq 'full_match') {
         return " /* full_match */ COALESCE(NULLIF( (search_normalize(".$node->table_alias.".value) ~ ('^'||".
-                    join( "||' '||", map { "search_normalize(".$self->QueryParser->quote_value($_->content).")" } @$only_atoms )."||'\$')), FALSE )::INT * $multiplier, 1)";
+                    join( "||' '||", map { "search_normalize(".$self->QueryParser->quote_phrase_value($_->content).")" } @$only_atoms )."||'\$')), FALSE )::INT * $multiplier, 1)";
     } elsif ($bump eq 'word_order') {
         return " /* word_order */ COALESCE(NULLIF( (search_normalize(".$node->table_alias.".value) ~ (".
-                    join( "||'.*'||", map { "search_normalize(".$self->QueryParser->quote_value($_->content).")" } @$only_atoms ).")), FALSE )::INT * $multiplier, 1)";
+                    join( "||'.*'||", map { "search_normalize(".$self->QueryParser->quote_phrase_value($_->content).")" } @$only_atoms ).")), FALSE )::INT * $multiplier, 1)";
     }
 
     return '';