From 78b2d995ef32b60cfbde086953c5069e327e08a5 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 21 Apr 2019 15:46:19 +0200 Subject: Ignore stations without coordinates in distance calculation Reported by @marudor --- lib/Travelynx.pm | 38 ++++++++++++++++++++++++++++++++------ lib/Travelynx/Command/database.pm | 14 ++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 6ab89fe..caa4cba 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -479,6 +479,22 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} } ); + $self->helper( + 'numify_skipped_stations' => sub { + my ( $self, $count ) = @_; + + if ( $count == 0 ) { + return 'INTERNAL ERROR'; + } + if ( $count == 1 ) { + return +'Eine Station ohne Geokoordinaten wurde nicht berücksichtigt.'; + } + return +"${count} Stationen ohne Geookordinaten wurden nicht berücksichtigt."; + } + ); + $self->helper( 'get_departures' => sub { my ( $self, $station, $lookbehind ) = @_; @@ -1407,13 +1423,17 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} ? $ref->{rt_arrival}->epoch - $ref->{rt_departure}->epoch : undef; - $ref->{km_route} + my ( $km, $skip ) = $self->get_travel_distance( $ref->{from_name}, $ref->{to_name}, $ref->{route} ); - $ref->{km_beeline} + $ref->{km_route} = $km; + $ref->{skip_route} = $skip; + ( $km, $skip ) = $self->get_travel_distance( $ref->{from_name}, $ref->{to_name}, [ $ref->{from_name}, $ref->{to_name} ] ); + $ref->{km_beeline} = $km; + $ref->{skip_beeline} = $skip; my $kmh_divisor = ( $ref->{rt_duration} // $ref->{sched_duration} // 999999 ) / 3600; @@ -1531,6 +1551,7 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} my ( $self, $from, $to, $route_ref ) = @_; my $distance = 0; + my $skipped = 0; my $geo = Geo::Distance->new(); my @route = after_incl { $_ eq $from } @{$route_ref}; @route = before_incl { $_ eq $to } @route; @@ -1548,14 +1569,19 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} for my $station_name (@route) { if ( my $station = get_station($station_name) ) { - $distance - += $geo->distance( 'kilometer', $prev_station->[3], - $prev_station->[4], $station->[3], $station->[4] ); + if ( $#{$prev_station} >= 4 and $#{$station} >= 4 ) { + $distance + += $geo->distance( 'kilometer', $prev_station->[3], + $prev_station->[4], $station->[3], $station->[4] ); + } + else { + $skipped++; + } $prev_station = $station; } } - return $distance; + return ( $distance, $skipped ); } ); diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm index b8131eb..7a9aed3 100644 --- a/lib/Travelynx/Command/database.pm +++ b/lib/Travelynx/Command/database.pm @@ -123,6 +123,20 @@ my @migrations = ( } ); }, + + # v2 -> v3 + # A bug in the journey distance calculation caused excessive distances to be + # reported for routes covering stations without GPS coordinates. Ensure + # all caches are rebuilt. + sub { + my ($dbh) = @_; + return $dbh->do( + qq{ + delete from journey_stats; + update schema_version set version = 3; + } + ); + }, ); sub setup_db { -- cgit v1.2.3