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;  | 
