aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorcedricnjanga2017-07-24 17:55:42 +0200
committercedricnjanga2017-07-24 17:55:53 +0200
commit42c984546c996c646f7f59a85a55f529ae696669 (patch)
treefa7d2448c7bbdc18cd69dcdca96f44ba87c0ed23 /app
parentba0b440a1af66d8e5c069c9621dc1c5685b22c4f (diff)
downloadchouette-core-42c984546c996c646f7f59a85a55f529ae696669.tar.bz2
Update Tietable#merge! to manage more edge cases
Diffstat (limited to 'app')
-rw-r--r--app/controllers/time_tables_controller.rb2
-rw-r--r--app/models/chouette/time_table.rb80
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