From 8f403e9a17b27ca22f5acb5a1946c078cd97f9d3 Mon Sep 17 00:00:00 2001 From: Alban Peignier Date: Tue, 24 Apr 2018 17:06:16 +0200 Subject: Restore 'data' clean (vehicle_journey/journey_pattern/route). Use referential metadata to clean routes. Make date_type/begin_date/end_date optionnal for internal usage. Refs #5372 --- app/models/clean_up.rb | 54 ++++++++++++++++++++++++++++++++------- app/models/referential_cloning.rb | 2 ++ 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/app/models/clean_up.rb b/app/models/clean_up.rb index ec47489e9..761fc47be 100644 --- a/app/models/clean_up.rb +++ b/app/models/clean_up.rb @@ -23,17 +23,29 @@ class CleanUp < ApplicationModel end def clean + referential.switch + {}.tap do |result| - processed = send("destroy_time_tables_#{self.date_type}") - if processed - result['time_table'] = processed[:time_tables].try(:count) - result['vehicle_journey'] = processed[:vehicle_journeys].try(:count) - end - result['time_table_date'] = send("destroy_time_tables_dates_#{self.date_type}").try(:count) - result['time_table_period'] = send("destroy_time_tables_periods_#{self.date_type}").try(:count) - self.overlapping_periods.each do |period| - exclude_dates_in_overlapping_period(period) + if date_type + processed = send("destroy_time_tables_#{self.date_type}") + if processed + result['time_table'] = processed[:time_tables].try(:count) + result['vehicle_journey'] = processed[:vehicle_journeys].try(:count) + end + result['time_table_date'] = send("destroy_time_tables_dates_#{self.date_type}").try(:count) + result['time_table_period'] = send("destroy_time_tables_periods_#{self.date_type}").try(:count) + self.overlapping_periods.each do |period| + exclude_dates_in_overlapping_period(period) + end end + + destroy_vehicle_journeys_outside_referential + # Disabled for the moment. See #5372 + # destroy_time_tables_outside_referential + + destroy_vehicle_journeys + destroy_journey_patterns + destroy_routes end end @@ -76,6 +88,30 @@ class CleanUp < ApplicationModel Chouette::TimeTablePeriod.where('period_start > ? AND period_end < ?', self.begin_date, self.end_date).destroy_all end + def destroy_time_tables_outside_referential + # For the moment, only timetable outside of metadatas min/max dates are removed + metadatas_period = referential.metadatas_period + time_tables = Chouette::TimeTable.where('end_date < ? or start_date > ?', metadatas_period.min, metadatas_period.max) + destroy_time_tables(time_tables) + end + + def destroy_vehicle_journeys_outside_referential + line_ids = referential.metadatas.pluck(:line_ids).flatten.uniq + Chouette::VehicleJourney.joins(:route).where(["routes.line_id not in (?)", line_ids]).destroy_all + end + + def destroy_vehicle_journeys + Chouette::VehicleJourney.where("id not in (select distinct vehicle_journey_id from time_tables_vehicle_journeys)").destroy_all + end + + def destroy_journey_patterns + Chouette::JourneyPattern.where("id not in (select distinct journey_pattern_id from vehicle_journeys)").destroy_all + end + + def destroy_routes + Chouette::Route.where("id not in (select distinct route_id from journey_patterns)").destroy_all + end + def overlapping_periods self.end_date = self.begin_date if self.date_type != 'between' Chouette::TimeTablePeriod.where('(period_start, period_end) OVERLAPS (?, ?)', self.begin_date, self.end_date) diff --git a/app/models/referential_cloning.rb b/app/models/referential_cloning.rb index f2c81009a..5065dc660 100644 --- a/app/models/referential_cloning.rb +++ b/app/models/referential_cloning.rb @@ -25,6 +25,8 @@ class ReferentialCloning < ApplicationModel .clone_schema end target_referential.check_migration_count(report) + + CleanUp.new(referential: target_referential).clean end private -- cgit v1.2.3