per jason: snap!
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 12 May 2005 23:12:00 +0000 (23:12 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 12 May 2005 23:12:00 +0000 (23:12 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@714 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/sql/Postgres/005.schema.actors.sql

index 4f4b930..4590e1b 100644 (file)
@@ -1,6 +1,6 @@
 package OpenILS::Application::Storage::Publisher::actor;
 use base qw/OpenILS::Application::Storage/;
-#use OpenILS::Application::Storage::CDBI::actor;
+use OpenILS::Application::Storage::CDBI::actor;
 use OpenSRF::Utils::Logger qw/:level/;
 use OpenILS::Utils::Fieldmapper;
 
@@ -30,6 +30,78 @@ __PACKAGE__->register_method(
        cachable        => 1,
 );
 
+
+sub patron_search {
+       my $self = shift;
+       my $client = shift;
+       my $search = shift;
+
+       # group 0 = user
+       # group 1 = address
+       # group 2 = phone, ident
+
+       my $usr = join ' AND ', map { "LOWER($_) ~ ?" } grep { ''.$$search{$_}{group} eq '0' } keys %$search;
+       my @usrv = map { "^$$search{$_}{value}" } grep { ''.$$search{$_}{group} eq '0' } keys %$search;
+
+       my $addr = join ' AND ', map { "LOWER($_) ~ " } grep { ''.$$search{$_}{group} eq '1' } keys %$search;
+       my @addrv = map { "^$$search{$_}{value}" } grep { ''.$$search{$_}{group} eq '1' } keys %$search;
+
+       my $pv = $$search{phone}{value};
+       my $iv = $$search{ident}{value};
+
+       my $phone = '';
+       my @ps;
+       my @phonev;
+       if ($pv) {
+               for my $p ( qw/day_phone evening_phone other_phone/ ) {
+                       push @ps, "LOWER($p) ~ ?";
+                       push @phonev, "^$pv";
+               }
+               $phone = '(' . join(' OR ', @ps) . ')';
+       }
+
+       my $ident = '';
+       my @is;
+       my @identv;
+       if ($pv) {
+               for my $i ( qw/ident_value ident_value2/ ) {
+                       push @is, "LOWER($i) ~ ?";
+                       push @identv, "^$iv";
+               }
+               $ident = '(' . join(' OR ', @is) . ')';
+       }
+
+       my $usr_where = join ' AND ', grep { $_ } ($usr,$phone,$ident);
+       my $addr_where = $addr;
+
+
+       my $u_table = actor::user->table;
+       my $a_table = actor::user_address->table;
+
+       my $u_select = "SELECT id FROM $u_table a WHERE $usr_where";
+       my $a_select = "SELECT usr FROM $a_table a WHERE $addr_where";
+
+       my $select = '';
+       if ($usr_where) {
+               if ($addr_where) {
+                       $select = "$u_select INTERSECT $a_select";
+               } else {
+                       $select = $u_select;
+               }
+       } elsif ($addr_where) {
+               $select = $a_select;
+       } else {
+               return undef;
+       }
+
+       return actor::user->db_Main->selectcol_arrayref($select, {}, @usrv,@phonev,@identv,@addrv);
+}
+__PACKAGE__->register_method(
+       api_name        => 'open-ils.storage.actor.user.crazy_search',
+       api_level       => 1,
+       method          => 'patron_search',
+);
+
 =comment not gonna use it...
 
 sub fleshed_search {
index 1686026..0b2443c 100644 (file)
@@ -162,6 +162,8 @@ sub search_class_fts {
        my $class = $self->{cdbi};
        my $search_table = $class->table;
 
+       my $metabib_metarecord = metabib::metarecord->table;
+       my $metabib_full_rec = metabib::full_rec->table;
        my $metabib_metarecord_source_map_table = metabib::metarecord_source_map->table;
        my $asset_call_number_table = asset::call_number->table;
        my $asset_copy_table = asset::copy->table;
@@ -169,7 +171,7 @@ sub search_class_fts {
        my ($index_col) = $class->columns('FTS');
        $index_col ||= 'value';
 
-       my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value', "$index_col");
+       my $fts = OpenILS::Application::Storage::FTS->compile($term, 'f.value', "f.$index_col");
 
        my $fts_where = $fts->sql_where_clause;
        my @fts_ranks = $fts->fts_rank;
@@ -208,8 +210,7 @@ sub search_class_fts {
                        $has_vols
                        $has_copies
                        $copies_visible
-                 GROUP BY 1
-                 $visible_count_test
+                 GROUP BY m.metarecord $visible_count_test
                  $rank_order
                  $limit_clause $offset_clause
        SQL
index 2d69dce..2a2aa5c 100644 (file)
@@ -44,6 +44,19 @@ CREATE INDEX actor_usr_home_ou_idx ON actor.usr (home_ou);
 CREATE INDEX actor_usr_mailing_address_idx ON actor.usr (mailing_address);
 CREATE INDEX actor_usr_billing_address_idx ON actor.usr (billing_address);
 
+CREATE INDEX actor_usr_first_given_name_idx ON actor.usr (lower(first_given_name));
+CREATE INDEX actor_usr_second_given_name_idx ON actor.usr (lower(second_given_name));
+CREATE INDEX actor_usr_family_name_idx ON actor.usr (lower(family_name));
+
+CREATE INDEX actor_usr_email_idx ON actor.usr (lower(email));
+
+CREATE INDEX actor_usr_day_phone_idx ON actor.usr (lower(day_phone));
+CREATE INDEX actor_usr_evening_phone_idx ON actor.usr (lower(evening_phone));
+CREATE INDEX actor_usr_other_phone_idx ON actor.usr (lower(other_phone));
+
+CREATE INDEX actor_usr_ident_value_idx ON actor.usr (lower(ident_value));
+CREATE INDEX actor_usr_ident_value2_idx ON actor.usr (lower(ident_value2));
+
 CREATE FUNCTION actor.crypt_pw_insert () RETURNS TRIGGER AS $$
        BEGIN
                NEW.passwd = MD5( NEW.passwd );
@@ -207,6 +220,14 @@ CREATE TABLE actor.usr_address (
        post_code       TEXT    NOT NULL
 );
 
+CREATE INDEX actor_usr_addr_street1_idx ON actor.usr_address (lower(street1));
+CREATE INDEX actor_usr_addr_street2_idx ON actor.usr_address (lower(street2));
+
+CREATE INDEX actor_usr_addr_city_idx ON actor.usr_address (lower(city));
+CREATE INDEX actor_usr_addr_state_idx ON actor.usr_address (lower(state));
+CREATE INDEX actor_usr_addr_post_code_idx ON actor.usr_address (lower(post_code));
+
+
 CREATE TABLE actor.org_address (
        id              SERIAL  PRIMARY KEY,
        valid           BOOL    NOT NULL DEFAULT TRUE,