3 # Copyright ByWater Solutions 2014
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 3 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 use List::MoreUtils qw( none );
30 Koha::Objects - Koha Object set base class
35 my @objects = Koha::Objects->search({ borrowernumber => $borrowernumber});
39 This class must be subclassed.
47 =head3 Koha::Objects->new();
49 my $object = Koha::Objects->new();
57 bless( $self, $class );
60 =head3 Koha::Objects->_new_from_dbic();
62 my $object = Koha::Objects->_new_from_dbic( $resultset );
67 my ( $class, $resultset ) = @_;
68 my $self = { _resultset => $resultset };
70 bless( $self, $class );
73 =head3 Koha::Objects->find();
75 Similar to DBIx::Class::ResultSet->find this method accepts:
76 \%columns_values | @pk_values, { key => $unique_constraint, %attrs }?
77 Strictly speaking, columns_values should only refer to columns under an
80 my $object = Koha::Objects->find( { col1 => $val1, col2 => $val2 } );
81 my $object = Koha::Objects->find( $id );
82 my $object = Koha::Objects->find( $idpart1, $idpart2, $attrs ); # composite PK
87 my ( $self, @pars ) = @_;
89 croak 'Cannot use "->find" in list context' if wantarray;
91 return if !@pars || none { defined($_) } @pars;
93 my $result = $self->_resultset()->find( @pars );
95 return unless $result;
97 my $object = $self->object_class()->_new_from_dbic( $result );
102 =head3 Koha::Objects->find_or_create();
104 my $object = Koha::Objects->find_or_create( $attrs );
109 my ( $self, $params ) = @_;
111 my $result = $self->_resultset->find_or_create($params);
113 return unless $result;
115 my $object = $self->object_class->_new_from_dbic($result);
120 =head3 Koha::Objects->search();
122 my @objects = Koha::Objects->search($params);
127 my ( $self, $params, $attributes ) = @_;
130 my @dbic_rows = $self->_resultset()->search($params, $attributes);
132 return $self->_wrap(@dbic_rows);
136 my $class = ref($self) ? ref($self) : $self;
137 my $rs = $self->_resultset()->search($params, $attributes);
139 return $class->_new_from_dbic($rs);
143 =head3 search_related
145 my @objects = Koha::Objects->search_related( $rel_name, $cond?, \%attrs? );
146 my $objects = Koha::Objects->search_related( $rel_name, $cond?, \%attrs? );
148 Searches the specified relationship, optionally specifying a condition and attributes for matching records.
153 my ( $self, $rel_name, @params ) = @_;
155 return if !$rel_name;
157 my @dbic_rows = $self->_resultset()->search_related($rel_name, @params);
158 return if !@dbic_rows;
159 my $object_class = _get_objects_class( $dbic_rows[0]->result_class );
161 eval "require $object_class";
162 return _wrap( $object_class, @dbic_rows );
165 my $rs = $self->_resultset()->search_related($rel_name, @params);
167 my $object_class = _get_objects_class( $rs->result_class );
169 eval "require $object_class";
170 return _new_from_dbic( $object_class, $rs );
174 =head2 _build_query_params_from_api
176 my $params = _build_query_params_from_api( $filtered_params, $reserved_params );
178 Builds the params for searching on DBIC based on the selected matching algorithm.
179 Valid options are I<contains>, I<starts_with>, I<ends_with> and I<exact>. Default is
180 I<contains>. If other value is passed, a Koha::Exceptions::WrongParameter exception
185 sub _build_query_params_from_api {
187 my ( $filtered_params, $reserved_params ) = @_;
190 my $match = $reserved_params->{_match} // 'contains';
192 foreach my $param ( keys %{$filtered_params} ) {
193 if ( $match eq 'contains' ) {
195 { like => '%' . $filtered_params->{$param} . '%' };
197 elsif ( $match eq 'starts_with' ) {
198 $params->{$param} = { like => $filtered_params->{$param} . '%' };
200 elsif ( $match eq 'ends_with' ) {
201 $params->{$param} = { like => '%' . $filtered_params->{$param} };
203 elsif ( $match eq 'exact' ) {
204 $params->{$param} = $filtered_params->{$param};
207 Koha::Exceptions::WrongParameter->throw(
208 "Invalid value for _match param ($match)");
217 my $object = Koha::Objects->search({}, { rows => 1 })->single
219 Returns one and only one object that is part of this set.
220 Returns undef if there are no objects found.
222 This is optimal as it will grab the first returned result without instantiating
226 http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod#Retrieve_one_and_only_one_row_from_a_resultset
233 my $single = $self->_resultset()->single;
234 return unless $single;
236 return $self->object_class()->_new_from_dbic($single);
239 =head3 Koha::Objects->next();
241 my $object = Koha::Objects->next();
243 Returns the next object that is part of this set.
244 Returns undef if there are no more objects to return.
251 my $result = $self->_resultset()->next();
252 return unless $result;
254 my $object = $self->object_class()->_new_from_dbic( $result );
259 =head3 Koha::Objects->last;
261 my $object = Koha::Objects->last;
263 Returns the last object that is part of this set.
264 Returns undef if there are no object to return.
271 my $count = $self->_resultset->count;
272 return unless $count;
274 my ( $result ) = $self->_resultset->slice($count - 1, $count - 1);
276 my $object = $self->object_class()->_new_from_dbic( $result );
283 =head3 Koha::Objects->reset();
285 Koha::Objects->reset();
287 resets iteration so the next call to next() will start agein
288 with the first object in a set.
295 $self->_resultset()->reset();
300 =head3 Koha::Objects->as_list();
302 Koha::Objects->as_list();
304 Returns an arrayref of the objects in this set.
311 my @dbic_rows = $self->_resultset()->all();
313 my @objects = $self->_wrap(@dbic_rows);
315 return wantarray ? @objects : \@objects;
318 =head3 Koha::Objects->unblessed
320 Returns an unblessed representation of objects.
327 return [ map { $_->unblessed } $self->as_list ];
330 =head3 Koha::Objects->get_column
332 Return all the values of this set for a given column
337 my ($self, $column_name) = @_;
338 return $self->_resultset->get_column( $column_name )->all;
341 =head3 Koha::Objects->TO_JSON
343 Returns an unblessed representation of objects, suitable for JSON output.
350 return [ map { $_->TO_JSON } $self->as_list ];
353 =head3 Koha::Objects->_wrap
355 wraps the DBIC object in a corresponding Koha object
360 my ( $self, @dbic_rows ) = @_;
362 my @objects = map { $self->object_class->_new_from_dbic( $_ ) } @dbic_rows;
367 =head3 Koha::Objects->_resultset
369 Returns the internal resultset or creates it if undefined
377 $self->{_resultset} ||=
378 Koha::Database->new()->schema()->resultset( $self->_type() );
380 return $self->{_resultset};
383 return Koha::Database->new()->schema()->resultset( $self->_type() );
387 sub _get_objects_class {
391 if( $type->can('koha_objects_class') ) {
392 return $type->koha_objects_class;
394 $type =~ s|Schema::Result::||;
400 my @columns = Koha::Objects->columns
402 Return the table columns
408 return Koha::Database->new->schema->resultset( $class->_type )->result_source->columns;
413 The autoload method is used call DBIx::Class method on a resultset.
415 Important: If you plan to use one of the DBIx::Class methods you must provide
416 relevant tests in t/db_dependent/Koha/Objects.t
417 Currently count, pager, update and delete are covered.
422 my ( $self, @params ) = @_;
424 my @known_methods = qw( count is_paged pager update delete result_class single slice );
425 my $method = our $AUTOLOAD;
428 carp "The method $method is not covered by tests" and return unless grep {/^$method$/} @known_methods;
429 my $r = eval { $self->_resultset->$method(@params) };
431 carp "No method $method found for " . ref($self) . " " . $@;
439 The _type method must be set for all child classes.
440 The value returned by it should be the DBIC resultset name.
441 For example, for holds, _type should return 'Reserve'.
449 This method must be set for all child classes.
450 The value returned by it should be the name of the Koha
451 object class that is returned by this class.
452 For example, for holds, object_class should return 'Koha::Hold'.
462 Kyle M Hall <kyle@bywatersolutions.com>