1 package OpenILS::Application::Storage::CDBI;
4 use base qw/Class::DBI/;
6 use OpenILS::Utils::Fieldmapper;
11 use OpenILS::Application::Storage::CDBI::actor;
12 use OpenILS::Application::Storage::CDBI::asset;
13 use OpenILS::Application::Storage::CDBI::biblio;
14 use OpenILS::Application::Storage::CDBI::metabib;
19 __PACKAGE__->set_sql( 'OILSFastSearch', <<" SQL", 'Main');
25 __PACKAGE__->set_sql( 'OILSFastOrderedSearch', <<" SQL", 'Main');
32 $self->SUPER::child_init(@_);
38 $class = ref($class) || $class;
44 if (!(defined($order) and ref($order) and ref($order) eq 'HASH')) {
45 if (defined($value) and ref($order) and ref($order) eq 'HASH') {
48 $field = $class->primary_column;
50 $order = { order_by => 'id' }
54 unless (defined $value) {
56 $field = $class->primary_column;
59 my $fm_class = 'Fieldmapper::'.$class;
60 my $field_list = join ',', $class->columns('All');
62 my $sth = $class->sql_OILSFastOrderedSearch( $field_list, $class->table, $field, $order->{order_by});
63 $sth->execute($value);
69 return map $class->construct($_), $self->fast_flesh_sth(@_)->fetchall_hash;
72 sub fast_fieldmapper {
74 my $class = ref($self) || $self;
75 my $fm_class = 'Fieldmapper::'.$class;
77 for my $hash ($self->fast_flesh_sth(@_)->fetchall_hash) {
78 my $fm = $fm_class->new;
79 for my $field ( keys %$hash ) {
80 $fm->$field( $$hash{$field} );
90 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
93 return $self->SUPER::retrieve("$arg");
98 my $class = ref($obj) || $obj;
100 my $fm_class = 'Fieldmapper::'.$class;
101 my $fm = $fm_class->new;
104 for my $field ( $fm->real_fields ) {
105 $fm->$field( $obj->$field );
116 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
117 return $self->create_from_fieldmapper($arg,@_);
120 return $self->SUPER::create($arg,@_);
123 sub create_from_fieldmapper {
128 my $class = ref($obj) || $obj;
131 my %hash = map { defined $fm->$_ ?
135 return $class->create( \%hash, @params );
145 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
146 $self = $self->modify_from_fieldmapper($arg);
149 $self->SUPER::update;
157 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
158 $self = $self->retrieve($arg);
161 $self->SUPER::delete;
165 sub modify_from_fieldmapper {
169 my $class = ref($obj) || $obj;
172 $obj = $class->retieve($fm);
173 return undef unless ($obj);
176 my %hash = map { defined $fm->$_ ?
181 my $au = $obj->autoupdate;
184 for my $field ( keys %hash ) {
185 $obj->$field( $hash{$field} );
188 $obj->autoupdate($au);
195 #-------------------------------------------------------------------------------
196 asset::copy->has_a( call_number => 'asset::call_number' );
197 asset::copy->might_have( metadata => 'asset::copy_metadata' );
198 #-------------------------------------------------------------------------------
199 asset::copy_metadata->might_have( copy => 'asset::copy' );
200 #asset::copy_metadata->has_a( ciruclating_location => 'actor::org_unit');
201 #asset::copy_metadata->has_a( hold_radius => 'actor::org_unit_type');
202 #-------------------------------------------------------------------------------
203 asset::call_number->has_a( record => 'biblio::record_entry' );
204 asset::call_number->has_many( copies => 'asset::copy' );
205 #-------------------------------------------------------------------------------
208 #-------------------------------------------------------------------------------
209 biblio::record_note->has_a( record => 'biblio::record_entry' );
210 #-------------------------------------------------------------------------------
211 biblio::record_entry->has_many( notes => 'biblio::record_note' );
212 biblio::record_entry->has_many( nodes => 'biblio::record_node', { order_by => 'intra_doc_id' } );
213 biblio::record_entry->has_many( call_numbers => 'asset::call_number' );
215 # should we have just one field entry per class for each record???? (xslt vs xpath)
216 #biblio::record_entry->has_a( title_field_entries => 'metabib::title_field_entry' );
217 #biblio::record_entry->has_a( author_field_entries => 'metabib::author_field_entry' );
218 #biblio::record_entry->has_a( subject_field_entries => 'metabib::subject_field_entry' );
219 #biblio::record_entry->has_a( keyword_field_entries => 'metabib::keyword_field_entry' );
220 #-------------------------------------------------------------------------------
221 biblio::record_node->has_a( owner_doc => 'biblio::record_entry' );
222 #biblio::record_node->has_a(
223 # parent_node => 'biblio::record_node::subnode',
224 # inflate => sub { return biblio::record_node::subnode::_load(@_) }
226 #-------------------------------------------------------------------------------
228 #-------------------------------------------------------------------------------
229 #metabib::metarecord->has_a( master_record => 'biblio::record_entry' );
230 #-------------------------------------------------------------------------------
231 #metabib::title_field_entry->has_a( field => 'config::metabib_field_map' );
232 #-------------------------------------------------------------------------------
233 #metabib::author_field_entry->has_a( field => 'config::metabib_field_map' );
234 #-------------------------------------------------------------------------------
235 #metabib::subject_field_entry->has_a( field => 'config::metabib_field_map' );
236 #-------------------------------------------------------------------------------
237 #metabib::keyword_field_entry->has_a( field => 'config::metabib_field_map' );
238 #-------------------------------------------------------------------------------
241 # should we have just one field entry per class for each record???? (xslt vs xpath)
242 #metabib::title_field_entry_source_map->has_a( field_entry => 'metabib::title_field_entry' );
243 #metabib::title_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
244 #-------------------------------------------------------------------------------
245 #metabib::subject_field_entry_source_map->has_a( field_entry => 'metabib::subject_field_entry' );
246 #metabib::subject_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
247 #-------------------------------------------------------------------------------
248 #metabib::author_field_entry_source_map->has_a( field_entry => 'metabib::author_field_entry' );
249 #metabib::author_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
250 #-------------------------------------------------------------------------------
251 #metabib::keyword_field_entry_source_map->has_a( field_entry => 'metabib::keyword_field_entry' );
252 #metabib::keyword_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
253 #-------------------------------------------------------------------------------