If we're given an exact search term, shortcut
authorSteve McIntyre <steve@einval.com>
Tue, 5 Apr 2011 18:04:36 +0000 (19:04 +0100)
committerSteve McIntyre <steve@einval.com>
Tue, 5 Apr 2011 18:04:36 +0000 (19:04 +0100)
If we're given an exact term containing no glob characters, then we
may as well save a lot of time and just do the direct key lookup in
the database!

Simplify the two query scripts: make the actual search code
common. Might split out into a separate module later, or even combine
the scripts.

find_file.cgi
find_file_db.pl

index 241a563..4986406 100755 (executable)
@@ -182,14 +182,21 @@ foreach my $area (@chosen_areas) {
     $l .= "Looking in area $area, file $db_file_name<br>\n";
     dbmopen(%fileinfo, "$db_file_name", 0000) ||
         log_error(500, "Failed to open db file: $!\n");
-    foreach my $file (keys %fileinfo) {
-        if ($file =~ $re_search) {
-            $count++;
-            push(@results, "$file $fileinfo{$file}");
-            if ($count >= $max_count) {
-                last;
+
+    if ($query_term =~ /[\*\?]/) {
+        # Will need to search through all the keys to allow for glob
+        foreach my $file (keys %fileinfo) {
+            if ($file =~ $re_search) {
+                $count++;
+                push(@results, "$file $fileinfo{$file}");
+                if ($count >= $max_count) {
+                    last;
+                }
             }
         }
+    } else {
+        # We've been given an exact name - do the exact key lookup \o/
+        push (@results, "$query_term $fileinfo{$query_term}");
     }
     if ($count >= $max_count) {
         last;
index 8d41f0a..36e9d3e 100755 (executable)
@@ -30,6 +30,7 @@ my %num_files;
 my %fileinfo;
 my %imageinfo;
 my @results;
+my $max_count = 1000;
 
 # Borrowed from Ikiwiki.pm
 sub glob2re ($) {
@@ -52,6 +53,7 @@ if (!defined($query_term) || !length($query_term)) {
     die "No query term specified!\n";
 }
 
+my $count = 0;
 my $re_search = glob2re($query_term);
 
 foreach my $area (@AREAS) {
@@ -59,16 +61,34 @@ foreach my $area (@AREAS) {
     my $db_file_name = "$dbdir/$area.db";
     dbmopen(%fileinfo, "$db_file_name", 0000) || 
         die "Failed to open db file: $!\n";
-    foreach my $file (keys %fileinfo) {
-        if ($file =~ $re_search) {
-            push(@results, "$file $fileinfo{$file}");
+
+    if ($query_term =~ /[\*\?]/) {
+        # Will need to search through all the keys to allow for glob
+        foreach my $file (keys %fileinfo) {
+            if ($file =~ $re_search) {
+                $count++;
+                push(@results, "$file $fileinfo{$file}");
+                if ($count >= $max_count) {
+                    last;
+                }
+            }
         }
+    } else {
+        # We've been given an exact name - do the exact key lookup \o/
+        push (@results, "$query_term $fileinfo{$query_term}");
+    }
+    if ($count >= $max_count) {
+        last;
     }
     dbmclose %fileinfo;
 }
 
-my $count = scalar(@results);
-print "$count results for \"$query_term\":\n";
+if ($count >= $max_count) {
+    print "More than $max_count results for \"$query_term\", showing the first $count only\n";
+} else {   
+    print "$count results for \"$query_term\":\n";
+}
+
 foreach my $result (sort (@results)) {
     my($found, @list) = split(' ', $result);
     print "  $found:\n";