Commit fd6d12d3 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Handle inconsistent data when calculating monthly/yearly stats

Closes #11
parent cc1a6200
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -1445,8 +1445,9 @@ sub startup {
			my $interchange_real = 0;
			my $num_trains       = 0;
			my $num_journeys     = 0;
			my @inconsistencies;

			my $next_departure = 0;
			my $next_departure = epoch_to_dt(0);

			for my $journey (@journeys) {
				$num_trains++;
@@ -1472,18 +1473,27 @@ sub startup {

				# Note that journeys are sorted from recent to older entries
				if (    $journey->{rt_arrival}
					and $next_departure
					and $next_departure - $journey->{rt_arrival}->epoch
					and $next_departure->epoch
					and $next_departure->epoch - $journey->{rt_arrival}->epoch
					< ( 60 * 60 ) )
				{
					if ( $next_departure->epoch - $journey->{rt_arrival}->epoch
						< 0 )
					{
						push( @inconsistencies,
							$next_departure->strftime('%d.%m.%Y %H:%M') );
					}
					else {
						$interchange_real
					  += ( $next_departure - $journey->{rt_arrival}->epoch )
						  += (  $next_departure->epoch
							  - $journey->{rt_arrival}->epoch )
						  / 60;
					}
				}
				else {
					$num_journeys++;
				}
				$next_departure = $journey->{rt_departure}->epoch;
				$next_departure = $journey->{rt_departure};
			}
			return {
				km_route             => $km_route,
@@ -1495,6 +1505,7 @@ sub startup {
				min_interchange_real => $interchange_real,
				delay_dep            => $delay_dep,
				delay_arr            => $delay_arr,
				inconsistencies      => \@inconsistencies,
			};
		}
	);
+13 −0
Original line number Diff line number Diff line
@@ -330,6 +330,19 @@ my @migrations = (
		}
		$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 {
+23 −0
Original line number Diff line number Diff line
% 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="col s12">
		<table class="striped">