aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZog2018-04-05 14:05:42 +0200
committerZog2018-04-05 14:05:42 +0200
commitbfe4bfa397c94ceeb4a86e93c0b9ac530d045de6 (patch)
tree9135a7442a303076b1f84c312347916efe34617e
parentb183db0b268d581cd06131f5094deff820e03483 (diff)
downloadchouette-core-bfe4bfa397c94ceeb4a86e93c0b9ac530d045de6.tar.bz2
Refs #6217; More flexilble implementation
-rw-r--r--app/models/chouette/vehicle_journey.rb45
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb12
2 files changed, 35 insertions, 22 deletions
diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb
index be05d4053..bad16b17a 100644
--- a/app/models/chouette/vehicle_journey.rb
+++ b/app/models/chouette/vehicle_journey.rb
@@ -346,27 +346,40 @@ module Chouette
end
end
- def fill_passing_time_at_borders
- encountered_borders = []
+ def fill_passing_times
+ encountered_empty_vjas = []
previous_stop = nil
vehicle_journey_at_stops.each do |vjas|
sp = vjas.stop_point
- if sp.stop_area.area_type == "border"
- encountered_borders << vjas
+ if vjas.arrival_time.nil? && vjas.departure_time.nil?
+ encountered_empty_vjas << vjas
else
- if encountered_borders.any?
- before_cost = journey_pattern.costs_between previous_stop.stop_point, encountered_borders.first.stop_point
- after_cost = journey_pattern.costs_between encountered_borders.last.stop_point, sp
- if before_cost && before_cost[:distance] && after_cost && after_cost[:distance]
- before_distance = before_cost[:distance].to_f
- after_distance = after_cost[:distance].to_f
- time = previous_stop.departure_time + before_distance / (before_distance+after_distance) * (vjas.arrival_time - previous_stop.departure_time)
- encountered_borders.each do |b|
- b.update_attribute :arrival_time, time
- b.update_attribute :departure_time, time
- end
+ if encountered_empty_vjas.any?
+ distance_between_known = 0
+ distance_from_last_known = 0
+ cost = journey_pattern.costs_between previous_stop.stop_point, encountered_empty_vjas.first.stop_point
+ raise "MISSING cost between #{previous_stop.stop_point.stop_area.registration_number} AND #{encountered_empty_vjas.first.stop_point.stop_area.registration_number}" unless cost.present?
+ distance_between_known += cost[:distance].to_f
+ cost = journey_pattern.costs_between encountered_empty_vjas.last.stop_point, sp
+ raise "MISSING cost between #{encountered_empty_vjas.last.stop_point.stop_area.registration_number} AND #{sp.stop_area.registration_number}" unless cost.present?
+ distance_between_known += cost[:distance].to_f
+ distance_between_known += encountered_empty_vjas.each_slice(2).inject(0) do |sum, slice|
+ cost = journey_pattern.costs_between slice.first.stop_point, slice.last.stop_point
+ raise "MISSING cost between #{slice.first.stop_point.stop_area.registration_number} AND #{slice.last.stop_point.stop_area.registration_number}" unless cost.present?
+ sum + cost[:distance].to_f
+ end
+
+ previous = previous_stop
+ encountered_empty_vjas.each do |empty_vjas|
+ cost = journey_pattern.costs_between previous.stop_point, empty_vjas.stop_point
+ raise "MISSING cost between #{previous.stop_point.stop_area.registration_number} AND #{empty_vjas.stop_point.stop_area.registration_number}" unless cost.present?
+ distance_from_last_known += cost[:distance]
+ time = previous_stop.departure_time + distance_from_last_known.to_f / distance_between_known.to_f * (vjas.arrival_time - previous_stop.departure_time)
+ empty_vjas.update_attribute :arrival_time, time
+ empty_vjas.update_attribute :departure_time, time
+ previous = empty_vjas
end
- encountered_borders = []
+ encountered_empty_vjas = []
end
previous_stop = vjas
end
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index ff457c57a..555dc2c1a 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -876,7 +876,7 @@ describe Chouette::VehicleJourney, :type => :model do
end
end
- describe "#fill_passing_time_at_borders" do
+ describe "#fill_passing_times" do
before do
start = create :stop_area
border = create :stop_area, kind: :non_commercial, area_type: :border
@@ -896,7 +896,7 @@ describe Chouette::VehicleJourney, :type => :model do
journey_pattern.stop_points << end_point = create(:stop_point, stop_area: _end, position: 6)
journey_pattern.update_attribute :costs, {
"#{start_point.stop_area_id}-#{border_point.stop_area_id}" => {distance: 50},
- "#{border_point.stop_area_id}-#{border_point_2.stop_area_id}" => {distance: 0},
+ "#{border_point.stop_area_id}-#{border_point_2.stop_area_id}" => {distance: 50},
"#{border_point_2.stop_area_id}-#{middle_point.stop_area_id}" => {distance: 100},
"#{middle_point.stop_area_id}-#{border_point_3.stop_area_id}" => {distance: 100},
"#{border_point_3.stop_area_id}-#{border_point_4.stop_area_id}" => {distance: 0},
@@ -914,11 +914,11 @@ describe Chouette::VehicleJourney, :type => :model do
end
it "should compute passing time" do
- @journey.reload.fill_passing_time_at_borders
- expect(@target.reload.arrival_time.to_i).to eq (@start.reload.departure_time + 1.0/3 * (@middle.reload.arrival_time - @start.departure_time)).to_i
- expect(@target_2.reload.arrival_time).to eq @target.arrival_time
+ @journey.reload.fill_passing_times
+ expect(@target.reload.arrival_time.to_i).to eq (@start.reload.departure_time + 1.0/4 * (@middle.reload.arrival_time - @start.departure_time)).to_i
+ expect(@target_2.reload.arrival_time.to_i).to eq (@start.reload.departure_time + 1.0/2 * (@middle.reload.arrival_time - @start.departure_time)).to_i
expect(@target.departure_time).to eq @target.arrival_time
- expect(@target_2.departure_time).to eq @target.arrival_time
+ expect(@target_2.departure_time).to eq @target_2.arrival_time
expect(@target_3.reload.arrival_time.to_i).to eq (@middle.reload.departure_time + 0.5 * (@end.reload.arrival_time - @middle.departure_time)).to_i
expect(@target_4.reload.arrival_time).to eq @target_3.arrival_time
expect(@target_3.departure_time).to eq @target_3.arrival_time