package partman import ( "fmt" "time" ) const ( daysInWeek = 7 ) type weeklyPartition struct { t time.Time } func (d weeklyPartition) PartitionName() string { return fmt.Sprintf("calls_p_%d_w%02d_%02d", d.t.Year(), d.t.Month(), d.t.Day()) } func (d weeklyPartition) Range() (start, end time.Time) { start = time.Date(d.t.Year(), d.t.Month(), d.t.Day(), 0, 0, 0, 0, d.t.UTC().Location()).AddDate(0, 0, -int(d.t.Weekday()-time.Monday)) start = start.AddDate(0, 0, daysInWeek) return } func (d weeklyPartition) Next(i int) partition { year, month, day := d.t.Date() return weeklyPartition{ t: time.Date(year, month, day+i, 0, 0, 0, 0, time.UTC), } } func (d weeklyPartition) Prev(i int) partition { year, month, day := d.t.Date() return weeklyPartition{ t: time.Date(year, month, day-i, 0, 0, 0, 0, d.t.Location()), } } type dailyPartition struct { t time.Time } func (d dailyPartition) PartitionName() string { return fmt.Sprintf("calls_p_%d_%02d_%02d", d.t.Year(), d.t.Month(), d.t.Day()) } func (d dailyPartition) Range() (start, end time.Time) { start = time.Date(d.t.Year(), d.t.Month(), d.t.Day(), 0, 0, 0, 0, time.UTC) end = start.AddDate(0, 0, 1) return } func (d dailyPartition) Next(i int) partition { year, month, day := d.t.Date() return dailyPartition{ t: time.Date(year, month, day+i, 0, 0, 0, 0, time.UTC), } } func (d dailyPartition) Prev(i int) partition { year, month, day := d.t.Date() return dailyPartition{ t: time.Date(year, month, day-i, 0, 0, 0, 0, d.t.Location()), } } type monthlyPartition struct { t time.Time } func (d monthlyPartition) PartitionName() string { return fmt.Sprintf("calls_p_%d_%02d", d.t.Year(), d.t.Month()) } func (d monthlyPartition) Range() (start, end time.Time) { start = time.Date(d.t.Year(), d.t.Month(), 1, 0, 0, 0, 0, time.UTC) end = start.AddDate(0, 1, 0) return } func (d monthlyPartition) Next(i int) partition { year, month, _ := d.t.Date() return monthlyPartition{ t: time.Date(year, month+time.Month(i), 1, 0, 0, 0, 0, time.UTC), } } func (d monthlyPartition) Prev(i int) partition { year, month, _ := d.t.Date() return monthlyPartition{ t: time.Date(year, month-time.Month(i), 1, 0, 0, 0, 0, d.t.Location()), } }