add explicit nesting parens in SQL; protect against empty class specifiers (throw...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 6 May 2010 19:49:25 +0000 (19:49 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 6 May 2010 19:49:25 +0000 (19:49 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@16400 dcc99617-32d9-48b4-a31d-7c20da2025e4

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

index 7c9d85d..062ae64 100644 (file)
@@ -376,6 +376,8 @@ __PACKAGE__->add_search_modifier( 'staff' );
 #-------------------------------
 package OpenILS::Application::Storage::Driver::Pg::QueryParser::query_plan;
 use base 'QueryParser::query_plan';
+use OpenSRF::Utils::Logger qw($logger);
+use Data::Dumper;
 
 sub toSQL {
     my $self = shift;
@@ -401,6 +403,8 @@ sub toSQL {
     $self->QueryParser->superpage_size($filters{superpage_size}) if ($filters{superpage_size});
     $self->QueryParser->core_limit($filters{core_limit}) if ($filters{core_limit});
 
+    $logger->debug("Query plan:\n".Dumper($self));
+
     my $flat_plan = $self->flatten;
 
     # generate the relevance ranking
@@ -586,7 +590,7 @@ sub flatten {
     my $self = shift;
 
     my $from = shift || '';
-    my $where = shift || '';
+    my $where = shift || '(';
 
     my @rank_list;
     for my $node ( @{$self->query_nodes} ) {
@@ -676,7 +680,7 @@ sub flatten {
         }
     }
 
-    return { rank_list => \@rank_list, from => $from, where => $where };
+    return { rank_list => \@rank_list, from => $from, where => $where.')' };
 
 }
 
index 948346b..05ff6be 100755 (executable)
@@ -586,13 +586,19 @@ sub decompose {
 
             $last_type = '';
         } elsif ($self->search_class_count && /$search_class_re/) { # changing current class
+
+            if ($last_type eq 'CLASS') {
+                $struct->remove_last_node( $current_class );
+                warn "Encountered class change with no searches!\n" if $self->debug;
+            }
+
             warn "Encountered class change: $1\n" if $self->debug;
 
             $current_class = $1;
             $struct->classed_node( $current_class );
             $_ = $';
 
-            $last_type = '';
+            $last_type = 'CLASS';
         } elsif (/^\s*"([^"]+)"/) { # phrase, always anded
             warn "Encountered phrase: $1\n" if $self->debug;
 
@@ -776,6 +782,16 @@ sub classed_node {
     return $node;
 }
 
+sub remove_last_node {
+    my $self = shift;
+    my $requested_class = shift;
+
+    my $old = pop(@{$self->query_nodes});
+    pop(@{$self->query_nodes}) if (@{$self->query_nodes});
+
+    return $old;
+}
+
 sub query_nodes {
     my $self = shift;
     return $self->{query};