diff --git a/lib/App/Netdisco/DB/Result/DevicePort.pm b/lib/App/Netdisco/DB/Result/DevicePort.pm index ed2bbe27..aef84ed7 100644 --- a/lib/App/Netdisco/DB/Result/DevicePort.pm +++ b/lib/App/Netdisco/DB/Result/DevicePort.pm @@ -250,24 +250,13 @@ The JOIN is of type "LEFT" in case there isn't any such node. =cut -__PACKAGE__->belongs_to( last_node => 'App::Netdisco::DB::Result::Node', - sub { - my $args = shift; - return { - "$args->{foreign_alias}.mac" => { '=' => - $args->{self_resultsource}->schema->resultset('Node')->search({ - switch => { -ident => "$args->{self_alias}.ip"}, - port => { -ident => "$args->{self_alias}.port"} - },{ - rows => 1, - order_by => { -desc => ['time_last'] }, - columns => 'mac', - alias => 'lastnodesub' - })->as_query - } - }; - }, - { join_type => 'LEFT' }, +__PACKAGE__->belongs_to( + last_node => 'App::Netdisco::DB::Result::Virtual::LastNode', { + 'foreign.switch' => 'self.ip', + 'foreign.port' => 'self.port', + }, { + join_type => 'LEFT', + } ); =head2 vlans diff --git a/lib/App/Netdisco/DB/Result/Virtual/LastNode.pm b/lib/App/Netdisco/DB/Result/Virtual/LastNode.pm new file mode 100644 index 00000000..8385a8ab --- /dev/null +++ b/lib/App/Netdisco/DB/Result/Virtual/LastNode.pm @@ -0,0 +1,54 @@ +package App::Netdisco::DB::Result::Virtual::LastNode; + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); + +__PACKAGE__->table('last_node'); +__PACKAGE__->result_source_instance->is_virtual(1); +__PACKAGE__->result_source_instance->view_definition(<add_columns( + "mac", + { data_type => "macaddr", is_nullable => 0 }, + "switch", + { data_type => "inet", is_nullable => 0 }, + "port", + { data_type => "text", is_nullable => 0 }, + "active", + { data_type => "boolean", is_nullable => 1 }, + "oui", + { data_type => "varchar", is_nullable => 1, size => 8 }, + "time_first", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 1, + original => { default_value => \"now()" }, + }, + "time_recent", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 1, + original => { default_value => \"now()" }, + }, + "time_last", + { + data_type => "timestamp", + default_value => \"current_timestamp", + is_nullable => 1, + original => { default_value => \"now()" }, + }, + "vlan", + { data_type => "text", is_nullable => 0, default_value => '0' }, +); + +1; diff --git a/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm b/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm index f0f0638e..c822c114 100644 --- a/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm +++ b/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm @@ -23,22 +23,17 @@ __PACKAGE__->result_source_instance->view_definition(< ?::interval) ) THEN 1 WHEN ( dp.type != 'propVirtual' AND dp.up_admin = 'up' AND dp.up != 'up' - AND (last_node.time_last IS NULL OR - (age(now(), to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)) > ?::interval)) ) + AND (age(now(), to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)) > ?::interval) ) THEN 1 ELSE 0 END) as ports_free FROM device d LEFT JOIN device_port dp ON d.ip = dp.ip - LEFT JOIN node last_node - ON last_node.mac = ( - SELECT lastnodesub.mac - FROM node lastnodesub - WHERE port = dp.port AND switch = dp.ip - ORDER BY time_last DESC - LIMIT '1' - ) + LEFT JOIN + ( SELECT DISTINCT ON (switch, port) * FROM node + ORDER BY switch, port, time_last desc ) AS last_node + ON dp.port = last_node.port AND dp.ip = last_node.switch GROUP BY d.dns, d.ip ORDER BY d.dns, d.ip ENDSQL