From 3dec457079d221642b3bdb6ed7f67c145d1717d4 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Thu, 25 Aug 2011 15:56:15 -0400 Subject: [PATCH] Push phrases down to be subqueries, so they can be ORed together Signed-off-by: Mike Rylander Signed-off-by: Lebbeous Fogle-Weekley --- .../Application/Storage/QueryParser.pm | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm index 3ccd56627e..dc4cfef896 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm @@ -468,6 +468,7 @@ sub decompose { my $current_class = shift || $self->default_search_class; my $recursing = shift || 0; + my $phrase_helper = shift || 0; # Build the search class+field uber-regexp my $search_class_re = '^\s*('; @@ -649,23 +650,35 @@ sub decompose { } elsif (/^\s*($required_re|$disallowed_re)?"([^"]+)"/) { # phrase, always anded warn 'Encountered' . ($1 ? " ['$1' modified]" : '') . " phrase: $2\n" if $self->debug; - $struct->joiner( '&' ); - my $req_ness = $1; + my $req_ness = $1 || ''; my $phrase = $2; - my $class_node = $struct->classed_node($current_class); + if (!$phrase_helper) { + warn "Recursing into decompose with the phrase as a subquery\n" if $self->debug; + my $after = $'; + my ($substruct, $subremainder) = $self->decompose( qq/$req_ness"$phrase"/, $current_class, $recursing + 1, 1 ); + $struct->add_node( $substruct ) if ($substruct); + $_ = $after; + } else { + warn "Directly parsing the phrase subquery\n" if $self->debug; + $struct->joiner( '&' ); + + my $class_node = $struct->classed_node($current_class); + + if ($req_ness eq $pkg->operator('disallowed')) { + $class_node->add_dummy_atom( node => $class_node ); + $class_node->add_unphrase( $phrase ); + $phrase = ''; + #$phrase =~ s/(^|\s)\b/$1-/g; + } else { + $class_node->add_phrase( $phrase ); + } + $_ = $phrase . $'; - if ($req_ness eq $pkg->operator('disallowed')) { - $class_node->add_dummy_atom( node => $class_node ); - $class_node->add_unphrase( $phrase ); - $phrase = ''; - #$phrase =~ s/(^|\s)\b/$1-/g; - } else { - $class_node->add_phrase( $phrase ); } - $_ = $phrase . $'; $last_type = ''; + # } elsif (/^\s*$required_re([^\s"]+)/) { # phrase, always anded # warn "Encountered required atom (mini phrase): $1\n" if $self->debug; # -- 2.43.2