Module: PartitionGardener::DateBucket

Defined in:
lib/partition_gardener/date_bucket.rb

Class Method Summary collapse

Class Method Details

.active_key(bucket) ⇒ Object



9
10
11
12
13
14
15
16
17
# File 'lib/partition_gardener/date_bucket.rb', line 9

def active_key(bucket)
  case normalize(bucket)
  when :day then :active_days
  when :week then :active_weeks
  when :quarter then :active_quarters
  when :year then :active_years
  else :active_months
  end
end

.add_buckets(date, count, bucket) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/partition_gardener/date_bucket.rb', line 63

def add_buckets(date, count, bucket)
  case normalize(bucket)
  when :day then DateCalendar.add_days(date, count)
  when :week then DateCalendar.add_weeks(date, count)
  when :quarter then DateCalendar.add_quarters(date, count)
  when :year then DateCalendar.add_years(date, count)
  else DateCalendar.add_months(date, count)
  end
end

.archive_bucket_from_partition_name(table_name, partition_name, bucket) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/partition_gardener/date_bucket.rb', line 89

def archive_bucket_from_partition_name(table_name, partition_name, bucket)
  case normalize(bucket)
  when :day
    match = partition_name.match(/^#{Regexp.escape(table_name)}_(\d{4})_(\d{2})_(\d{2})$/)
    return Date.new(match[1].to_i, match[2].to_i, match[3].to_i) if match
  when :week
    match = partition_name.match(/^#{Regexp.escape(table_name)}_(\d{4})_W(\d{2})$/)
    return DateCalendar.beginning_of_week(Date.strptime("#{match[1]}-W#{match[2]}-1", "%G-W%V-%u")) if match
  when :quarter
    match = partition_name.match(/^#{Regexp.escape(table_name)}_(\d{4})_Q([1-4])$/)
    return Date.new(match[1].to_i, ((match[2].to_i - 1) * 3) + 1, 1) if match
  when :year
    match = partition_name.match(/^#{Regexp.escape(table_name)}_(\d{4})$/)
    return Date.new(match[1].to_i, 1, 1) if match
  else
    match = partition_name.match(/^#{Regexp.escape(table_name)}_(\d{4})_(\d{2})$/)
    return Date.new(match[1].to_i, match[2].to_i, 1) if match
  end

  nil
end

.beginning_of_bucket(date, bucket) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'lib/partition_gardener/date_bucket.rb', line 39

def beginning_of_bucket(date, bucket)
  case normalize(bucket)
  when :day then DateCalendar.beginning_of_day(date)
  when :week then DateCalendar.beginning_of_week(date)
  when :quarter then DateCalendar.beginning_of_quarter(date)
  when :year then DateCalendar.beginning_of_year(date)
  else DateCalendar.beginning_of_month(date)
  end
end

.date_trunc_unit(bucket) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/partition_gardener/date_bucket.rb', line 29

def date_trunc_unit(bucket)
  case normalize(bucket)
  when :day then "day"
  when :week then "week"
  when :quarter then "quarter"
  when :year then "year"
  else "month"
  end
end

.default_active_span(bucket) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/partition_gardener/date_bucket.rb', line 19

def default_active_span(bucket)
  case normalize(bucket)
  when :day then 90
  when :week then 52
  when :quarter then 8
  when :year then 2
  else 12
  end
end

.end_of_bucket(date, bucket) ⇒ Object



49
50
51
# File 'lib/partition_gardener/date_bucket.rb', line 49

def end_of_bucket(date, bucket)
  beginning_of_bucket(next_bucket(date, bucket), bucket)
end

.next_bucket(date, bucket) ⇒ Object



53
54
55
56
57
58
59
60
61
# File 'lib/partition_gardener/date_bucket.rb', line 53

def next_bucket(date, bucket)
  case normalize(bucket)
  when :day then DateCalendar.add_days(date, 1)
  when :week then DateCalendar.add_weeks(date, 1)
  when :quarter then DateCalendar.add_quarters(date, 1)
  when :year then DateCalendar.next_year(date)
  else DateCalendar.next_month(date)
  end
end

.normalize(bucket) ⇒ Object



5
6
7
# File 'lib/partition_gardener/date_bucket.rb', line 5

def normalize(bucket)
  bucket.to_sym
end

.partition_definition_clause(date, bucket) ⇒ Object



111
112
113
114
115
# File 'lib/partition_gardener/date_bucket.rb', line 111

def partition_definition_clause(date, bucket)
  start_range = beginning_of_bucket(date, bucket)
  end_range = end_of_bucket(date, bucket)
  "FROM ('#{start_range}') TO ('#{end_range}')"
end

.partition_name(table_name, identifier, bucket) ⇒ Object



85
86
87
# File 'lib/partition_gardener/date_bucket.rb', line 85

def partition_name(table_name, identifier, bucket)
  "#{table_name}_#{partition_name_suffix(identifier, bucket)}"
end

.partition_name_suffix(identifier, bucket) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/partition_gardener/date_bucket.rb', line 73

def partition_name_suffix(identifier, bucket)
  case normalize(bucket)
  when :day then identifier.strftime("%Y_%m_%d")
  when :week then identifier.strftime("%G_W%V")
  when :quarter
    quarter = ((identifier.month - 1) / 3) + 1
    format("%d_Q%d", identifier.year, quarter)
  when :year then identifier.year.to_s
  else identifier.strftime("%Y_%m")
  end
end