108 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| package App::Netdisco::DB::ResultSet::DeviceModule;
 | |
| use base 'App::Netdisco::DB::ResultSet';
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| =head1 ADDITIONAL METHODS
 | |
| 
 | |
| =head2 search_by_field( \%cond, \%attrs? )
 | |
| 
 | |
| This variant of the standard C<search()> method returns a ResultSet of Device
 | |
| Module entries. It is written to support web forms which accept fields that
 | |
| match and locate Device Modules in the database.
 | |
| 
 | |
| The hashref parameter should contain fields from the Device Module table
 | |
| which will be intelligently used in a search query.
 | |
| 
 | |
| In addition, you can provide the key C<matchall> which, given a True or False
 | |
| value, controls whether fields must all match or whether any can match, to
 | |
| select a row.
 | |
| 
 | |
| Supported keys:
 | |
| 
 | |
| =over 4
 | |
| 
 | |
| =item matchall
 | |
| 
 | |
| If a True value, fields must all match to return a given row of the Device
 | |
| table, otherwise any field matching will cause the row to be included in
 | |
| results.
 | |
| 
 | |
| =item description
 | |
| 
 | |
| Can match the C<description> field as a substring.
 | |
| 
 | |
| =item name
 | |
| 
 | |
| Can match the C<name> field as a substring.
 | |
| 
 | |
| =item type
 | |
| 
 | |
| Can match the C<type> field as a substring.
 | |
| 
 | |
| =item model
 | |
| 
 | |
| Can match the C<model> field as a substring (case sensitive).
 | |
| 
 | |
| =item serial
 | |
| 
 | |
| Can match the C<serial> field as a substring (case sensitive).
 | |
| 
 | |
| =item class
 | |
| 
 | |
| Will match exactly the C<class> field.
 | |
| 
 | |
| =item ips
 | |
| 
 | |
| List of Device IPs containing modules.
 | |
| 
 | |
| =back
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub search_by_field {
 | |
|     my ( $rs, $p, $attrs ) = @_;
 | |
| 
 | |
|     die "condition parameter to search_by_field must be hashref\n"
 | |
|         if ref {} ne ref $p
 | |
|             or 0 == scalar keys %$p;
 | |
| 
 | |
|     my $op = $p->{matchall} ? '-and' : '-or';
 | |
| 
 | |
|     return $rs->search_rs( {}, $attrs )->search(
 | |
|         {   $op => [
 | |
|                 (   $p->{description}
 | |
|                     ? ( 'me.description' =>
 | |
|                             { '-ilike' => "\%$p->{description}\%" } )
 | |
|                     : ()
 | |
|                 ),
 | |
|                 (   $p->{name}
 | |
|                     ? ( 'me.name' => { '-ilike' => "\%$p->{name}\%" } )
 | |
|                     : ()
 | |
|                 ),
 | |
|                 (   $p->{type}
 | |
|                     ? ( 'me.type' => { '-ilike' => "\%$p->{type}\%" } )
 | |
|                     : ()
 | |
|                 ),
 | |
|                 (   $p->{model}
 | |
|                     ? ( 'me.model' => { '-like' => "\%$p->{model}\%" } )
 | |
|                     : ()
 | |
|                 ),
 | |
|                 (   $p->{serial}
 | |
|                     ? ( 'me.serial' => { '-like' => "\%$p->{serial}\%" } )
 | |
|                     : ()
 | |
|                 ),
 | |
| 
 | |
|                 (   $p->{class}
 | |
|                     ? ( 'me.class' => { '-in' => $p->{class} } )
 | |
|                     : ()
 | |
|                 ),
 | |
|                 ( $p->{ips} ? ( 'me.ip' => { '-in' => $p->{ips} } ) : () ),
 | |
|             ],
 | |
|         }
 | |
|     );
 | |
| }
 | |
| 
 | |
| 1;
 |