diff options
author | ivan <ivan> | 2002-02-23 11:56:55 +0000 |
---|---|---|
committer | ivan <ivan> | 2002-02-23 11:56:55 +0000 |
commit | 903b22b3da3e3ee493bb322854c6bc0b0085e0dd (patch) | |
tree | f718d5b44a0d1205f663a094021fd00efc6e2de9 | |
parent | a41efaf444c779d415fa3e443254bd13b6edf925 (diff) |
case-insensitive and substring searching
-rw-r--r-- | CREDITS | 2 | ||||
-rw-r--r-- | FS/FS/Record.pm | 12 | ||||
-rw-r--r-- | httemplate/docs/index.html | 1 | ||||
-rwxr-xr-x | httemplate/search/cust_main.cgi | 63 | ||||
-rwxr-xr-x | httemplate/search/cust_main.html | 10 |
5 files changed, 64 insertions, 24 deletions
@@ -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 diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 020d14d8f..f30223351 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -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 ); } diff --git a/httemplate/docs/index.html b/httemplate/docs/index.html index 9e61d4f08..00c863b0c 100644 --- a/httemplate/docs/index.html +++ b/httemplate/docs/index.html @@ -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> diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi index 1e28ad57d..f153f02d4 100755 --- a/httemplate/search/cust_main.cgi +++ b/httemplate/search/cust_main.cgi @@ -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{$_}++; } diff --git a/httemplate/search/cust_main.html b/httemplate/search/cust_main.html index 1e91adee9..5a066e453 100755 --- a/httemplate/search/cust_main.html +++ b/httemplate/search/cust_main.html @@ -11,14 +11,18 @@ <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> |