From e297f56fb5ba59c24f4b3d325b8a43fc05c71f5d Mon Sep 17 00:00:00 2001 From: Frank Lichtenheld Date: Tue, 21 Feb 2006 03:26:10 +0000 Subject: [PATCH 1/1] Make result display of DoSearchContents actually usable --- lib/Packages/DoSearchContents.pm | 56 ++++++++++++++++++++++---------- static/debian.css | 18 ++++++++-- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/lib/Packages/DoSearchContents.pm b/lib/Packages/DoSearchContents.pm index f66ba87..6d236d1 100644 --- a/lib/Packages/DoSearchContents.pm +++ b/lib/Packages/DoSearchContents.pm @@ -26,12 +26,21 @@ sub do_search_contents { } elsif (length($opts->{keywords}) < 2) { fatal_error( "keyword too short (keywords need to have at least two characters)" ); } + if ($params->{errors}{suite}) { + fatal_error( "suite not valid or not specified" ); + } + if (@{$opts->{suite}} > 1) { + fatal_error( "more than one suite specified for contents search (@{$opts->{suite}})" ); + } $$menu = ""; my $keyword = $opts->{keywords}; my $searchon = $opts->{searchon}; my $exact = $opts->{exact}; + my $suite = $opts->{suite}[0]; + my $archive = $opts->{archive}[0] ||''; + $Packages::Search::too_many_hits = 0; # for URL construction my $keyword_esc = uri_escape( $keyword ); @@ -47,7 +56,7 @@ sub do_search_contents { my $archs_enc = encode_entities( join( ', ', @{$params->{values}{arch}{no_replace}} ) ); my $st0 = new Benchmark; - my (@results, @non_results); + my (@results); unless (@Packages::CGI::fatal_errors) { @@ -57,20 +66,23 @@ sub do_search_contents { # full filename search is tricky my $ffn = $searchon eq 'filenames'; - my $suite = 'stable'; #fixme - my $reverses = tie my %reverses, 'DB_File', "$DBDIR/contents/reverse_$suite.db", O_RDONLY, 0666, $DB_BTREE or die "Failed opening reverse DB: $!"; if ($ffn) { - open FILENAMES, '-|', 'fgrep', '--', "$kw", "$DBDIR/contents/filenames_$suite.txt" + open FILENAMES, '-|', 'fgrep', '--', $kw, "$DBDIR/contents/filenames_$suite.txt" or die "Failed opening filename table: $!"; + + error( "Exact and fullfilenamesearch don't go along" ) + if $ffn and $exact; + while () { chomp; - last unless &searchfile(\@results, reverse($_)."/", \$nres, $reverses); + &searchfile(\@results, reverse($_)."/", \$nres, $reverses); + last if $Packages::Search::too_many_hits; } - close FILENAMES; + close FILENAMES or warn "fgrep error: $!\n"; } else { $kw = reverse $kw; @@ -78,8 +90,6 @@ sub do_search_contents { # exact filename searching follows trivially: $kw = "$kw/" if $exact; - print "ERROR: Exact and fullfilenamesearch don't go along" if $ffn and $exact; - &searchfile(\@results, $kw, \$nres, $reverses); } $reverses = undef; @@ -102,12 +112,11 @@ sub do_search_contents { msg( "You have searched for ${wording} $keyword_enc in $suite_wording, $section_wording, and $arch_wording." ); if ($Packages::Search::too_many_hits) { - error( "Your search was too wide so we will only display exact matches. At least $Packages::Search::too_many_hits results have been omitted and will not be displayed. Please consider using a longer keyword or more keywords." ); + error( "Your search was too wide so we will only display only the first about 100 matches. Please consider using a longer keyword or more keywords." ); } - $$page_content = ''; if (!@Packages::CGI::fatal_errors && !@results) { - $$page_content .= "No results"; + error( "Nothing found" ); } %$html_header = ( title => 'Package Contents Search Results' , @@ -126,11 +135,23 @@ sub do_search_contents { }, ); + $$page_content = ''; if (@results) { - $$page_content .= scalar @results . " results displayed:
"; - foreach (@results) { - $$page_content .= "$_
\n"; + $$page_content .= "

Found ".scalar(@results)." results

"; + $$page_content .= "
"; + foreach my $result (sort { $a->[0] cmp $b->[0] } @results) { + my $file = shift @$result; + $$page_content .= "'; } + $$page_content .= '' if @results > 20; + $$page_content .= '
FilePackages
$file"; + my %pkgs; + foreach (@$result) { + my ($pkg, $arch) = split /:/, $_; + $pkgs{$pkg}{$arch}++; + } + $$page_content .= join( ", ", map { "$_" } sort keys %pkgs); + $$page_content .= '
FilePackages
'; } } # sub do_search_contents @@ -139,6 +160,7 @@ sub searchfile my ($results, $kw, $nres, $reverses) = @_; my ($key, $value) = ($kw, ""); + debug( "searchfile: kw=$kw", 1 ); for (my $status = $reverses->seq($key, $value, R_CURSOR); $status == 0; $status = $reverses->seq( $key, $value, R_NEXT)) { @@ -146,14 +168,14 @@ sub searchfile # FIXME: what's the most efficient "is prefix of" thingy? We only want to know # whether $kw is or is not a prefix of $key last unless index($key, $kw) == 0; + debug( "found $key", 2 ); my @hits = split /\0/o, $value; - push @$results, reverse($key)." is found in @hits"; + push @$results, [ scalar reverse($key), @hits ]; last if ($$nres)++ > 100; } -# FIXME: use too_many_hits - return $$nres<100; + $Packages::Search::too_many_hits += $$nres - 100 if $$nres > 100; } diff --git a/static/debian.css b/static/debian.css index 71b05eb..c7fa4be 100644 --- a/static/debian.css +++ b/static/debian.css @@ -531,6 +531,13 @@ div.righthalf { border-style: ridge; border-collapse: collapse; } +#pcontentsres table { + margin: 0 1em 1em 1em; + min-width: 50%; + border: 2px gray; + border-style: ridge; + border-collapse: collapse; +} table.vote { margin: 0 auto; border-width: 3px; @@ -538,12 +545,19 @@ table.vote { border-style: ridge; border-collapse: collapse; } -#pdownload th, #pdownload td, table.ridgetable th, table.ridgetable td, +#pcontentsres col, #pcontentsres th, #pdownload th, #pdownload td, table.ridgetable th, table.ridgetable td, table.reltable td, table.reltable th { - border: 2px gray; + border: 2px #BFC3DC; border-style: ridge; padding: 0.1em; } +#pcontentsres td.file { + font-family: monospace; +} +#pcontentsres td { +/* font-size: smaller;*/ + padding: .4em; +} table.reltable th { background-color: #44CCCC; } -- 2.39.2