aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-05-17 12:23:51 +0200
committerJohan Van Ryseghem2018-05-17 16:27:32 +0200
commite0864d754a0467addb39ce860b659818877bb9ec (patch)
tree89cfc91fb0bf34630cd88f7aee28263cbe41885c
parent488237c48b6174873470d7b6ce3d1465df46ba20 (diff)
downloadchouette-core-e0864d754a0467addb39ce860b659818877bb9ec.tar.bz2
Associate opposite_routes during merge (when available). Refs #6842
-rw-r--r--app/models/merge.rb23
-rw-r--r--spec/models/merge_spec.rb17
2 files changed, 36 insertions, 4 deletions
diff --git a/app/models/merge.rb b/app/models/merge.rb
index 2824e1f83..c8018e140 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -145,12 +145,19 @@ class Merge < ApplicationModel
end
end
+ referential_route_opposite_route_ids = referential.switch do
+ Hash[referential.routes.where('opposite_route_id is not null').pluck(:id, :opposite_route_id)]
+ end
+
referential_routing_constraint_zones_new_ids = {}
new.switch do
+ route_ids_mapping = {}
+
referential_routes.each do |route|
existing_route = new.routes.find_by line_id: route.line_id, checksum: route.checksum
if existing_route
+ route_ids_mapping[route.id] = existing_route.id
existing_route.merge_metadata_from route
else
objectid = Chouette::Route.where(objectid: route.objectid).exists? ? nil : route.objectid
@@ -179,6 +186,8 @@ class Merge < ApplicationModel
# We need to create StopPoints to known new primary keys
new_route.save!
+ route_ids_mapping[route.id] = new_route.id
+
old_stop_point_ids = route_stop_points.sort_by(&:position).map(&:id)
new_stop_point_ids = new_route.stop_points.sort_by(&:position).map(&:id)
@@ -225,6 +234,20 @@ class Merge < ApplicationModel
end
end
end
+
+ referential_route_opposite_route_ids.each do |route_id, opposite_route_id|
+ new_route_id = route_ids_mapping[route_id]
+ new_opposite_route_id = route_ids_mapping[opposite_route_id]
+
+ new_route = nil
+ if new_route_id && new_opposite_route_id
+ if new_route = new.routes.find_by(id: new_route_id)
+ new_route.update_column :opposite_route_id, new_opposite_route_id
+ end
+ end
+
+ Rails.logger.warn "Can't merge opposite route for Route #{route_id}" unless new_route
+ end
end
# JourneyPatterns
diff --git a/spec/models/merge_spec.rb b/spec/models/merge_spec.rb
index 59e2cc500..34df0fb4e 100644
--- a/spec/models/merge_spec.rb
+++ b/spec/models/merge_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Merge do
line_referential = FactoryGirl.create :line_referential
company = FactoryGirl.create :company, line_referential: line_referential
- 10.times { FactoryGirl.create :line, line_referential: line_referential, company: company, network: nil }
+ 4.times { FactoryGirl.create :line, line_referential: line_referential, company: company, network: nil }
workbench = FactoryGirl.create :workbench, line_referential: line_referential, stop_area_referential: stop_area_referential
@@ -19,7 +19,7 @@ RSpec.describe Merge do
organisation: workbench.organisation,
metadatas: [referential_metadata]
- factor = 1
+ factor = 2
stop_points_positions = {}
routing_constraint_zones = {}
@@ -32,7 +32,7 @@ RSpec.describe Merge do
end
end
- referential.routes.each do |route|
+ referential.routes.each_with_index do |route, index|
route.stop_points.each do |sp|
sp.set_list_position 0
end
@@ -47,9 +47,18 @@ RSpec.describe Merge do
routing_constraint_zones[route.id][constraint_zone.checksum] = constraint_zone
end
- route.reload.update_checksum!
+ if index.even?
+ route.wayback = :outbound
+ else
+ route.update_column :wayback, :inbound
+ route.opposite_route = route.opposite_route_candidates.sample
+ end
+
+ route.save!
+ route.reload.update_checksum!
expect(route.reload.checksum).to_not eq checksum
+
factor.times do
FactoryGirl.create :journey_pattern, route: route, stop_points: route.stop_points.sample(3)
end