104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
|
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()),
|
||
|
}
|
||
|
}
|