optional case-insensitivity for searching
[bse.git] / site / cgi-bin / modules / BSE / Search / BSE.pm
index fc96c31..d759742 100644 (file)
@@ -2,6 +2,8 @@ package BSE::Search::BSE;
 use strict;
 use Constants qw(:search);
 
+our $VERSION = "1.001";
+
 use base 'BSE::Search::Base';
 
 sub new {
@@ -51,11 +53,13 @@ sub get_term_matches {
 }
 
 sub search {
-  my ($self, $words, $section, $date, $terms, $req) = @_;
+  my ($self, $words, $section, $date, $terms, $match_all, $req, $match_case) = @_;
 
   # canonical form
   $words =~ s/^\s+|\s+$//g;
 
+  $words = lc $words unless $match_case;
+
   # array of [ term, unquoted, required, weight ]
   my @terms;
   my @exclude;
@@ -88,6 +92,12 @@ sub search {
   
   @terms or return;
 
+  if ($match_all) {
+    for my $term (@terms) {
+      $term->[2] = 1;
+    }
+  }
+
   # if the user entered a plain multi-word phrase
   if ($words !~ /["'+-]/ && $words =~ /\s/) {
     # treat it as if they entered it in quotes as well
@@ -144,12 +154,12 @@ sub search {
   SWITCH: for ($date) {
     $_ eq 'ar' # been released
       && do {
-       $sql .= " and $now between release and expire";
+       $sql .= " and $now between \"release\" and expire";
        last SWITCH;
       };
     /^r(\d+)$/ # released in last N days
       && do {
-       $sql .= " and release > "._sql_date(time - $oneday * $1);
+       $sql .= " and \"release\" > "._sql_date(time - $oneday * $1);
        last SWITCH;
       };
     /^e(\d+)$/ # expired in last N days
@@ -170,6 +180,8 @@ sub search {
        };
   }
 
+  $sql .= " order by title";
+
   my $dh = BSE::DB->single;
 
   my $sth = $dh->{dbh}->prepare($sql)