From 5ce4bc6995da0b49783c15a66075e5e4f1545875 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 19 Apr 2020 17:40:39 +0200 Subject: [PATCH] improve commute station heuristic Select top station on work days (Mo .. Fr) with arrival < 13:00 or departure >= 13:00. --- lib/Travelynx.pm | 34 --------------------------- 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 @@ -2719,40 +2719,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;