From 33835376a347e72a54394a501f296d13523725ef Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Fri, 30 Sep 2011 14:26:53 -0400 Subject: [PATCH] Capture any search class alias the abstract query blob and the driver to make use of Signed-off-by: Mike Rylander --- .../lib/OpenILS/Application/Storage/QueryParser.pm | 37 +++++++++++++++------- 1 file changed, 26 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 e36d261b7f..cefc71b486 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm @@ -480,35 +480,36 @@ sub decompose { for my $field ( @{$pkg->search_fields->{$class}} ) { for my $alias ( @{$pkg->search_field_aliases->{$class}{$field}} ) { - $alias = qr/$alias/; - s/(^|\s+)$alias[:=]/$1$class\|$field:/g; + my $aliasr = qr/$alias/; + s/(^|\s+)$aliasr[:=]/$1$class\|$field#$alias:/g; } } $search_class_re .= '|' unless ($first_class); $first_class = 0; - $search_class_re .= $class . '(?:\|\w+)*'; + $search_class_re .= $class . '(?:[|#]\w+)*'; $seen_classes{$class} = 1; } for my $class ( keys %{$pkg->search_class_aliases} ) { for my $alias ( @{$pkg->search_class_aliases->{$class}} ) { - $alias = qr/$alias/; - s/(^|[^|])\b$alias\|/$1$class\|/g; - s/(^|[^|])\b$alias[:=]/$1$class:/g; + my $aliasr = qr/$alias/; + s/(^|[^|])\b$aliasr\|/$1$class#$alias\|/g; + s/(^|[^|])\b$aliasr[:=]/$1$class#$alias:/g; } if (!$seen_classes{$class}) { $search_class_re .= '|' unless ($first_class); $first_class = 0; - $search_class_re .= $class . '(?:\|\w+)*'; + $search_class_re .= $class . '(?:[|#]\w+)*'; $seen_classes{$class} = 1; } } $search_class_re .= '):'; + warn " ** Rewritten query: $_\n" if $self->debug; warn " ** Search class RE: $search_class_re\n" if $self->debug; my $required_re = $pkg->operator('required'); @@ -535,7 +536,7 @@ sub decompose { # Build the filter and modifier uber-regexps my $facet_re = '^\s*(-?)((?:' . join( '|', @{$pkg->facet_classes}) . ')(?:\|\w+)*)\[(.+?)\]'; - warn " Facet RE: $facet_re\n" if $self->debug; + warn " ** Facet RE: $facet_re\n" if $self->debug; my $filter_re = '^\s*(-?)(' . join( '|', @{$pkg->filters}) . ')\(([^()]+)\)'; my $filter_as_class_re = '^\s*(-?)(' . join( '|', @{$pkg->filters}) . '):\s*(\S+)'; @@ -642,8 +643,7 @@ sub decompose { warn "Encountered class change: $1\n" if $self->debug; - $current_class = $1; - $struct->classed_node( $current_class ); + $current_class = $struct->classed_node( $1 )->requested_class(); $_ = $'; $last_type = 'CLASS'; @@ -1085,15 +1085,21 @@ sub new_atom { return do{$pkg.'::atom'}->new( @_ ); } -sub requested_class { # also split into classname and fields +sub requested_class { # also split into classname, fields, alias and alias modifier my $self = shift; my $class = shift; if ($class) { + my $alias; + if ($class =~ s/#([^|]*)//) { + $alias = $1; + } + my ($class_part, @field_parts) = split '\|', $class; $class_part ||= $class; $self->{requested_class} = $class; + $self->{alias} = $alias if $alias; $self->{classname} = $class_part; $self->{fields} = \@field_parts; } @@ -1109,6 +1115,14 @@ sub plan { return $self->{plan}; } +sub alias { + my $self = shift; + my $alias = shift; + + $self->{alias} = $alias if ($alias); + return $self->{alias}; +} + sub classname { my $self = shift; my $class = shift; @@ -1239,6 +1253,7 @@ sub to_abstract_query { my $abstract_query = { "type" => "node", + "alias" => $self->alias, "class" => $self->classname, "fields" => $self->fields }; -- 2.11.0