aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-04-25 22:08:53 +0200
committerGitHub2018-04-25 22:08:53 +0200
commit1434331621f3677ba825da6dc44d438a7df99b70 (patch)
treedac15a363ed08962329038c8ea44b7daa67a20be
parent9fec2b10fa947047e9a8a2f354d232c402b1ef40 (diff)
parent5c6718314cbbe3c36fd9343b1ea78124dd2189d3 (diff)
downloadchouette-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.rb6
-rw-r--r--app/models/chouette/routing_constraint_zone.rb7
-rw-r--r--app/models/chouette/vehicle_journey.rb2
-rw-r--r--app/models/merge.rb31
-rw-r--r--db/migrate/20180425160730_change_routing_constraint_zones_stop_ids_type.rb8
-rw-r--r--spec/models/merge_spec.rb35
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|