]> git.deb.at Git - deb/packages.git/blobdiff - lib/Packages/DoSearch.pm
Packages::DoNewPkg: Support new backend format
[deb/packages.git] / lib / Packages / DoSearch.pm
index 2603ff9a10c848333643f27e98a6f450e4c36611..31e110d5449afbd6cc60367475d14725e4d8800c 100644 (file)
@@ -5,8 +5,6 @@ use warnings;
 
 use Benchmark ':hireswallclock';
 use DB_File;
-use URI::Escape;
-use HTML::Entities;
 use Exporter;
 our @ISA = qw( Exporter );
 our @EXPORT = qw( do_search );
@@ -19,7 +17,7 @@ use Packages::DB;
 use Packages::Config qw( $DBDIR @SUITES @ARCHIVES $ROOT );
 
 sub do_search {
-    my ($params, $opts, $html_header, $page_content) = @_;
+    my ($params, $opts, $page_content) = @_;
 
     $Params::Search::too_many_hits = 0;
 
@@ -53,10 +51,15 @@ sub do_search {
            do_names_search( [ @keywords ], \%packages, $p_obj,
                             \&read_entry_all, $opts,
                             \@results, \@non_results );
-           do_fulltext_search( [ @keywords ], "$DBDIR/descriptions.txt",
+           my $fts1 = new Benchmark;
+           do_xapian_search( [ @keywords ], "$DBDIR/xapian/",
                                \%did2pkg, \%packages,
                                \&read_entry_all, $opts,
                                \@results, \@non_results );
+           my $fts2 = new Benchmark;
+           my $fts_xapian = timediff($fts2,$fts1);
+           debug( "Fulltext search took ".timestr($fts_xapian) )
+               if DEBUG;
        }
     }
 
@@ -74,10 +77,18 @@ sub do_search {
     if (@results) {
        my (%pkgs, %subsect, %sect, %archives, %desc, %binaries, %provided_by);
 
+       my %sort_by_relevance;
+       for (1 ... scalar @results) {
+#          debug("$results[$_][0] => $_", 4) if DEBUG;
+           $sort_by_relevance{$results[$_-1][0]} = $_;
+       }
+#      use Data::Dumper;
+#      debug( "sort_by_relevance=".Dumper(\%sort_by_relevance), 4);
+
        unless ($opts->{source}) {
            foreach (@results) {
                my ($pkg_t, $archive, $suite, $arch, $section, $subsection,
-                   $priority, $version, $desc) = @$_;
+                   $priority, $version, $desc_md5, $desc) = @$_;
 
                my ($pkg) = $pkg_t =~ m/^(.+)/; # untaint
                if ($arch ne 'virtual') {
@@ -86,14 +97,19 @@ sub do_search {
                    $sect{$pkg}{$suite}{$version} = $section;
                    $archives{$pkg}{$suite}{$version} ||= $archive;
 
-                   $desc{$pkg}{$suite}{$version} = $desc;
+                   $desc{$pkg}{$suite}{$version} = [ $desc_md5, $desc ];
                } else {
                    $provided_by{$pkg}{$suite} = [ split /\s+/, $desc ];
                }
            }
 
            my %uniq_pkgs = map { $_ => 1 } (keys %pkgs, keys %provided_by);
-           my @pkgs = sort keys %uniq_pkgs;
+           my @pkgs;
+           if ($searchon eq 'names') {
+               @pkgs = sort keys %uniq_pkgs;
+           } else {
+               @pkgs = sort { $sort_by_relevance{$a} <=> $sort_by_relevance{$b} } keys %uniq_pkgs;
+           }
            process_packages( $page_content, 'packages', \%pkgs, \@pkgs, $opts, \@keywords,
                              \&process_package, \%provided_by,
                              \%archives, \%sect, \%subsect,
@@ -105,7 +121,7 @@ sub do_search {
                    $version) = @$_;
 
                my $real_archive = '';
-               if ($archive =~ /^(security|non-US)$/) {
+               if ($archive eq 'security') {
                    $real_archive = $archive;
                    $archive = 'us';
                }
@@ -181,9 +197,22 @@ sub process_package {
            my @versions = version_sort keys %{$pkgs->{$suite}};
            $suite{section} = $sect->{$suite}{$versions[0]};
            $suite{subsection} = $subsect->{$suite}{$versions[0]};
-           $suite{desc} = $desc->{$suite}{$versions[0]};
+           my $desc_md5 = $desc->{$suite}{$versions[0]}[0];
+           $suite{desc} = $desc->{$suite}{$versions[0]}[1];
            $suite{versions} = [];
-               
+
+           my $trans_desc = $desctrans{$desc_md5};
+           my %sdescs;
+           if ($trans_desc) {
+               my %trans_desc = split /\000|\001/, $trans_desc;
+               while (my ($l, $d) = each %trans_desc) {
+                   $d =~ s/\n.*//os;
+
+                   $sdescs{$l} = $d;
+               }
+               $suite{trans_desc} = \%sdescs;
+           }
+
            foreach my $v (@versions) {
                my %version;
                $version{version} = $v;