diff options
| author | Alban Peignier | 2018-04-25 22:08:53 +0200 | 
|---|---|---|
| committer | GitHub | 2018-04-25 22:08:53 +0200 | 
| commit | 1434331621f3677ba825da6dc44d438a7df99b70 (patch) | |
| tree | dac15a363ed08962329038c8ea44b7daa67a20be | |
| parent | 9fec2b10fa947047e9a8a2f354d232c402b1ef40 (diff) | |
| parent | 5c6718314cbbe3c36fd9343b1ea78124dd2189d3 (diff) | |
| download | chouette-core-1434331621f3677ba825da6dc44d438a7df99b70.tar.bz2 | |
Merge pull request #524 from af83/6762-merge-ignored_routing_contraint_zones
Merge VehicleJourney ignored_routing_contraint_zone_ids. Refs #6762 
| -rw-r--r-- | app/models/chouette/route.rb | 6 | ||||
| -rw-r--r-- | app/models/chouette/routing_constraint_zone.rb | 7 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 2 | ||||
| -rw-r--r-- | app/models/merge.rb | 31 | ||||
| -rw-r--r-- | db/migrate/20180425160730_change_routing_constraint_zones_stop_ids_type.rb | 8 | ||||
| -rw-r--r-- | spec/models/merge_spec.rb | 35 | 
6 files changed, 81 insertions, 8 deletions
| diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb index 928b65f13..0fac53ec0 100644 --- a/app/models/chouette/route.rb +++ b/app/models/chouette/route.rb @@ -148,11 +148,15 @@ 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).sort + +        routing_constraint_zones = self.routing_constraint_zones +        routing_constraint_zones += Chouette::RoutingConstraintZone.with_stop_points_contained_in(self.stop_points) unless self.new_record? +        attrs << routing_constraint_zones.uniq.map(&:checksum).sort        end      end      has_checksum_children StopPoint +    has_checksum_children RoutingConstraintZone      def geometry        points = stop_areas.map(&:to_lat_lng).compact.map do |loc| diff --git a/app/models/chouette/routing_constraint_zone.rb b/app/models/chouette/routing_constraint_zone.rb index 6b7c228b0..671ce2871 100644 --- a/app/models/chouette/routing_constraint_zone.rb +++ b/app/models/chouette/routing_constraint_zone.rb @@ -7,6 +7,13 @@ module Chouette      belongs_to :route      has_array_of :stop_points, class_name: 'Chouette::StopPoint' +    belongs_to_array_in_many :vehicle_journeys, class_name: 'Chouette::VehicleJourney', array_name: :ignored_routing_contraint_zones + +    def update_vehicle_journey_checksums +      vehicle_journeys.each(&:update_checksum!) +    end +    after_save :update_vehicle_journey_checksums +      validates_presence_of :name, :stop_points, :route_id      # validates :stop_point_ids, length: { minimum: 2, too_short: I18n.t('activerecord.errors.models.routing_constraint_zone.attributes.stop_points.not_enough_stop_points') }      validate :stop_points_belong_to_route, :not_all_stop_points_selected diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index b5476c210..74d875164 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -25,6 +25,7 @@ module Chouette      has_and_belongs_to_many :footnotes, :class_name => 'Chouette::Footnote'      has_and_belongs_to_many :purchase_windows, :class_name => 'Chouette::PurchaseWindow' +    has_array_of :ignored_routing_contraint_zones, class_name: 'Chouette::RoutingConstraintZone'      validates_presence_of :route      validates_presence_of :journey_pattern @@ -146,6 +147,7 @@ module Chouette          attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort          attrs << self.purchase_windows.map(&:checksum).sort if purchase_windows.present? +        attrs << ignored_routing_contraint_zones.map(&:checksum).sort if ignored_routing_contraint_zones.present?        end      end diff --git a/app/models/merge.rb b/app/models/merge.rb index 7df7aa590..be1bbedcb 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -135,12 +135,14 @@ 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 +    referential_routing_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.checksum] = routing_constraint_zone        end      end +    referential_routing_constraint_zones_new_ids = {} +      new.switch do        referential_routes.each do |route|          existing_route = new.routes.find_by line_id: route.line_id, checksum: route.checksum @@ -179,9 +181,9 @@ class Merge < ApplicationModel            stop_point_ids_mapping = Hash[[old_stop_point_ids, new_stop_point_ids].transpose]            # RoutingConstraintZones -          routes_constraint_zones = referential_routes_constraint_zones[route.id] +          routing_constraint_zones = referential_routing_constraint_zones[route.id] -          routes_constraint_zones.each do |routing_constraint_zone| +          routing_constraint_zones.values.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 @@ -197,7 +199,6 @@ class Merge < ApplicationModel              )              new_route.routing_constraint_zones.build attributes -            # No checksum check. RoutingConstraintZones are always recreated            end            new_route.save! @@ -205,6 +206,19 @@ class Merge < ApplicationModel            if new_route.checksum != route.checksum              raise "Checksum has changed: \"#{route.checksum}\", \"#{route.checksum_source}\" -> \"#{new_route.checksum}\", \"#{new_route.checksum_source}\""            end + +          if new_route.routing_constraint_zones.map(&:checksum).sort != routing_constraint_zones.keys.sort +            raise "Checksum has changed in RoutingConstraintZones: \"#{new_route.routing_constraint_zones.map(&:checksum).sort}\" -> \"#{route.routing_constraint_zones.map(&:checksum).sort}\"" +          end + +          new_route.routing_constraint_zones.each do |new_routing_constraint_zone| +            routing_constraint_zone = routing_constraint_zones[new_routing_constraint_zone.checksum] +            if routing_constraint_zone +              referential_routing_constraint_zones_new_ids[routing_constraint_zone.id] = new_routing_constraint_zone.id +            else +              raise "Can't find RoutingConstraintZone for checksum #{new_routing_constraint_zone.checksum} into #{routing_constraint_zones.inspect}" +            end +          end          end        end      end @@ -311,6 +325,7 @@ class Merge < ApplicationModel              # all other primary must be changed              route_id: existing_associated_journey_pattern.route_id,              journey_pattern_id: existing_associated_journey_pattern.id, +            ignored_routing_contraint_zone_ids: []            )            new_vehicle_journey = new.vehicle_journeys.build attributes @@ -350,10 +365,12 @@ class Merge < ApplicationModel              new_vehicle_journey.purchase_windows << associated_purchase_window            end +          # Rewrite ignored_routing_contraint_zone_ids +          new_vehicle_journey.ignored_routing_contraint_zone_ids = referential_routing_constraint_zones_new_ids.values_at(*vehicle_journey.ignored_routing_contraint_zone_ids).compact            new_vehicle_journey.save!            if new_vehicle_journey.checksum != vehicle_journey.checksum -            raise "Checksum has changed: #{vehicle_journey.checksum_source} #{new_vehicle_journey.checksum_source}" +            raise "Checksum has changed: \"#{vehicle_journey.checksum_source}\" \"#{vehicle_journey.checksum}\" -> \"#{new_vehicle_journey.checksum_source}\" \"#{new_vehicle_journey.checksum}\""            end            new_vehicle_journey_ids[vehicle_journey.id] = new_vehicle_journey.id diff --git a/db/migrate/20180425160730_change_routing_constraint_zones_stop_ids_type.rb b/db/migrate/20180425160730_change_routing_constraint_zones_stop_ids_type.rb new file mode 100644 index 000000000..1e4224186 --- /dev/null +++ b/db/migrate/20180425160730_change_routing_constraint_zones_stop_ids_type.rb @@ -0,0 +1,8 @@ +class ChangeRoutingConstraintZonesStopIdsType < ActiveRecord::Migration +  def change +    reversible do |dir| +      dir.up { change_column :routing_constraint_zones, :stop_point_ids, :integer, array: true } +      dir.down { change_column :routing_constraint_zones, :stop_point_ids, :bigint, array: true } +    end +  end +end diff --git a/spec/models/merge_spec.rb b/spec/models/merge_spec.rb index 95181a80e..685e675cd 100644 --- a/spec/models/merge_spec.rb +++ b/spec/models/merge_spec.rb @@ -22,6 +22,8 @@ RSpec.describe Merge do      factor = 1      stop_points_positions = {} +    routing_constraint_zones = {} +      referential.switch do        line_referential.lines.each do |line|          factor.times do @@ -35,6 +37,16 @@ RSpec.describe Merge do            sp.set_list_position 0          end          route.reload.update_checksum! +        checksum = route.checksum +        routing_constraint_zones[route.id] = {} +        2.times do |i| +          constraint_zone = create(:routing_constraint_zone, route: route) +          if i > 0 +            constraint_zone.update stop_points: constraint_zone.stop_points[0...-1] +          end +          routing_constraint_zones[route.id][constraint_zone.checksum] = constraint_zone +        end +        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 @@ -54,7 +66,9 @@ RSpec.describe Merge do          specific_time_table = FactoryGirl.create :time_table          vehicle_journey.time_tables << specific_time_table +        vehicle_journey.update ignored_routing_contraint_zone_ids: routing_constraint_zones[vehicle_journey.route.id].values.map(&:id)        end +      end      merge = Merge.create!(workbench: referential.workbench, referentials: [referential, referential]) @@ -63,6 +77,27 @@ RSpec.describe Merge do      output = merge.output.current      output.switch +    output.routes.each do |route| +      stop_points = nil +      old_route = nil +      referential.switch do +        old_route = Chouette::Route.find_by(checksum: route.checksum) +        stop_points = {} +        old_route.routing_constraint_zones.each do |constraint_zone| +          stop_points[constraint_zone.checksum] = constraint_zone.stop_points.map(&:registration_number) +        end +      end +      routing_constraint_zones[old_route.id].each do |checksum, constraint_zone| +        new_constraint_zone = route.routing_constraint_zones.where(checksum: checksum).last +        expect(new_constraint_zone).to be_present +        expect(new_constraint_zone.stop_points.map(&:registration_number)).to eq stop_points[checksum] +      end + +      route.vehicle_journeys.each do |vehicle_journey| +        expect(vehicle_journey.ignored_routing_contraint_zones.size).to eq vehicle_journey.ignored_routing_contraint_zone_ids.size +      end +    end +      # Let's check stop_point positions are respected      # This should be enforced by the checksum preservation though      output.journey_patterns.each do |journey_pattern| | 
