aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2017-12-27 21:27:24 +0100
committerAlban Peignier2018-01-05 10:23:29 +0100
commita091b61f020651142ac55c2c9074d28070e067a7 (patch)
treecf0724f0f945c7f206f8f5de492776905a1ad83c
parent8dada2909f01e4e8fe1eb85e88b7ac4562446521 (diff)
downloadchouette-core-a091b61f020651142ac55c2c9074d28070e067a7.tar.bz2
Merge TimeTables. Refs #5299
-rw-r--r--app/models/merge.rb80
-rw-r--r--spec/models/merge_spec.rb20
2 files changed, 88 insertions, 12 deletions
diff --git a/app/models/merge.rb b/app/models/merge.rb
index 562e19343..683acba82 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -84,13 +84,11 @@ class Merge < ActiveRecord::Base
new.save!
- 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
+ line_periods = LinePeriods.from_metadatas(referential.metadatas)
+
+ line_periods.each do |line_id, periods|
+ # TODO
+ puts "Clean data for #{line_id} #{periods.inspect}"
end
# let's merge data :)
@@ -164,6 +162,7 @@ class Merge < ActiveRecord::Base
new.switch do
referential_journey_patterns.each do |journey_pattern|
# find parent route by checksum
+ # TODO add line_id for security
associated_route_checksum = referential_routes_checksums[journey_pattern.route_id]
existing_associated_route = new.routes.find_by checksum: associated_route_checksum
@@ -202,6 +201,7 @@ class Merge < ActiveRecord::Base
new.switch do
referential_vehicle_journeys.each do |vehicle_journey|
# find parent journey pattern by checksum
+ # TODO add line_id for security
associated_journey_pattern_checksum = referential_journey_patterns_checksums[vehicle_journey.journey_pattern_id]
existing_associated_journey_pattern = new.journey_patterns.find_by checksum: associated_journey_pattern_checksum
@@ -239,6 +239,72 @@ class Merge < ActiveRecord::Base
end
end
+ referential_time_tables_by_id, referential_time_tables_with_lines = referential.switch do
+ time_tables_by_id = Hash[referential.time_tables.includes(:dates, :periods).all.to_a.map { |t| [t.id, t] }]
+
+ time_tables_with_associated_lines =
+ referential.time_tables.joins(vehicle_journeys: {route: :line}).pluck("lines.id", :id, "vehicle_journeys.checksum")
+
+ time_tables_by_lines = time_tables_with_associated_lines.inject(Hash.new { |h,k| h[k] = [] }) do |hash, row|
+ hash[row.shift] << {id: row.first, vehicle_journey_checksum: row.second}
+ hash
+ end
+
+ [ time_tables_by_id, time_tables_by_lines ]
+ end
+
+ new.switch do
+ referential_time_tables_with_lines.each do |line_id, time_tables_properties|
+ line = workbench.line_referential.lines.find(line_id)
+
+ time_tables_properties.each do |properties|
+ time_table = referential_time_tables_by_id[properties[:id]]
+
+ attributes = time_table.attributes.merge(
+ id: nil,
+ comment: "Ligne #{line.name} - #{time_table.comment}",
+ calendar_id: nil,
+ objectid: "merge:time_table:#{line_id}-#{time_table.checksum}"
+ )
+ candidate_time_table = new.time_tables.build attributes
+
+ time_table.dates.each do |date|
+ date_attributes = date.attributes.merge(
+ id: nil,
+ time_table_id: nil
+ )
+ candidate_time_table.dates.build date_attributes
+ end
+ time_table.periods.each do |period|
+ period_attributes = period.attributes.merge(
+ id: nil,
+ time_table_id: nil
+ )
+ candidate_time_table.periods.build period_attributes
+ end
+
+ candidate_time_table.intersect_periods! line_periods.periods(line_id)
+
+ # FIXME
+ candidate_time_table.set_current_checksum_source
+ candidate_time_table.update_checksum
+
+ existing_time_table = new.time_tables.find_by checksum: candidate_time_table.checksum
+
+ unless existing_time_table
+ candidate_time_table.save!
+
+ # if new_time_table.checksum != time_table.checksum
+ # raise "Checksum has changed: #{time_table.checksum_source} #{new_time_table.checksum_source}"
+ # end
+
+ existing_time_table = candidate_time_table
+ end
+
+ # TODO associate VehicleJourney
+ end
+ end
+ end
end
def save_current
diff --git a/spec/models/merge_spec.rb b/spec/models/merge_spec.rb
index e9ae3762b..92f8f74b1 100644
--- a/spec/models/merge_spec.rb
+++ b/spec/models/merge_spec.rb
@@ -19,26 +19,36 @@ RSpec.describe Merge do
organisation: workbench.organisation,
metadatas: [referential_metadata]
+ factor = 1
+
referential.switch do
line_referential.lines.each do |line|
- 3.times do
+ factor.times do
stop_areas = stop_area_referential.stop_areas.order("random()").limit(5)
FactoryGirl.create :route, line: line, stop_areas: stop_areas, stop_points_count: 0
end
end
referential.routes.each do |route|
- 3.times do
+ factor.times do
FactoryGirl.create :journey_pattern, route: route, stop_points: route.stop_points.sample(3)
end
end
referential.journey_patterns.each do |journey_pattern|
- 3.times do
- v = FactoryGirl.create :vehicle_journey, journey_pattern: journey_pattern, company: company
- puts v.checksum_source
+ factor.times do
+ FactoryGirl.create :vehicle_journey, journey_pattern: journey_pattern, company: company
end
end
+
+ shared_time_table = FactoryGirl.create :time_table
+
+ referential.vehicle_journeys.each do |vehicle_journey|
+ vehicle_journey.time_tables << shared_time_table
+
+ specific_time_table = FactoryGirl.create :time_table
+ vehicle_journey.time_tables << specific_time_table
+ end
end
merge = Merge.create!(workbench: referential.workbench, referentials: [referential, referential])