Capture any search class alias the abstract query blob and the driver to make use of
authorMike Rylander <mrylander@gmail.com>
Fri, 30 Sep 2011 18:26:53 +0000 (14:26 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Tue, 28 Feb 2012 16:36:52 +0000 (11:36 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/QueryParser.pm

index 1703f1d..c0e0203 100644 (file)
@@ -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
     };