diff options
| author | Alban Peignier | 2018-04-22 16:33:32 +0200 |
|---|---|---|
| committer | Alban Peignier | 2018-04-22 16:50:54 +0200 |
| commit | e7710e8e81eef65f07c441d9efa0562e10b6284c (patch) | |
| tree | 78ab204f0977567e0150c0be3c194f0973b5f4df | |
| parent | 413eced76b245fb49cb04b9467a1589a8b388b55 (diff) | |
| download | chouette-core-e7710e8e81eef65f07c441d9efa0562e10b6284c.tar.bz2 | |
Merge RoutingConstraintZones with Routes. Refs #6644
| -rw-r--r-- | app/models/chouette/route.rb | 2 | ||||
| -rw-r--r-- | app/models/chouette/routing_constraint_zone.rb | 7 | ||||
| -rw-r--r-- | app/models/merge.rb | 36 |
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 |
