Add support for simple substring searches
authorSteve McIntyre <steve@einval.com>
Sat, 16 Apr 2011 21:16:13 +0000 (22:16 +0100)
committerSteve McIntyre <steve@einval.com>
Sat, 16 Apr 2011 21:16:13 +0000 (22:16 +0100)
Deal with simple substring searches, whitespace separated: add "*" at
beginning and end and in between each query term.

Add extra option for query type (defaulting to the simple substring)
to allow for old behaviour and new.

find_file.cgi

index abfdf9c..b2e6603 100755 (executable)
@@ -32,8 +32,8 @@ my @AREAS;
 my %num_files;
 my %fileinfo;
 my %imageinfo;
-my %labels;
 my $query_term;
+my $query_type;
 my @results;
 my @chosen_areas;
 my $l = "";
@@ -136,6 +136,15 @@ sub log_error ($$) {
 sub blank_form ($) {
     my $error = shift;
 
+    my %area_labels;
+    my %type_labels;
+
+    foreach my $area(@AREAS) {
+        $area_labels{$area} = "$area (" . read_text("$area.text") . ")";
+    }
+    $type_labels{"simple"} = "simple substring search";
+    $type_labels{"exact"} = "exact filename search (faster); shell globs (*,?) are permitted";
+
     print_header();
     print_html_header("$title_base");
     $q->autoEscape(undef);
@@ -146,13 +155,21 @@ sub blank_form ($) {
         $q->li("package files (.deb, .udeb)"), "\n",
         $q->li("source files (.tar.gz, .tar.bz2, .diff.gz, etc.)"), "\n",
         "</ul>\n";        
-    print $q->p("Select which set(s) of images you wish to look in:"), "\n";
     print $q->start_form(-method=>"GET");
+    print $q->p("Select which set(s) of images you wish to look in:"), "\n";
     print $q->checkbox_group(-name=>'search_area',
                              -values=>\@AREAS,
                              -defaults=>['release'],
                              -linebreak=>'true',
-                             -labels=>\%labels);
+                             -labels=>\%area_labels);
+    print $q->p("And a search type: ");
+    print $q->radio_group(-name=>'type',
+                          -values=>['simple', 'exact'],
+                          -default=>'simple',
+                          -linebreak=>'true',
+                          -labels=>\%type_labels);
+    print $q->p("Exact lookups with no globbing will give the fastest results.");
+
     print $q->textfield(-name=>'query',
                         -value=>'',
                         -size=>50,
@@ -162,7 +179,6 @@ sub blank_form ($) {
     if (length($error)) {
         print $q->p({-style=>'color: red'}, "ERROR: $error"), "\n";
     }
-    print $q->p("Search terms should be in the form of shell globs (i.e. \"<i>cvs*deb</i>\" will match all files that start with <i>cvs</i> and end with <i>deb</i>). Exact lookups with no globbing will give much faster results!");
     print $q->end_form;
     print_footer();
     print $q->end_html;
@@ -227,12 +243,9 @@ while (defined($_ = readdir($dh))) {
 }
 closedir($dh);
 
-foreach my $area(@AREAS) {
-    $labels{$area} = "$area (" . read_text("$area.text") . ")";
-}
-
 @chosen_areas = $q->param('search_area');
 $query_term = $q->param('query');
+$query_type = $q->param('type');
 
 # Check what we've been given, if anything
 if ( (!@chosen_areas) && 
@@ -250,7 +263,13 @@ if (@chosen_areas &&
 }
 
 my $count = 0;
-my $re_search = glob2re($query_term);
+my $re_search;
+my $using_glob = "";
+if ($query_type eq "simple") {
+    $re_search = glob2re('*' . join('*', split(/ /, $query_term)) . '*');
+} else {
+    $re_search = glob2re($query_term);
+}
 
 # If we get here, we have stuff to work with. Yay!
 foreach my $area (@chosen_areas) {
@@ -259,7 +278,8 @@ foreach my $area (@chosen_areas) {
     dbmopen(%fileinfo, "$db_file_name", 0000) ||
         log_error(500, "Failed to open db file: $!\n");
 
-    if ($query_term =~ /[\*\?]/) {
+    if ($query_term =~ /[\*\?]/ || $query_type eq "simple") {
+        $using_glob = "(using globs)";
         # Will need to search through all the keys to allow for glob
         foreach my $file (keys %fileinfo) {
             if ($file =~ $re_search) {
@@ -289,9 +309,9 @@ print
     $q->start_html("$title_base: $count results"),
     $q->h1($title_base), "\n";
 if ($count >= $max_count) {
-    print $q->p("More than $max_count results for \"$query_term\", showing the first $count only\n");
+    print $q->p("More than $max_count results for $query_type search \"$query_term\". Showing the first $count only\n");
 } else {   
-    print $q->p("$count result(s) for \"$query_term\"\n");
+    print $q->p("$count result(s) for $query_type search \"$query_term\".\n");
 }
 if ($count > 0) {
     print "<ol>\n";