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');
# 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+)';
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';
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;
}
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;
my $abstract_query = {
"type" => "node",
+ "alias" => $self->alias,
"class" => $self->classname,
"fields" => $self->fields
};