diff options
| author | Xinhui | 2017-05-09 16:45:23 +0200 |
|---|---|---|
| committer | Xinhui | 2017-05-09 16:45:44 +0200 |
| commit | fa16b56825592ed584453351e47f771bd580c41f (patch) | |
| tree | 8379f93b6178b65dada8d3ccf8cd563a6ea18daa | |
| parent | c5b39e62fc79fa2fb4d57904273dbc75d9cb698e (diff) | |
| download | chouette-core-fa16b56825592ed584453351e47f771bd580c41f.tar.bz2 | |
TimeTables convert continuous dates to periods
| -rw-r--r-- | app/models/chouette/time_table.rb | 18 | ||||
| -rw-r--r-- | spec/models/time_table_combination_spec.rb | 25 |
2 files changed, 35 insertions, 8 deletions
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 0a99f6df6..37f609163 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -36,14 +36,26 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord def continuous_dates chunk = {} group = nil - - self.dates.each_with_index do |date, index| + self.dates.where(in_out: true).each_with_index do |date, index| group ||= index group = (date.date == dates[index - 1].date + 1.day) ? group : group + 1 chunk[group] ||= [] chunk[group] << date end - chunk + chunk.values + end + + def convert_continuous_dates_to_periods + chunks = self.continuous_dates + # Remove less than 3 continuous day chunk + chunks.delete_if {|chunk| chunk.count < 3} + + transaction do + chunks.each do |chunk| + self.periods.create!(period_start: chunk.first.date, period_end: chunk.last.date) + chunk.map(&:destroy) + end + end end def state_update state diff --git a/spec/models/time_table_combination_spec.rb b/spec/models/time_table_combination_spec.rb index 8b66434f2..4c99a14fa 100644 --- a/spec/models/time_table_combination_spec.rb +++ b/spec/models/time_table_combination_spec.rb @@ -5,18 +5,33 @@ describe TimeTableCombination, :type => :model do let!(:combined){create(:time_table)} subject {build(:time_table_combination)} - describe 'continuous_dates' do + describe '#continuous_dates' do it 'should group continuous dates' do dates = source.dates.where(in_out: true) - expect(source.continuous_dates.values[0].count).to eq(dates.count) + expect(source.continuous_dates[0].count).to eq(dates.count) - # 6 more continious date, 1 isolated date + # 6 more continuous date, 1 isolated date (10..15).each do |n| source.dates.create(date: Date.today + n.day, in_out: true) end source.dates.create(date: Date.today + 1.year, in_out: true) - expect(source.reload.continuous_dates.values[1].count).to eq(6) - expect(source.reload.continuous_dates.values[2].count).to eq(1) + expect(source.reload.continuous_dates[1].count).to eq(6) + expect(source.reload.continuous_dates[2].count).to eq(1) + end + end + + describe '#convert_continuous_dates_to_periods' do + it 'should convert continuous dates to periods' do + (10..12).each do |n| + source.dates.create(date: Date.today + n.day, in_out: true) + end + source.dates.create(date: Date.today + 1.year, in_out: true) + + expect { + source.reload.convert_continuous_dates_to_periods + }.to change {source.periods.count}.by(2) + + expect(source.reload.dates.where(in_out: true).count).to eq(1) end end |
