Commit 5ce4bc69 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

improve commute station heuristic

Select top station on work days (Mo .. Fr) with arrival < 13:00 or
departure >= 13:00.
parent a3cfa598
Loading
Loading
Loading
Loading
+0 −34
Original line number Diff line number Diff line
@@ -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 ) = @_;
+16 −11
Original line number Diff line number Diff line
@@ -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;