Bug 9961: Add truncation support to QP driver origin/new/bug_9961
authorJared Camins-Esakov <jcamins@cpbibliography.com>
Thu, 2 May 2013 15:53:36 +0000 (11:53 -0400)
committerJared Camins-Esakov <jcamins@cpbibliography.com>
Wed, 8 May 2013 13:44:23 +0000 (09:44 -0400)
The original implementation of QueryParser did not handle truncation
based on the QueryAutoTruncate system preference. This patch adds support.

To test:
1) Apply patch.
2) Turn on UseQueryParser.
3) Set QueryAutoTruncate to "automatically."
4) Search for "har". Note that it returns results with words
   like "Harry" (i.e. with right truncation).
5) Search for "har*". Note that it still returns results with right
   truncation.
6) Set QueryAutoTruncate to "only when * is added."
7) Search for "har". Note that it returns only records that have the
   exact word "har" in them (most likely there will be none unless you
   have Hebrew items).
8) Search for "har*". Note that once again it returns results for "Harry"
   (i.e. right truncated results).
9) Sign off.

This patch also reindents a hash in Koha/QueryParser/Driver/PQF.pm
because it was hard to read before.

Signed-off-by: Mirko Tietgen <mirko@abunchofthings.net>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
All tests and QA script pass.
Thx for fixing this Jared!
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
C4/Search.pm
Koha/QueryParser/Driver/PQF.pm
Koha/QueryParser/Driver/PQF/query_plan/node.pm

index da729ad..aec024b 100644 (file)
@@ -112,6 +112,7 @@ sub FindDuplicate {
             $titleindex = 'title|exact';
             $authorindex = 'author|exact';
             $op = '&&';
+            $QParser->custom_data->{'QueryAutoTruncate'} = C4::Context->preference('QueryAutoTruncate');
         } else {
             $titleindex = 'ti,ext';
             $authorindex = 'au,ext';
@@ -233,6 +234,9 @@ sub SimpleSearch {
 
     my $QParser;
     $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser') && ! ($query =~ m/\w,\w|\w=\w/));
+    if ($QParser) {
+        $QParser->custom_data->{'QueryAutoTruncate'} = C4::Context->preference('QueryAutoTruncate');
+    }
 
     # Initialize & Search Zebra
     for ( my $i = 0 ; $i < @servers ; $i++ ) {
@@ -1177,6 +1181,7 @@ sub parseQuery {
 
     if ($QParser)
     {
+        $QParser->custom_data->{'QueryAutoTruncate'} = C4::Context->preference('QueryAutoTruncate');
         $query = '';
         for ( my $ii = 0 ; $ii <= @operands ; $ii++ ) {
             next unless $operands[$ii];
index 3007333..d4551f0 100644 (file)
@@ -349,23 +349,23 @@ not want to use it.
 sub clear_all_configuration {
     my ($self) = @_;
     %OpenILS::QueryParser::parser_config = (
-            'OpenILS::QueryParser' => {
+        'OpenILS::QueryParser' => {
             filters => [],
             modifiers => [],
             operators => {
-            'and' => '&&',
-            'or' => '||',
-            float_start => '{{',
-            float_end => '}}',
-            group_start => '(',
-            group_end => ')',
-            required => '+',
-            disallowed => '-',
-            modifier => '#',
-            negated => '!'
+                'and' => '&&',
+                'or' => '||',
+                float_start => '{{',
+                float_end => '}}',
+                group_start => '(',
+                group_end => ')',
+                required => '+',
+                disallowed => '-',
+                modifier => '#',
+                negated => '!'
             }
-            }
-            );
+        }
+    );
     return $self;
 }
 
index 7d05937..e88ef84 100644 (file)
@@ -57,6 +57,7 @@ sub target_syntax {
                 $phrase =~ s/"/\\"/g;
                 $pqf .= ' @or ' x (scalar(@fields) - 1);
                 foreach my $attributes (@fields) {
+                    $attributes->{'attr_string'} ||= '';
                     $pqf .= $attributes->{'attr_string'} . ($attributes->{'4'} ? '' : ' @attr 4=1') . ' "' . $phrase . '" ';
                 }
                 $atom_count++;
@@ -70,6 +71,9 @@ sub target_syntax {
                     $pqf .= ' @or ' x (scalar(@fields) - 1);
                     foreach my $attributes (@fields) {
                         $attributes->{'attr_string'} ||= '';
+                        if ($self->plan->QueryParser->custom_data->{'QueryAutoTruncate'} || $atom->suffix eq '*') {
+                            $attributes->{'attr_string'} .= ($attributes->{'5'} ? '' : ' @attr 5=1 ');
+                        }
                         $pqf .= $attributes->{'attr_string'} . ($attributes->{'4'} ? '' : ' @attr 4=6 ') . $atom_content . ' ';
                     }
                     $atom_count++;