diff options
| author | Alban Peignier | 2017-12-27 21:27:24 +0100 | 
|---|---|---|
| committer | Alban Peignier | 2018-01-05 10:23:29 +0100 | 
| commit | a091b61f020651142ac55c2c9074d28070e067a7 (patch) | |
| tree | cf0724f0f945c7f206f8f5de492776905a1ad83c | |
| parent | 8dada2909f01e4e8fe1eb85e88b7ac4562446521 (diff) | |
| download | chouette-core-a091b61f020651142ac55c2c9074d28070e067a7.tar.bz2 | |
Merge TimeTables. Refs #5299
| -rw-r--r-- | app/models/merge.rb | 80 | ||||
| -rw-r--r-- | spec/models/merge_spec.rb | 20 | 
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]) | 
