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;
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 {
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;
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;
$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
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 );
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,