Handle inconsistent data when calculating monthly/yearly stats

Closes #11
This commit is contained in:
Daniel Friesel 2019-04-28 22:33:09 +02:00
parent cc1a620041
commit fd6d12d355
3 changed files with 54 additions and 7 deletions

View file

@ -1445,8 +1445,9 @@ sub startup {
my $interchange_real = 0; my $interchange_real = 0;
my $num_trains = 0; my $num_trains = 0;
my $num_journeys = 0; my $num_journeys = 0;
my @inconsistencies;
my $next_departure = 0; my $next_departure = epoch_to_dt(0);
for my $journey (@journeys) { for my $journey (@journeys) {
$num_trains++; $num_trains++;
@ -1472,18 +1473,27 @@ sub startup {
# Note that journeys are sorted from recent to older entries # Note that journeys are sorted from recent to older entries
if ( $journey->{rt_arrival} if ( $journey->{rt_arrival}
and $next_departure and $next_departure->epoch
and $next_departure - $journey->{rt_arrival}->epoch and $next_departure->epoch - $journey->{rt_arrival}->epoch
< ( 60 * 60 ) ) < ( 60 * 60 ) )
{ {
if ( $next_departure->epoch - $journey->{rt_arrival}->epoch
< 0 )
{
push( @inconsistencies,
$next_departure->strftime('%d.%m.%Y %H:%M') );
}
else {
$interchange_real $interchange_real
+= ( $next_departure - $journey->{rt_arrival}->epoch ) += ( $next_departure->epoch
- $journey->{rt_arrival}->epoch )
/ 60; / 60;
} }
}
else { else {
$num_journeys++; $num_journeys++;
} }
$next_departure = $journey->{rt_departure}->epoch; $next_departure = $journey->{rt_departure};
} }
return { return {
km_route => $km_route, km_route => $km_route,
@ -1495,6 +1505,7 @@ sub startup {
min_interchange_real => $interchange_real, min_interchange_real => $interchange_real,
delay_dep => $delay_dep, delay_dep => $delay_dep,
delay_arr => $delay_arr, delay_arr => $delay_arr,
inconsistencies => \@inconsistencies,
}; };
} }
); );

View file

@ -330,6 +330,19 @@ my @migrations = (
} }
$db->update( 'schema_version', { version => 4 } ); $db->update( 'schema_version', { version => 4 } );
}, },
# v4 -> v5
# Handle inconsistent data (overlapping journeys) in statistics. Introduces
# the "inconsistencies" stats key -> rebuild all stats.
sub {
my ($db) = @_;
$db->query(
qq{
truncate journey_stats;
update schema_version set version = 5;
}
);
},
); );
sub setup_db { sub setup_db {

View file

@ -1,3 +1,26 @@
% if (@{$stats->{inconsistencies}}) {
<div class="row">
<div class="col s12">
<div class="card red darken-4">
<div class="card-content white-text">
<i class="material-icons small right">warning</i>
<span class="card-title">Inkonsistente Reisedaten</span>
<p>
Die folgenden Abfahrtszeiten liegen vor der Ankunftszeit der
vorherigen Zugfahrt und wurden bei der Wartezeitberechnung
ignoriert.
<ul>
% for my $date (@{$stats->{inconsistencies}}) {
<li><%= $date %></li>
% }
</ul>
</p>
</div>
</div>
</div>
</div>
% }
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">
<table class="striped"> <table class="striped">