summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2020-04-19 17:40:39 +0200
committerDaniel Friesel <derf@finalrewind.org>2020-04-19 17:40:39 +0200
commit5ce4bc6995da0b49783c15a66075e5e4f1545875 (patch)
treeaeea7da0654d49bf62f9ffb8ba0c2e75159b9087
parenta3cfa598a6de9e053a5228be3ee5088ea0eabc18 (diff)
improve commute station heuristic
Select top station on work days (Mo .. Fr) with arrival < 13:00 or departure >= 13:00.
-rwxr-xr-xlib/Travelynx.pm34
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm27
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;