use strict;
use warnings;
-use Switch;
package OpenILS::Application::Storage::Driver::Pg::QueryParser;
use OpenILS::Application::Storage::QueryParser;
$value =~ s/^[*\^]// if $left_anchored;
$value =~ s/[*\$]$// if $right_anchored;
+ $value = quotemeta($value);
$value = '^' . $value if $left_anchored eq '^';
$value = "$value\$" if $right_anchored eq '$';
$value = '[[:<:]]' . $value if $left_wb && !$left_anchored;
my $flat_plan = $self->flatten;
-
# generate the relevance ranking
my $rel = '1'; # Default to something simple in case rank_list is empty.
if (@{$$flat_plan{rank_list}}) {
SELECT NULL,NULL,NULL,COUNT(*),COUNT(*),COUNT(*),0,0,NULL,NULL FROM w;
SQL
-open SQLTXT, ">", "/tmp/sql.txt";
-print SQLTXT $sql;
-close SQLTXT;
-
warn $sql if $self->QueryParser->debug;
return $sql;
my $uses_bre = 0;
my $uses_mrd = 0;
my $uses_mrv = 0;
- my $uses_mlf = 0;
my @rank_list;
for my $node ( @{$self->query_nodes} ) {
$where .= " AND ${talias}.value ilike xml_encode_special_chars(search_normalize(";
my $phrase_list;
for my $atom (@{$node->only_real_atoms}) {
-# my $content = $atom->{content};
my $content = ref($atom) ? $atom->{content} : $atom;
$content =~ s/^\^//;
$content =~ s/\$$//;
$phrase_list .= "$content ";
-# next unless $atom->{content} && $atom->{content} =~ /(^\^|\$$)/;
-# $where .= " AND ${talias}.value ~* search_normalize(".$self->QueryParser->quote_phrase_value($atom->{content}).")";
}
$where .= $self->QueryParser->quote_phrase_value($phrase_list).'))';
}
$uses_bre = $$subnode{uses_bre};
$uses_mrd = $$subnode{uses_mrd};
$uses_mrv = $$subnode{uses_mrv};
- $uses_mlf = $$subnode{uses_mlf};
}
} else {
my @dlist = ();
my $common = 0;
# for each dynamic filter, build more of the WHERE clause
-
for my $filter (@{$self->filters}) {
my $NOT = $filter->negate ? 'NOT ' : '';
if (grep { $_ eq $filter->name } @{ $self->QueryParser->dynamic_filters }) {
- my @fargs = @{$filter->args};
my $fname = $filter->name;
$fname = 'item_lang' if $fname eq 'language'; #XXX filter aliases
warn "flatten(): processing dynamic filter ". $filter->name ."\n"
if $self->QueryParser->debug;
- if ($fname eq 'item_lang')
- {
- $where .= "$NOT( " . 'mlf.value @@ ' . "\'" . join('|', @fargs) . '\'::tsquery)';
- $uses_mlf = 1;
- } else {
- $where .= sprintf(
- "${NOT}COALESCE((mrd.attrs->'%s') IN (%s), false)", $fname,
- join(',', map { $self->QueryParser->quote_value($_) } @fargs));
- }
-
- warn "flatten(): filter where => $where\n"
- if $self->QueryParser->debug;
-
my $vlist_query;
($vlist_query, $common) = $self->dynamic_filter_compile( $fname, $filter->args, $filter->negate );
my $browseType = shift @{$filter->args};
my $entry = int(shift @{$filter->args});
my $fields = join(",", map(int, @{$filter->args}));
- my $defMap;
- #Set the correct table name based on the browse search type
- switch ($browseType) {
- case "title" { $defMap = "browse_title_entry_def_map" }
- case "author" { $defMap = "browse_author_entry_def_map" }
- case "subject" { $defMap = "browse_subject_entry_def_map" }
- case "series" { $defMap = "browse_series_entry_def_map" }
- # XXX I don't know where or why 'identifier#' is being inserted, but it seems harmless
- case "identifier#id|bibcn" { $defMap = "browse_call_number_entry_def_map" }
- # Default to title
- else { $defMap = "browse_title_entry_def_map" }
- }
+
+ $browseType ||= "title";
+ $browseType = "call_number"
+ if $browseType eq "identifier#id|bibcn";
+
+ $browseType = "title" unless
+ $browseType =~ /title|author|subject|series|call_number/;
+
+ my $defMap = "browse_${browseType}_entry_def_map";
$from .= "\n" . $spc x 3 . sprintf("INNER JOIN metabib.$defMap mbedm ON (mbedm.source = m.source AND mbedm.entry = %d AND mbedm.def IN (%s))", $entry, $fields);
}
} elsif ($filter->name eq 'edit_date' or $filter->name eq 'create_date') {
vis_filter => \%vis_filter,
uses_bre => $uses_bre,
uses_mrv => $uses_mrv,
- uses_mrd => $uses_mrd,
- uses_mlf => $uses_mlf
+ uses_mrd => $uses_mrd
};
}
#-------------------------------
package OpenILS::Application::Storage::Driver::Pg::QueryParser::query_plan::node;
-use OpenILS::Application::Storage::QueryParser;
use base 'QueryParser::query_plan::node';
use List::MoreUtils qw/uniq/;
use Data::Dumper;