1 { # Based on the change to Class::DBI in OpenILS::Application::Storage. This will
2 # allow us to use TSearch2 via a simple cdbi "search" interface.
3 #-------------------------------------------------------------------------------
10 if (ref($args[-1]) eq 'HASH') {
11 $args[-1]->{_placeholder} = "to_tsquery('default',?)";
13 push @args, {_placeholder => "to_tsquery('default',?)"};
15 $self->_do_search("@@" => @args);
19 { # Every driver needs to provide a 'compile()' method to OpenILS::Application::Storage::FTS.
20 # If that driver wants to support FTI, that is...
21 #-------------------------------------------------------------------------------
22 package OpenILS::Application::Storage::FTS;
23 use OpenSRF::Utils::Logger qw/:level/;
24 my $log = 'OpenSRF::Utils::Logger';
30 $self = ref($self) || $self;
31 $self = bless {} => $self;
33 $self->decompose($term);
35 my $newterm = join('&', $self->words);
38 $newterm = '('.$newterm.')&('. join('|', $self->nots) . ')';
41 $newterm = OpenILS::Application::Storage->driver->quote($newterm);
43 $self->{fts_query} = ["to_tsquery('default',$newterm)"];
44 $self->{fts_query_nots} = [];
45 $self->{fts_op} = '@@';
52 { # The driver package itself just needs a db_Main method for Class::DBI to call.
53 # any other fixups can go in here too... Also, the drivers should subclass the
54 # DBI driver that they are wrapping, or provide a 'quote()' method that calls
55 # the DBD::xxx::quote() method on FTI's behalf.
57 # The dirver MUST be a subclass of Class::DBI and OpenILS::Application::Storage.
58 #-------------------------------------------------------------------------------
59 package OpenILS::Application::Storage::Driver::Pg;
60 use base qw/Class::DBI OpenILS::Application::Storage/;
62 use OpenSRF::Utils::Logger qw/:level/;
63 my $log = 'OpenSRF::Utils::Logger';
65 __PACKAGE__->set_sql( retrieve_limited => 'SELECT * FROM __TABLE__ ORDER BY id LIMIT ?' );
72 $log->debug("Running child_init inside ".__PACKAGE__, INTERNAL);
79 return $_dbh if (defined $_dbh and $_dbh->ping);
81 my %attrs = ( %{$self->_default_attributes},
82 RootClass => 'DBIx::ContextualFetch',
83 ShowErrorStatement => 1,
89 FetchHashKeyName => 'NAME_lc',
93 $log->debug(" Default connect info for this DB is:\n\t".join("\n\t",map { "$_\t==> $$_db_params{$_}" } keys %$_db_params), INTERNAL);
94 $log->debug(" Default attributes for this DB connection are:\n\t".join("\n\t",map { "$_\t==> $attrs{$_}" } keys %attrs), INTERNAL);
96 $_dbh = DBI->connect( "dbi:Pg:host=$$_db_params{host};dbname=$$_db_params{db}",$$_db_params{user},$$_db_params{pw}, \%attrs );
97 $_dbh->do("SET CLIENT_ENCODING TO 'SQL_ASCII';");
103 return $_dbh->quote(@_)
106 sub tsearch2_trigger {
108 return unless ($self->value);
110 $self->db_Main->selectrow_array(
111 "SELECT to_tsvector('default',?);",
120 #---------------------------------------------------------------------
121 package asset::call_number;
123 asset::call_number->table( 'asset.call_number' );
124 asset::call_number->sequence( 'asset.call_number_id_seq' );
126 #---------------------------------------------------------------------
129 asset::copy->table( 'asset.copy' );
130 asset::copy->sequence( 'asset.copy_id_seq' );
132 #---------------------------------------------------------------------
133 package biblio::record_entry;
135 biblio::record_entry->table( 'biblio.record_entry' );
136 biblio::record_entry->sequence( 'biblio.record_entry_id_seq' );
138 #---------------------------------------------------------------------
139 package biblio::record_node;
141 biblio::record_node->table( 'biblio.record_data' );
142 biblio::record_node->sequence( 'biblio.record_data_id_seq' );
144 #---------------------------------------------------------------------
145 package biblio::record_note;
147 biblio::record_note->table( 'biblio.record_note' );
148 biblio::record_note->sequence( 'biblio.record_note_id_seq' );
150 #---------------------------------------------------------------------
153 actor::user->table( 'actor.usr' );
154 actor::user->sequence( 'actor.usr_id_seq' );
156 #---------------------------------------------------------------------
157 package actor::org_unit_type;
159 actor::org_unit_type->table( 'actor.org_unit_type' );
160 actor::org_unit_type->sequence( 'actor.org_unit_type_id_seq' );
162 #---------------------------------------------------------------------
164 #-------------------------------------------------------------------------------
165 package metabib::metarecord;
167 metabib::metarecord->table( 'metabib.metarecord' );
168 metabib::metarecord->sequence( 'metabib.metarecord_id_seq' );
170 #-------------------------------------------------------------------------------
172 #-------------------------------------------------------------------------------
173 package metabib::title_field_entry;
175 metabib::title_field_entry->table( 'metabib.title_field_entry' );
176 metabib::title_field_entry->sequence( 'metabib.title_field_entry_id_seq' );
177 metabib::title_field_entry->columns( Primary => qw/id/ );
178 metabib::title_field_entry->columns( Others => qw/field index_vector/ );
179 metabib::title_field_entry->columns( TEMP => qw/value/ );
181 metabib::title_field_entry->add_trigger(
182 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
184 metabib::title_field_entry->add_trigger(
185 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
188 #-------------------------------------------------------------------------------
190 #-------------------------------------------------------------------------------
191 package metabib::author_field_entry;
193 metabib::author_field_entry->table( 'metabib.author_field_entry' );
194 metabib::author_field_entry->sequence( 'metabib.author_field_entry_id_seq' );
195 metabib::author_field_entry->columns( Primary => qw/id/ );
196 metabib::author_field_entry->columns( Others => qw/field index_vector/ );
197 metabib::author_field_entry->columns( TEMP => qw/value/ );
199 metabib::author_field_entry->add_trigger(
200 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
202 metabib::author_field_entry->add_trigger(
203 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
206 #-------------------------------------------------------------------------------
208 #-------------------------------------------------------------------------------
209 package metabib::subject_field_entry;
211 metabib::subject_field_entry->table( 'metabib.subject_field_entry' );
212 metabib::subject_field_entry->sequence( 'metabib.subject_field_entry_id_seq' );
213 metabib::subject_field_entry->columns( Primary => qw/id/ );
214 metabib::subject_field_entry->columns( Others => qw/field index_vector/ );
215 metabib::subject_field_entry->columns( TEMP => qw/value/ );
217 metabib::subject_field_entry->add_trigger(
218 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
220 metabib::subject_field_entry->add_trigger(
221 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
224 #-------------------------------------------------------------------------------
226 #-------------------------------------------------------------------------------
227 package metabib::keyword_field_entry;
229 metabib::keyword_field_entry->table( 'metabib.keyword_field_entry' );
230 metabib::keyword_field_entry->sequence( 'metabib.keyword_field_entry_id_seq' );
231 metabib::keyword_field_entry->columns( Primary => qw/id/ );
232 metabib::keyword_field_entry->columns( Others => qw/field index_vector/ );
233 metabib::keyword_field_entry->columns( TEMP => qw/value/ );
235 metabib::keyword_field_entry->add_trigger(
236 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
238 metabib::keyword_field_entry->add_trigger(
239 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
242 #-------------------------------------------------------------------------------
244 #-------------------------------------------------------------------------------
245 package metabib::title_field_entry_source_map;
247 metabib::title_field_entry_source_map->table( 'metabib.title_field_entry_source_map' );
248 metabib::title_field_entry_source_map->table( 'metabib.title_field_entry_source_map_id_seq' );
250 #-------------------------------------------------------------------------------
252 #-------------------------------------------------------------------------------
253 package metabib::author_field_entry_source_map;
255 metabib::author_field_entry_source_map->table( 'metabib.author_field_entry_source_map' );
256 metabib::author_field_entry_source_map->sequence( 'metabib.author_field_entry_source_map_id_seq' );
258 #-------------------------------------------------------------------------------
260 #-------------------------------------------------------------------------------
261 package metabib::subject_field_entry_source_map;
263 metabib::subject_field_entry_source_map->table( 'metabib.subject_field_entry_source_map' );
264 metabib::subject_field_entry_source_map->sequence( 'metabib.subject_field_entry_source_map_id_seq' );
266 #-------------------------------------------------------------------------------