should be faster than using IN on large lists
This commit is contained in:
33
lib/App/Netdisco/DB/Result/Virtual/PortMacs.pm
Normal file
33
lib/App/Netdisco/DB/Result/Virtual/PortMacs.pm
Normal file
@@ -0,0 +1,33 @@
|
||||
use utf8;
|
||||
package App::Netdisco::DB::Result::Virtual::PortMacs;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use base 'DBIx::Class::Core';
|
||||
|
||||
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
|
||||
|
||||
__PACKAGE__->table("port_macs");
|
||||
__PACKAGE__->result_source_instance->is_virtual(1);
|
||||
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
|
||||
SELECT all.ip, all.mac
|
||||
|
||||
FROM
|
||||
(SELECT ip, mac FROM device
|
||||
UNION
|
||||
SELECT ip, mac FROM device_port) all
|
||||
|
||||
INNER JOIN
|
||||
(SELECT unnest( ? )) locals(m)
|
||||
ON (all.mac = locals.m ::macaddr)
|
||||
|
||||
ENDSQL
|
||||
);
|
||||
|
||||
__PACKAGE__->add_columns(
|
||||
'mac' => { data_type => 'macaddr' },
|
||||
'ip' => { data_type => 'inet' },
|
||||
);
|
||||
|
||||
1;
|
||||
@@ -33,22 +33,11 @@ sub get_port_macs {
|
||||
my $port_macs = {};
|
||||
return {} unless defined $fw_mac_list and ref [] eq ref $fw_mac_list;
|
||||
|
||||
my $dp_macs
|
||||
= schema('netdisco')->resultset('DevicePort')
|
||||
->search( { mac => { '-in' => $fw_mac_list } },
|
||||
{ select => [ 'mac', 'ip' ],
|
||||
group_by => [ 'mac', 'ip' ] } );
|
||||
my $dp_cursor = $dp_macs->cursor;
|
||||
while ( my @vals = $dp_cursor->next ) {
|
||||
$port_macs->{ $vals[0] } = $vals[1];
|
||||
}
|
||||
|
||||
my $d_macs
|
||||
= schema('netdisco')->resultset('Device')
|
||||
->search( { mac => { '-in' => $fw_mac_list } },
|
||||
{ select => [ 'mac', 'ip' ] } );
|
||||
my $d_cursor = $d_macs->cursor;
|
||||
while ( my @vals = $d_cursor->next ) {
|
||||
my $macs
|
||||
= schema('netdisco')->resultset('Virtual::PortMacs')->search({},
|
||||
{ bind => [$fw_mac_list], select => [ 'mac', 'ip' ], group_by => [ 'mac', 'ip' ] } );
|
||||
my $cursor = $macs->cursor;
|
||||
while ( my @vals = $cursor->next ) {
|
||||
$port_macs->{ $vals[0] } = $vals[1];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user