diff options
| author | cedricnjanga | 2017-07-24 17:55:42 +0200 | 
|---|---|---|
| committer | cedricnjanga | 2017-07-24 17:55:53 +0200 | 
| commit | 42c984546c996c646f7f59a85a55f529ae696669 (patch) | |
| tree | fa7d2448c7bbdc18cd69dcdca96f44ba87c0ed23 /app | |
| parent | ba0b440a1af66d8e5c069c9621dc1c5685b22c4f (diff) | |
| download | chouette-core-42c984546c996c646f7f59a85a55f529ae696669.tar.bz2 | |
Update Tietable#merge! to manage more edge cases
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/time_tables_controller.rb | 2 | ||||
| -rw-r--r-- | app/models/chouette/time_table.rb | 80 | 
2 files changed, 44 insertions, 38 deletions
| diff --git a/app/controllers/time_tables_controller.rb b/app/controllers/time_tables_controller.rb index 8ece4c8ae..b0f346c5c 100644 --- a/app/controllers/time_tables_controller.rb +++ b/app/controllers/time_tables_controller.rb @@ -35,7 +35,7 @@ class TimeTablesController < ChouetteController    def create      tt_params = time_table_params -    unless tt_params[:calendar_id].empty? +    unless tt_params[:calendar_id] && tt_params[:calendar_id] == ""        %i(monday tuesday wednesday thursday friday saturday sunday).map { |d| tt_params[d] = true }        calendar = Calendar.find(tt_params[:calendar_id])        tt_params[:calendar_id] = nil if tt_params.has_key?(:dates_attributes) || tt_params.has_key?(:periods_attributes) diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 0c5ebbbe0..f8d45f9b8 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -47,18 +47,17 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord        chunk[group] ||= []        chunk[group] << date      end -    chunk.values +    # Remove less than 2 continuous day chunk +    chunk.values.delete_if {|dates| dates.count < 2}    end    def convert_continuous_dates_to_periods      chunks = self.continuous_dates -    # Remove less than 2 continuous day chunk -    chunks.delete_if {|chunk| chunk.count < 2}      transaction do        chunks.each do |chunk|          self.periods.create!(period_start: chunk.first.date, period_end: chunk.last.date) -        chunk.map(&:destroy) +        self.dates.delete(chunk)        end      end    end @@ -462,41 +461,50 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord      optimized.sort { |a,b| a.period_start <=> b.period_start}    end -  def optimize_continuous_periods -    periods = self.clone_periods -    optimized = [] -    i = 0 -    while i < periods.length -      p1 = periods[i] -      p2 = periods[i + 1] -      if p1.period_end + 1.day === p2.try(:period_start) -        p1.period_end = p2.period_end -        optimized << p1 -        periods.delete p2 +  def continuous_periods +    periods = self.periods.sort_by(&:period_start) +    chunk = {} +    group = nil +    periods.each_with_index do |period, index| +      group ||= index +      group = (period.period_start - 1.day == periods[index - 1].period_end) ? group : group + 1 +      chunk[group] ||= [] +      chunk[group] << period +    end +    chunk.values.delete_if {|periods| periods.count < 2} +  end + +  def convert_continuous_periods_into_one +    chunks = self.continuous_periods + +    transaction do +      chunks.each do |chunk| +        self.periods.create!(period_start: chunk.first.period_start, period_end: chunk.last.period_end) +        self.periods.delete(chunk)        end -      i += 1      end -   optimized    end +  #update a period if a in_day is just before or after    def optimize_continuous_dates_and_periods -    days = self.included_days + + +    in_days = self.dates.where(in_out: true).sort_by(&:date)      periods = self.clone_periods      optimized = [] -    i = 0 -    while i < days.length -      day = days[i] -      j = i -      while j < periods.length -        period = periods[j] -        period.period_start = day if period.period_start - 1.day === day -        period.period_end = day if period.period_end + 1.day === day -        optimized << period -        j += 1 + +    periods.each do |period| +      in_days.each do |day| +        if period.period_start - 1.day === day.date +          period.period_start = day.date +          self.dates.delete(day) +        elsif period.period_end + 1.day === day.date +          period.period_end = day.date +          self.dates.delete(day) +        end        end -      i += 1 +      optimized << period      end -    #update a period if a in_day is just before or after      optimized    end @@ -520,7 +528,6 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord        # For included dates        another_tt.included_days.map{ |d| add_included_day(d) } -      # binding.pry        # For excluded dates        existing_out_date = self.dates.where(in_out: false).map(&:date) @@ -528,14 +535,13 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord          unless existing_out_date.include?(d.date)            self.dates << Chouette::TimeTableDate.new(:date => d.date, :in_out => false)          end +        self.save!        end -      self.save! +      self.convert_continuous_dates_to_periods +      self.periods = self.optimize_continuous_dates_and_periods +      self.convert_continuous_periods_into_one +      self.periods = self.optimize_overlapping_periods      end - -    self.convert_continuous_dates_to_periods -    self.periods = self.optimize_continuous_dates_and_periods -    self.periods = self.optimize_continuous_periods -    self.periods = self.optimize_overlapping_periods    end    def included_days_in_dates_and_periods | 
