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 warn " !!-> field list for OILSFastOrderedSearch is '$field_list'";
64 my $sth = $class->sql_OILSFastOrderedSearch( $field_list, $class->table, $field, $order->{order_by});
65 $sth->execute($value);
71 return map $class->construct($_), $self->fast_flesh_sth(@_)->fetchall_hash;
74 sub fast_fieldmapper {
76 my $class = ref($self) || $self;
77 my $fm_class = 'Fieldmapper::'.$class;
79 for my $hash ($self->fast_flesh_sth(@_)->fetchall_hash) {
80 my $fm = $fm_class->new;
81 for my $field ( keys %$hash ) {
82 $fm->$field( $$hash{$field} );
92 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
95 return $self->SUPER::retrieve("$arg");
100 my $class = ref($obj) || $obj;
102 my $fm_class = 'Fieldmapper::'.$class;
103 my $fm = $fm_class->new;
106 for my $field ( $fm->real_fields ) {
107 $fm->$field( $obj->$field );
118 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
119 return $self->create_from_fieldmapper($arg,@_);
122 return $self->SUPER::create($arg,@_);
125 sub create_from_fieldmapper {
130 my $class = ref($obj) || $obj;
133 my %hash = map { defined $fm->$_ ?
137 return $class->create( \%hash, @params );
147 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
148 $self = $self->modify_from_fieldmapper($arg);
151 $self->SUPER::update;
159 if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
160 $self = $self->retrieve($arg);
163 $self->SUPER::delete;
167 sub modify_from_fieldmapper {
171 my $class = ref($obj) || $obj;
174 $obj = $class->retieve($fm);
175 return undef unless ($obj);
178 my %hash = map { defined $fm->$_ ?
183 my $au = $obj->autoupdate;
186 for my $field ( keys %hash ) {
187 $obj->$field( $hash{$field} );
190 $obj->autoupdate($au);
197 #-------------------------------------------------------------------------------
198 asset::copy->has_a( call_number => 'asset::call_number' );
199 asset::copy->might_have( metadata => 'asset::copy_metadata' );
200 #-------------------------------------------------------------------------------
201 asset::copy_metadata->might_have( copy => 'asset::copy' );
202 #asset::copy_metadata->has_a( ciruclating_location => 'actor::org_unit');
203 #asset::copy_metadata->has_a( hold_radius => 'actor::org_unit_type');
204 #-------------------------------------------------------------------------------
205 asset::call_number->has_a( record => 'biblio::record_entry' );
206 asset::call_number->has_many( copies => 'asset::copy' );
207 #-------------------------------------------------------------------------------
210 #-------------------------------------------------------------------------------
211 biblio::record_note->has_a( record => 'biblio::record_entry' );
212 #-------------------------------------------------------------------------------
213 biblio::record_entry->has_many( notes => 'biblio::record_note' );
214 biblio::record_entry->has_many( nodes => 'biblio::record_node', { order_by => 'intra_doc_id' } );
215 biblio::record_entry->has_many( call_numbers => 'asset::call_number' );
217 # should we have just one field entry per class for each record???? (xslt vs xpath)
218 #biblio::record_entry->has_a( title_field_entries => 'metabib::title_field_entry' );
219 #biblio::record_entry->has_a( author_field_entries => 'metabib::author_field_entry' );
220 #biblio::record_entry->has_a( subject_field_entries => 'metabib::subject_field_entry' );
221 #biblio::record_entry->has_a( keyword_field_entries => 'metabib::keyword_field_entry' );
222 #-------------------------------------------------------------------------------
223 biblio::record_node->has_a( owner_doc => 'biblio::record_entry' );
224 #biblio::record_node->has_a(
225 # parent_node => 'biblio::record_node::subnode',
226 # inflate => sub { return biblio::record_node::subnode::_load(@_) }
228 #-------------------------------------------------------------------------------
230 #-------------------------------------------------------------------------------
231 #metabib::metarecord->has_a( master_record => 'biblio::record_entry' );
232 #-------------------------------------------------------------------------------
233 #metabib::title_field_entry->has_a( field => 'config::metabib_field_map' );
234 #-------------------------------------------------------------------------------
235 #metabib::author_field_entry->has_a( field => 'config::metabib_field_map' );
236 #-------------------------------------------------------------------------------
237 #metabib::subject_field_entry->has_a( field => 'config::metabib_field_map' );
238 #-------------------------------------------------------------------------------
239 #metabib::keyword_field_entry->has_a( field => 'config::metabib_field_map' );
240 #-------------------------------------------------------------------------------
243 # should we have just one field entry per class for each record???? (xslt vs xpath)
244 #metabib::title_field_entry_source_map->has_a( field_entry => 'metabib::title_field_entry' );
245 #metabib::title_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
246 #-------------------------------------------------------------------------------
247 #metabib::subject_field_entry_source_map->has_a( field_entry => 'metabib::subject_field_entry' );
248 #metabib::subject_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
249 #-------------------------------------------------------------------------------
250 #metabib::author_field_entry_source_map->has_a( field_entry => 'metabib::author_field_entry' );
251 #metabib::author_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
252 #-------------------------------------------------------------------------------
253 #metabib::keyword_field_entry_source_map->has_a( field_entry => 'metabib::keyword_field_entry' );
254 #metabib::keyword_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
255 #-------------------------------------------------------------------------------