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 | 
