diff options
author | Daniel Friesel <derf@finalrewind.org> | 2020-04-19 17:40:39 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2020-04-19 17:40:39 +0200 |
commit | 5ce4bc6995da0b49783c15a66075e5e4f1545875 (patch) | |
tree | aeea7da0654d49bf62f9ffb8ba0c2e75159b9087 /lib | |
parent | a3cfa598a6de9e053a5228be3ee5088ea0eabc18 (diff) |
improve commute station heuristic
Select top station on work days (Mo .. Fr) with arrival < 13:00 or
departure >= 13:00.
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/Travelynx.pm | 34 | ||||
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 27 |
2 files changed, 16 insertions, 45 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 7e7d850..7495b76 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -2720,40 +2720,6 @@ sub startup { ); $self->helper( - 'get_top_destinations' => sub { - my ( $self, %opt ) = @_; - my $uid = $opt{uid} //= $self->current_user->{id}; - my $db = $opt{db} //= $self->pg->db; - - my @stations; - - my $res = $db->query( - qq{ - select arr_eva, count(arr_eva) as count - from journeys_str - where user_id = ? - and real_dep_ts between ? and ? - group by arr_eva - order by count desc - limit 5 - }, $uid, $opt{after}->epoch, $opt{before}->epoch - ); - - for my $dest ( $res->hashes->each ) { - $self->app->log->debug( $dest->{arr_eva} ); - $self->app->log->debug( $dest->{count} ); - if ( my $station - = $self->app->station_by_eva->{ $dest->{arr_eva} } ) - { - push( @stations, $station ); - } - } - - return @stations; - } - ); - - $self->helper( 'get_connection_targets' => sub { my ( $self, %opt ) = @_; diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index db70368..1eef0c8 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -5,7 +5,7 @@ use DateTime; use DateTime::Format::Strptime; use JSON; use List::Util qw(uniq min max); -use List::UtilsBy qw(uniq_by); +use List::UtilsBy qw(max_by uniq_by); use List::MoreUtils qw(first_index); use Travel::Status::DE::IRIS::Stations; @@ -517,22 +517,27 @@ sub commute { ); my $interval_end = $interval_start->clone->add( years => 1 ); - if ( not $station ) { - my @top_station_ids = $self->get_top_destinations( - after => $interval_start, - before => $interval_end, - ); - if (@top_station_ids) { - $station = $top_station_ids[0][1]; - } - } - my @journeys = $self->get_user_travels( after => $interval_start, before => $interval_end, with_datetime => 1, ); + if ( not $station ) { + my %candidate_count; + for my $journey (@journeys) { + my $dep = $journey->{rt_departure}; + my $arr = $journey->{rt_arrival}; + if ( $arr->dow <= 5 and $arr->hour <= 12 ) { + $candidate_count{ $journey->{to_name} }++; + } + elsif ( $dep->dow <= 5 and $dep->hour > 12 ) { + $candidate_count{ $journey->{from_name} }++; + } + } + $station = max_by { $candidate_count{$_} } keys %candidate_count; + } + my %journeys_by_month; my %count_by_month; my $total = 0; |