case-insensitive and substring searching
authorivan <ivan>
Sat, 23 Feb 2002 11:56:55 +0000 (11:56 +0000)
committerivan <ivan>
Sat, 23 Feb 2002 11:56:55 +0000 (11:56 +0000)
CREDITS
FS/FS/Record.pm
httemplate/docs/index.html
httemplate/search/cust_main.cgi
httemplate/search/cust_main.html

diff --git a/CREDITS b/CREDITS
index 2fd4078..f339628 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -59,7 +59,7 @@ export, cancel-unaudited.cgi), patches to support billing date modification,
 and probably other things too (sorry if I forgot them).  And yet even more
 bug squashing, thanks!  *and* he single-handedly implemented all the necessary
 work to get rid of svc_acct_sm and the "default domain"  thanks!!  and rewrote
-the financials!  wow, thanks jeff!
+the financials!  wow, thanks jeff!  and contributed financial reports!
 
 Kenny Elliott <kenny@neoserve.com> contributed ICRADIUS radreply table support,
 allowing attributes with ICRADIUS, helped fix many bugs, and some
index 020d14d..f302233 100644 (file)
@@ -180,7 +180,7 @@ sub create {
   }
 }
 
-=item qsearch TABLE, HASHREF, SELECT, EXTRA_SQL
+=item qsearch TABLE, HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ
 
 Searches the database for all records matching (at least) the key/value pairs
 in HASHREF.  Returns all the records found as `FS::TABLE' objects if that
@@ -214,6 +214,14 @@ sub qsearch {
   my $statement = "SELECT $select FROM $stable";
   if ( @fields ) {
     $statement .= ' WHERE '. join(' AND ', map {
+
+      my $op = '=';
+      if ( ref($record->{$_}) ) {
+        $op = $record->{$_}{'op'} if $record->{$_}{'op'};
+        $op = 'LIKE' if $op =~ /^ILIKE$/i && driver_name !~ /^Pg$/i;
+        $record->{$_} = $record->{$_}{'value'}
+      }
+
       if ( ! defined( $record->{$_} ) || $record->{$_} eq '' ) {
         if ( driver_name =~ /^Pg$/i ) {
           qq-( $_ IS NULL OR $_ = '' )-;
@@ -221,7 +229,7 @@ sub qsearch {
           qq-( $_ IS NULL OR $_ = "" )-;
         }
       } else {
-        "$_ = ?";
+        "$_ $op ?";
       }
     } @fields );
   }
index 9e61d4f..00c863b 100644 (file)
@@ -24,7 +24,6 @@
   <li><a href="signup.html">Signup server</a>
   <li><a href="session.html">Session monitor</a>
   <li><a href="billing.html">Billing</a>
-  <li><a href="trouble.html">Troubleshooting</a>
   <li><a href="schema.html">Schema reference</a>
   <li><a href="man/FS.html">Perl API</a>
 </ul>
index 1e28ad5..f153f02 100755 (executable)
@@ -398,24 +398,37 @@ sub lastsearch {
     or eidiot "Illegal last name";
   my($last)=$1;
 
-#  if ( $last_type{'Exact'}
-#       && ! $last_type{'Fuzzy'} 
-#     #  && ! $last_type{'Sound-alike'}
-#  ) {
+  if ( $last_type{'Exact'} || $last_type{'Fuzzy'} ) {
+    push @cust_main, qsearch( 'cust_main',
+                              { 'last' => { 'op'    => 'ILIKE',
+                                            'value' => $last    } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_last' => { 'op'    => 'ILIKE',
+                                                 'value' => $last    } } )
+      if defined dbdef->table('cust_main')->column('ship_last');
+  }
+
+  if ( $last_type{'Substring'} || $last_type{'All'} ) {
 
-    push @cust_main, qsearch('cust_main',{'last'=>$last});
+    push @cust_main, qsearch( 'cust_main',
+                              { 'last' => { 'op'    => 'ILIKE',
+                                            'value' => "%$last%" } } );
 
-    push @cust_main, qsearch('cust_main',{'ship_last'=>$last})
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_last' => { 'op'    => 'ILIKE',
+                                                 'value' => "%$last%" } } )
       if defined dbdef->table('cust_main')->column('ship_last');
 
-#  } else {
-  if ( $last_type{'Fuzzy'} ) {
+  }
+
+  if ( $last_type{'Fuzzy'} || $last_type{'All'} ) {
 
     &FS::cust_main::check_and_rebuild_fuzzyfiles;
     my $all_last = &FS::cust_main::all_last;
 
     my %last;
-    if ($last_type{'Fuzzy'}) { 
+    if ( $last_type{'Fuzzy'} || $last_type{'All'} ) { 
       foreach ( amatch($last, [ qw(i) ], @$all_last) ) {
         $last{$_}++; 
       }
@@ -431,6 +444,7 @@ sub lastsearch {
     }
 
   }
+
   \@cust_main;
 }
 
@@ -446,24 +460,37 @@ sub companysearch {
     or eidiot "Illegal company";
   my($company)=$1;
 
-#  if ( $company_type{'Exact'}
-#       && ! $company_type{'Fuzzy'} 
-#     #  && ! $company_type{'Sound-alike'}
-#  ) {
+  if ( $company_type{'Exact'} || $company_type{'Fuzzy'} ) {
+    push @cust_main, qsearch( 'cust_main',
+                              { 'company' => { 'op'    => 'ILIKE',
+                                               'value' => $company } } );
 
-    push @cust_main, qsearch('cust_main',{'company'=>$company});
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_company' => { 'op'    => 'ILIKE',
+                                                    'value' => $company } } )
+      if defined dbdef->table('cust_main')->column('ship_last');
+  }
+
+  if ( $company_type{'Substring'} || $company_type{'All'} ) {
 
-    push @cust_main, qsearch('cust_main',{'ship_company'=>$company})
+    push @cust_main, qsearch( 'cust_main',
+                              { 'company' => { 'op'    => 'ILIKE',
+                                               'value' => "%$company%" } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_company' => { 'op'    => 'ILIKE',
+                                                    'value' => "%$company%" } })
       if defined dbdef->table('cust_main')->column('ship_last');
 
-#  } else {
-  if ( $company_type{'Fuzzy'} ) {
+  }
+
+  if ( $company_type{'Fuzzy'} || $company_type{'All'} ) {
 
     &FS::cust_main::check_and_rebuild_fuzzyfiles;
     my $all_company = &FS::cust_main::all_company;
 
     my %company;
-    if ($company_type{'Fuzzy'}) { 
+    if ( $company_type{'Fuzzy'} || $company_type{'All'} ) { 
       foreach ( amatch($company, [ qw(i) ], @$all_company ) ) {
         $company{$_}++;
       }
index 1e91ade..5a066e4 100755 (executable)
       <INPUT TYPE="checkbox" NAME="last_on" CHECKED> Search for <B>last name</B>: 
       <INPUT TYPE="text" NAME="last_text">
       using search method: <SELECT NAME="last_type">
-        <OPTION SELECTED>Fuzzy
+        <OPTION SELECTED>All
+        <OPTION>Fuzzy
+        <OPTION>Substring
         <OPTION>Exact
       </SELECT>
 
       <P><INPUT TYPE="checkbox" NAME="company_on" CHECKED> Search for <B>company</B>: 
       <INPUT TYPE="text" NAME="company_text">
       using search methods: <SELECT NAME="company_type">
-        <OPTION SELECTED>Fuzzy
+        <OPTION SELECTED>All
+        <OPTION>Fuzzy
+        <OPTION>Substring
         <OPTION>Exact
       </SELECT>
 
@@ -28,7 +32,9 @@
 
   <HR>Explanation of search methods:
   <UL>
+    <LI><B>All</B> - Try all search methods.
     <LI><B>Fuzzy</B> - Searches for matches that are close to your text.
+    <LI><B>Substring</B> - Searches for matches that contain your text.
     <LI><B>Exact</B> - Finds exact matches only, but much faster than the other search methods.
   </UL>
   </BODY>