aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/merge.rb
diff options
context:
space:
mode:
authorAlban Peignier2017-12-18 09:08:31 +0100
committerAlban Peignier2018-01-05 10:23:29 +0100
commitf9b00154721731511b76b20d1d7211de963811bc (patch)
tree236473c405772e94c8b3e22cd9ed2c464acb11c8 /app/models/merge.rb
parentc95a030d05a2792a05b45cba8d4e888ac4e35375 (diff)
downloadchouette-core-f9b00154721731511b76b20d1d7211de963811bc.tar.bz2
Merge Route and their StopPoints in the same operation to create Route with same checksums. Refs #5299
Diffstat (limited to 'app/models/merge.rb')
-rw-r--r--app/models/merge.rb82
1 files changed, 37 insertions, 45 deletions
diff --git a/app/models/merge.rb b/app/models/merge.rb
index 21ef9fa5f..c965cc704 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -51,7 +51,6 @@ class Merge < ActiveRecord::Base
def merge_referential(referential)
Rails.logger.debug "Merge #{referential.slug}"
- puts referential.metadatas.inspect
metadata_merger = MetadatasMerger.new new, referential
metadata_merger.merge
@@ -59,11 +58,11 @@ class Merge < ActiveRecord::Base
new.metadatas.delete metadata_merger.empty_metadatas
new.save!
- puts new.metadatas.inspect
referential.metadatas.each do |metadata|
metadata.line_ids.each do |line_id|
metadata.periodes.each do |period|
+ # TODO
puts "Clean data for #{line_id} #{period}"
end
end
@@ -77,6 +76,14 @@ class Merge < ActiveRecord::Base
referential.routes.all.to_a
end
+ referential_routes_checksums = Hash[referential_routes.map { |r| [ r.id, r.checksum ] }]
+
+ referential_stop_points = referential.switch do
+ referential.stop_points.all.to_a
+ end
+
+ referential_stop_points_by_route = referential_stop_points.group_by(&:route_id)
+
new.switch do
referential_routes.each do |route|
existing_route = new.routes.find_by line_id: route.line_id, checksum: route.checksum
@@ -88,7 +95,22 @@ class Merge < ActiveRecord::Base
# all other primary must be changed
opposite_route_id: nil #FIXME
)
- new_route = new.routes.create! attributes
+ new_route = new.routes.build attributes
+
+ route_stop_points = referential_stop_points_by_route[route.id]
+
+ # Stop Points
+ route_stop_points.each do |stop_point|
+ attributes = stop_point.attributes.merge(
+ id: nil,
+ route_id: nil,
+ objectid: "merge:stop_point:#{route.checksum}-#{stop_point.position}", #FIXME
+ )
+
+ new_route.stop_points.build attributes
+ end
+
+ new_route.save!
# FIXME Route checksum changes if stop points are not defined
if new_route.checksum != route.checksum
@@ -98,45 +120,18 @@ class Merge < ActiveRecord::Base
end
end
- referential_routes_checksums = Hash[referential_routes.map { |r| [ r.id, r.checksum ] }]
-
- # Stop Points
-
- referential_stop_points = referential.switch do
- referential.stop_points.all.to_a
- end
-
- new.switch do
- referential_stop_points.each do |stop_point|
- # find parent route by checksum
- associated_route_checksum = referential_routes_checksums[stop_point.route_id]
- existing_associated_route = new.routes.find_by checksum: associated_route_checksum
-
- existing_stop_point = new.stop_points.find_by route_id: existing_associated_route.id, checksum: stop_point.checksum
- unless existing_stop_point
- attributes = stop_point.attributes.merge(
- id: nil,
-
- objectid: "merge:stop_point:#{existing_associated_route.checksum}-#{stop_point.checksum}", #FIXME
+ # JourneyPatterns
- # all other primary must be changed
- route_id: existing_associated_route.id,
- )
+ referential_journey_patterns, referential_journey_patterns_stop_areas_objectids = referential.switch do
+ journey_patterns = referential.journey_patterns.includes(:stop_points)
- new_stop_point = new.stop_points.create! attributes
- if new_stop_point.checksum != stop_point.checksum
- raise "Checksum has changed: #{stop_point.inspect} #{new_stop_point.inspect}"
- end
+ journey_patterns_stop_areas_objectids = Hash[
+ journey_patterns.map do |journey_pattern|
+ [ journey_pattern.id, journey_pattern.stop_points.map(&:stop_area).map(&:objectid)]
end
- end
- end
+ ]
- referential_stop_points_checksums = Hash[referential_stop_points.map { |r| [ r.id, r.checksum ] }]
-
- # JourneyPatterns
-
- referential_journey_patterns = referential.switch do
- referential.journey_patterns.all.to_a
+ [journey_patterns, journey_patterns_stop_areas_objectids]
end
new.switch do
@@ -160,15 +155,14 @@ class Merge < ActiveRecord::Base
arrival_stop_point_id: nil
)
- stop_points = journey_pattern.stop_point_ids.map do |stop_point_id|
- associated_stop_point_checksum = referential_stop_points_checksums[stop_point_id]
- new.stop_points.find_by checksum: associated_stop_point_checksum
- end
+ stop_areas_objectids = referential_journey_patterns_stop_areas_objectids[journey_pattern.id]
+
+ stop_points = existing_associated_route.stop_points.joins(:stop_area).where("stop_areas.objectid": stop_areas_objectids).order(:position)
attributes.merge!(stop_points: stop_points)
new_journey_pattern = new.journey_patterns.create! attributes
if new_journey_pattern.checksum != journey_pattern.checksum
- raise "Checksum has changed: #{journey_pattern.inspect} #{new_journey_pattern.inspect}"
+ raise "Checksum has changed: #{journey_pattern.checksum_source} #{new_journey_pattern.checksum_source}"
end
end
end
@@ -217,8 +211,6 @@ class Merge < ActiveRecord::Base
line_metadatas = merged_line_metadatas(line_id)
metadata.periodes.each do |period|
- puts "#{line_id} #{period}"
-
line_metadatas.each do |m|
m.periodes = m.periodes.map do |existing_period|
existing_period.remove period