aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinhui2017-05-09 16:45:23 +0200
committerXinhui2017-05-09 16:45:44 +0200
commitfa16b56825592ed584453351e47f771bd580c41f (patch)
tree8379f93b6178b65dada8d3ccf8cd563a6ea18daa
parentc5b39e62fc79fa2fb4d57904273dbc75d9cb698e (diff)
downloadchouette-core-fa16b56825592ed584453351e47f771bd580c41f.tar.bz2
TimeTables convert continuous dates to periods
-rw-r--r--app/models/chouette/time_table.rb18
-rw-r--r--spec/models/time_table_combination_spec.rb25
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