#!/usr/bin/env perl use strict; use warnings; use TFLMonitor::Schema; use Path::Class; my $libdir=file(__FILE__)->parent; my $dbfile=$libdir->parent->file('monitor.db'); my $schema=TFLMonitor::Schema->connect( "dbi:SQLite:dbname=$dbfile", '','', { AutoCommit => 1, }); my $total_count=$schema->resultset('TFLMonitor::Schema::LineStatus') ->count; my $overall_rs=$schema->resultset('TFLMonitor::Schema::LineStatus') ->search(undef,{ '+select' => [ { count => '*' }, ], '+as' => ['count'], prefetch => [ 'status_code', ], group_by => [ 'status_code.code', ], order_by => { -asc => [ 'status_code.class','status_code.code' ], }, }); my %tot_per_class;my $last_class; while (my $ls=$overall_rs->next) { if ($last_class && $last_class ne $ls->status_code->class) { printf "%15s(%15s) %5.3f%%\n", '', $last_class, 100*$tot_per_class{$last_class}/$total_count; } printf "%-15s(%15s) %5.3f%%\n", $ls->status_code->description, $ls->status_code->class, 100*$ls->get_column('count')/$total_count; $last_class=$ls->status_code->class; $tot_per_class{$last_class}+=$ls->get_column('count'); } if ($last_class) { printf "%15s(%15s) %5.3f%%\n", '', $last_class, 100*$tot_per_class{$last_class}/$total_count; } print "\n"; my $count_per_line_rs=$schema->resultset('TFLMonitor::Schema::LineStatus') ->search(undef,{ '+select' => [ { count => '*' }, ], '+as' => [ 'count' ], prefetch => [ 'line_id', ], group_by => [ 'line_id' ], }); my %count_per_line=map { $_->line_id->name => $_->get_column('count') } $count_per_line_rs->all; my $per_line_rs=$schema->resultset('TFLMonitor::Schema::LineStatus') ->search(undef,{ '+select' => [ { count => '*' }, ], '+as' => ['count'], prefetch => [ 'line_id','status_code', ], group_by => [ 'line_id','status_code.code', ], order_by => { -asc => [ 'line_id','status_code.class','status_code.code' ], }, }); %tot_per_class=();my $last_line;$last_class=undef; while (my $ls=$per_line_rs->next) { if ($last_class && $last_class ne $ls->status_code->class) { printf "%-20s %15s(%15s) %5.3f%%\n", $last_line, '', $last_class, 100*$tot_per_class{$last_class}/$count_per_line{$last_line} } if ($last_line && $last_line ne $ls->line_id->name) { %tot_per_class=(); print "\n"; } printf "%-20s %-15s(%15s) %5.3f%%\n", $ls->line_id->name, $ls->status_code->description, $ls->status_code->class, 100*$ls->get_column('count')/$count_per_line{$ls->line_id->name}; $last_class=$ls->status_code->class; $tot_per_class{$last_class}+=$ls->get_column('count'); $last_line=$ls->line_id->name; } if ($last_class) { printf "%-20s %15s(%15s) %5.3f%%\n", $last_line, '', $last_class, 100*$tot_per_class{$last_class}/$count_per_line{$last_line}; }