The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::Netdisco::DB::Result::Virtual::SlowDevices;

use strict;
use warnings;

use base 'DBIx::Class::Core';

__PACKAGE__->table_class('DBIx::Class::ResultSource::View');

__PACKAGE__->table('slow_devices');
__PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
  SELECT a.action, a.device, a.started, a.finished,
      justify_interval(extract(epoch FROM (a.finished - a.started)) * interval '1 second') AS elapsed
    FROM admin a
    INNER JOIN (
      SELECT device, action, max(started) AS started
      FROM admin
      WHERE status = 'done'
        AND action IN ('discover','macsuck','arpnip')
      GROUP BY action, device
    ) b
    ON a.device = b.device AND a.started = b.started
    ORDER BY elapsed desc, action, device
    LIMIT 20
ENDSQL
);

__PACKAGE__->add_columns(
  "action",
  { data_type => "text", is_nullable => 1 },
  "device",
  { data_type => "inet", is_nullable => 1 },
  "started",
  { data_type => "timestamp", is_nullable => 1 },
  "finished",
  { data_type => "timestamp", is_nullable => 1 },
  "elapsed",
  { data_type => "interval", is_nullable => 1 },
);

1;