aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-04-22 16:33:32 +0200
committerAlban Peignier2018-04-22 16:50:54 +0200
commite7710e8e81eef65f07c441d9efa0562e10b6284c (patch)
tree78ab204f0977567e0150c0be3c194f0973b5f4df
parent413eced76b245fb49cb04b9467a1589a8b388b55 (diff)
downloadchouette-core-e7710e8e81eef65f07c441d9efa0562e10b6284c.tar.bz2
Merge RoutingConstraintZones with Routes. Refs #6644
-rw-r--r--app/models/chouette/route.rb2
-rw-r--r--app/models/chouette/routing_constraint_zone.rb7
-rw-r--r--app/models/merge.rb36
3 files changed, 43 insertions, 2 deletions
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb
index a5eab3002..5e8049b58 100644
--- a/app/models/chouette/route.rb
+++ b/app/models/chouette/route.rb
@@ -148,7 +148,7 @@ module Chouette
values = self.slice(*['name', 'published_name', 'wayback']).values
values.tap do |attrs|
attrs << self.stop_points.sort_by(&:position).map{|sp| [sp.stop_area.user_objectid, sp.for_boarding, sp.for_alighting]}
- attrs << self.routing_constraint_zones.map(&:checksum)
+ attrs << self.routing_constraint_zones.map(&:checksum).sort
end
end
diff --git a/app/models/chouette/routing_constraint_zone.rb b/app/models/chouette/routing_constraint_zone.rb
index 886eadc6c..2cfb60bdd 100644
--- a/app/models/chouette/routing_constraint_zone.rb
+++ b/app/models/chouette/routing_constraint_zone.rb
@@ -1,6 +1,6 @@
module Chouette
class RoutingConstraintZone < Chouette::TridentActiveRecord
- has_metadata
+ # has_metadata
include ChecksumSupport
include ObjectidSupport
@@ -30,6 +30,11 @@ module Chouette
]
end
+ def update_route_checksum
+ route.update_checksum!
+ end
+ after_commit :update_route_checksum
+
def stop_points_belong_to_route
return unless route
diff --git a/app/models/merge.rb b/app/models/merge.rb
index 16a2bb9f3..323f0a817 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -135,6 +135,12 @@ class Merge < ApplicationModel
referential_stop_points_by_route = referential_stop_points.group_by(&:route_id)
+ referential_routes_constraint_zones = referential.switch do
+ referential.routing_constraint_zones.each_with_object(Hash.new { |h,k| h[k] = [] }) do |routing_constraint_zone, hash|
+ hash[routing_constraint_zone.route_id] << routing_constraint_zone
+ end
+ end
+
new.switch do
referential_routes.each do |route|
existing_route = new.routes.find_by line_id: route.line_id, checksum: route.checksum
@@ -164,6 +170,36 @@ class Merge < ApplicationModel
new_route.stop_points.build attributes
end
+ # We need to create StopPoints to known new primary keys
+ new_route.save!
+
+ 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)
+
+ stop_point_ids_mapping = Hash[[old_stop_point_ids, new_stop_point_ids].transpose]
+
+ # RoutingConstraintZones
+ routes_constraint_zones = referential_routes_constraint_zones[route.id]
+
+ routes_constraint_zones.each do |routing_constraint_zone|
+ objectid = new.routing_constraint_zones.where(objectid: routing_constraint_zone.objectid).exists? ? nil : routing_constraint_zone.objectid
+ stop_point_ids = routing_constraint_zone.stop_point_ids.map { |id| stop_point_ids_mapping[id] }.compact
+
+ if stop_point_ids.size != routing_constraint_zone.stop_point_ids.size
+ raise "Can't find all required StopPoints for RoutingConstraintZone #{routing_constraint_zone.inspect}"
+ end
+
+ attributes = routing_constraint_zone.attributes.merge(
+ id: nil,
+ route_id: nil,
+ objectid: objectid,
+ stop_point_ids: stop_point_ids,
+ )
+ new_route.routing_constraint_zones.build attributes
+
+ # No checksum check. RoutingConstraintZones are always recreated
+ end
+
new_route.save!
if new_route.checksum != route.checksum