From 50c4e296ace5c4f466d9416bc28fd242821f2f51 Mon Sep 17 00:00:00 2001 From: miker Date: Fri, 19 Mar 2010 21:00:23 +0000 Subject: [PATCH] add support for pub date filters; add superpage-related override support; add lasso support; add preferred language rel bump support git-svn-id: svn://svn.open-ils.org/ILS/trunk@15920 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../Storage/Driver/Pg/QueryParser.pm | 102 ++++++++++++++++-- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm index 16e41de62e..c8eb48bb43 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm @@ -3,6 +3,27 @@ use OpenILS::Application::Storage::QueryParser; use base 'QueryParser'; use OpenSRF::Utils::JSON; +sub init { + my $class = shift; + +} + +sub default_preferred_language { + my $self = shift; + my $lang = shift; + + $self->custom_data->{default_preferred_language} = $lang if ($lang); + return $self->custom_data->{default_preferred_language}; +} + +sub default_preferred_language_multiplier { + my $self = shift; + my $lang = shift; + + $self->custom_data->{default_preferred_language_multiplier} = $lang if ($lang); + return $self->custom_data->{default_preferred_language_multiplier}; +} + sub simple_plan { my $self = shift; @@ -235,19 +256,27 @@ __PACKAGE__->add_search_filter( 'item_form' ); __PACKAGE__->add_search_filter( 'lit_form' ); __PACKAGE__->add_search_filter( 'location' ); __PACKAGE__->add_search_filter( 'site' ); +__PACKAGE__->add_search_filter( 'lasso' ); +__PACKAGE__->add_search_filter( 'my_lasso' ); __PACKAGE__->add_search_filter( 'depth' ); __PACKAGE__->add_search_filter( 'sort' ); __PACKAGE__->add_search_filter( 'language' ); __PACKAGE__->add_search_filter( 'preferred_language' ); __PACKAGE__->add_search_filter( 'preferred_language_weight' ); +__PACKAGE__->add_search_filter( 'preferred_language_multiplier' ); __PACKAGE__->add_search_filter( 'statuses' ); __PACKAGE__->add_search_filter( 'bib_level' ); __PACKAGE__->add_search_filter( 'before' ); __PACKAGE__->add_search_filter( 'after' ); +__PACKAGE__->add_search_filter( 'between' ); __PACKAGE__->add_search_filter( 'during' ); +__PACKAGE__->add_search_filter( 'offset' ); +__PACKAGE__->add_search_filter( 'limit' ); __PACKAGE__->add_search_filter( 'core_limit' ); __PACKAGE__->add_search_filter( 'check_limit' ); __PACKAGE__->add_search_filter( 'skip_check' ); +__PACKAGE__->add_search_filter( 'superpage' ); +__PACKAGE__->add_search_filter( 'superpage_size' ); __PACKAGE__->add_search_filter( 'estimation_strategy' ); __PACKAGE__->add_search_modifier( 'available' ); @@ -264,6 +293,28 @@ use base 'QueryParser::query_plan'; sub toSQL { my $self = shift; + + my %filters; + my ($format) = $self->find_filter('format'); + if ($format) { + my ($t,$f) = split('-', $format->args->[0]); + $self->new_filter( item_type => [ split '', $t ] ) if ($t); + $self->new_filter( item_form => [ split '', $f ] ) if ($f); + } + + for my $f ( qw/preferred_language preferred_language_multiplier preferred_language_weight core_limit check_limit skip_check superpage superpage_size/ ) { + my $col = $f; + $col = 'preferred_language_multiplier' if ($f eq 'preferred_language_weight'); + my ($filter) = $self->find_filter($f); + if ($filter and @{$filter->args}) { + $filters{$col} = $filter->args->[0]; + } + } + + $self->QueryParser->superpage($filters{superpage}) if ($filters{superpage}); + $self->QueryParser->superpage_size($filters{superpage_size}) if ($filters{superpage_size}); + $self->QueryParser->core_limit($filters{core_limit}) if ($filters{core_limit}); + my $flat_plan = $self->flatten; # generate the relevance ranking @@ -277,12 +328,12 @@ sub toSQL { $sort_filter = 'rel'; } - my %filters; - my ($format) = $self->find_filter('format'); - if ($format) { - my ($t,$f) = split('-', $format->args->[0]); - $self->new_filter( item_type => [ split '', $t ] ) if ($t); - $self->new_filter( item_form => [ split '', $f ] ) if ($f); + if (($filters{preferred_language} || $self->QueryParser->default_preferred_language) && ($filters{preferred_language_multiplier} || $self->QueryParser->default_preferred_language_multiplier)) { + $rel = "($rel) * CASE WHEN mrd.lang = \$_$$\$"; + $rel .= $filters{preferred_language} ? $filters{preferred_language} : $self->QueryParser->default_preferred_language; + $rel .= "\$_$$\$ THEN "; + $rel .= $filters{preferred_language_multiplier} ? $filters{preferred_language_multiplier} : $self->QueryParser->default_preferred_language_multiplier; + $rel .= " ELSE 1 END"; } for my $f ( qw/audience vr_format item_type item_form lit_form language bib_level/ ) { @@ -352,18 +403,46 @@ sub toSQL { } } - my $key = 'm.source'; $key = 'm.metarecord' if (grep {$_->name eq 'metarecord'} @{$self->modifiers}); - my $sp_size = $self->QueryParser->superpage_size; - my $sp = $self->QueryParser->superpage; + my $sp_size = $self->QueryParser->superpage_size || 1000; + my $sp = $self->QueryParser->superpage || 1; my $offset = ''; if ($sp > 1) { $offset = 'OFFSET ' . ($sp - 1) * $sp_size; } + my ($before) = $self->find_filter('before'); + my ($after) = $self->find_filter('after'); + my ($during) = $self->find_filter('during'); + my ($between) = $self->find_filter('between'); + + if ($before and @{$before->args} == 1) { + $before = "AND mrd.date1 <= \$_$$\$" . $before->args->[0] . "\$_$$\$"; + } else { + $before = ''; + } + + if ($after and @{$after->args} == 1) { + $after = "AND mrd.date1 >= \$_$$\$" . $after->args->[0] . "\$_$$\$"; + } else { + $after = ''; + } + + if ($during and @{$during->args} == 1) { + $during = "AND \$_$$\$" . $during->args->[0] . "\$_$$\$ BETWEEN mrd.date1 AND mrd.date2"; + } else { + $during = ''; + } + + if ($between and @{$between->args} == 2) { + $between = "AND mrd.date1 BETWEEN \$_$$\$" . $between->args->[0] . "\$_$$\$ AND \$_$$\$" . $between->args->[1] . "\$_$$\$"; + } else { + $between = ''; + } + return <QueryParser->core_limit || 25000; $from .= "\n\t\tLIMIT " . $self->QueryParser->core_limit . "\n\t) AS " . $node->table_alias . ' ON (m.source = ' . $node->table_alias . ".source)"; $from .= "\n\tJOIN config.metabib_field AS ${talias}_weight ON (${talias}_weight.id = $talias.field)\n"; -- 2.43.2