--- trunk/WebPac.pm 2003/06/01 15:33:08 51 +++ trunk/WebPac.pm 2003/07/05 22:31:46 73 @@ -8,6 +8,8 @@ use SWISH; use Text::Iconv; use DBI; +use Config::IniFiles; +use Text::Unaccent; use lib '..'; use index_DBI; @@ -19,13 +21,17 @@ my $CHARSET = 'ISO-8859-2'; my $SWISH = '/usr/bin/swish-e'; my $INDEX = '/data/webpac/index/isis.index'; -my $MAX_HITS = 500; +my $MAX_HITS = 0; my $ON_PAGE = 10; Text::Iconv->raise_error(0); # Conversion errors raise exceptions my $from_utf8 = Text::Iconv->new('UTF8', $CHARSET); +# read global.conf configuration +my $cfg_global = new Config::IniFiles( -file => '../global.conf' ) || die "can't open 'global.conf'"; + + sub setup { my $self = shift; $self->tmpl_path($TEMPLATE_PATH); @@ -70,33 +76,42 @@ my @path_arr = $q->param('path'); my $full = $q->param('full'); - for(my $i = 1; $i <=10; $i++) { + for(my $i = 1; $i <=30; $i++) { return show_index($self, $i) if ($q->param("f".$i."_index")); - next if (! $q->param("f$i")); next if (! $q->param("v$i")); + next if (! $q->param("f$i")); # re-write query from +/- to and/and not - my $s; - my $search = $q->param("v$i"); - while ($search =~ s/\s*("[^"]+")\s*/ /) { - $s .= "$1 "; - } - $search =~ s/^\s+//; - $search =~ s/\s+$//; + my @param_vals = $q->param("v$i"); + my @swish_q; + while (my $search = shift @param_vals) { + my $s; + # remove accents + $search = unac_string($CHARSET,$search); + while ($search =~ s/\s*("[^"]+")\s*/ /) { + $s .= "$1 "; + } + $search =~ s/^\s+//; + $search =~ s/\s+$//; - foreach (split(/\s+/,$search)) { - if (m/^([+-])(\S+)/) { - $s.= ($s) ? "and " : ""; - $s.="not " if ($1 eq "-"); - $s.="$2* "; - } else { - $s.="$_* "; + foreach (split(/\s+/,$search)) { + if (m/^([+-])(\S+)/) { + $s.= ($s) ? "and " : ""; + $s.="not " if ($1 eq "-"); + $s.="$2* "; + } elsif (m/(and|or|not)/i) { + $s.="$_ "; + } else { + $s.="$_* "; + } } + $s =~ s/\*+/*/g; + push @swish_q,$s; } - $s =~ s/\*+/*/g; - - push @s_arr,$q->param("f$i")."_swish=($s)"; + # FIXME default operator for multi-value fields is or. There is + # no way to change it, except here for now. Is there need? + push @s_arr, $q->param("f$i")."_swish=(".join(" or ",@swish_q).")"; } my $tmpl = $self->load_tmpl('results.html'); @@ -122,7 +137,6 @@ ); die $SWISH::errstr unless $sh; - # construct swish query my $sw_q = join(" and ",@s_arr); if (@path_arr) { @@ -137,8 +151,8 @@ $tmpl->param('hits',$hits); $tmpl->param('search',$sw_q); - $tmpl->param('PAGER_offset',$q->param("PAGER_offset") || 0); - $tmpl->param('last_PAGER_offset',$q->param("last_PAGER_offset") || 0); + $tmpl->param('PAGER_offset',$q->param("PAGER_offset") || 1); + $tmpl->param('last_PAGER_offset',$q->param("last_PAGER_offset") || 1); # create a Pager object my $pager = HTML::Pager->new( @@ -192,7 +206,12 @@ my $html; - my $index = new index_DBI(); + my $index = new index_DBI( + $cfg_global->val('global', 'dbi_dbd'), + $cfg_global->val('global', 'dbi_dsn'), + $cfg_global->val('global', 'dbi_user'), + $cfg_global->val('global', 'dbi_passwd') || '' + ); my $total = $index->check($field); if (! $total) {