package QueryParser;
use OpenSRF::Utils::JSON;
+# Note that the first key must match the name of the package.
our %parser_config = (
QueryParser => {
filters => [],
$last_type = '';
} elsif (/$and_re/) { # ANDed expression
$_ = $';
- next if ($last_type eq 'AND');
- next if ($last_type eq 'OR');
+ next unless (defined($struct->query_nodes) and scalar(@{$struct->query_nodes}));
warn "Encountered AND\n" if $self->debug;
+ my $lhs = $self->new_plan(level =>
+ $struct->plan_level + 1, query => $struct->query_nodes);
+ $struct->{query} = [];
+ my ($rhs, $rest) = $self->decompose( $', $current_class, $recursing + 1 );
+ $struct->add_node($lhs);
$struct->joiner( '&' );
+ $struct->add_node($rhs);
+ foreach (@{$rhs->modifiers}) {
+ $struct->add_modifier($_)
+ }
+ $rhs->{modifiers} = [];
+ foreach (@{$rhs->filters}) {
+ $struct->add_filter($_);
+ }
+ $rhs->{filters} = [];
+ $_ = $rest;
$last_type = 'AND';
} elsif (/$or_re/) { # ORed expression
$_ = $';
- next if ($last_type eq 'AND');
- next if ($last_type eq 'OR');
+ next unless (defined($struct->query_nodes) and scalar(@{$struct->query_nodes}));
warn "Encountered OR\n" if $self->debug;
+ my $lhs = $self->new_plan(level =>
+ $struct->plan_level + 1, query => $struct->query_nodes);
+ $struct->{query} = [];
+ my ($rhs, $rest) = $self->decompose( $', $current_class, $recursing + 1 );
+ $struct->add_node($lhs);
$struct->joiner( '|' );
+ $struct->add_node($rhs);
+ foreach (@{$rhs->modifiers}) {
+ $struct->add_modifier($_)
+ }
+ $rhs->{modifiers} = [];
+ foreach (@{$rhs->filters}) {
+ $struct->add_filter($_);
+ }
+ $rhs->{filters} = [];
+ $_ = $rest;
$last_type = 'OR';
} elsif ($self->facet_class_count && /$facet_re/) { # changing current class