stillbox/pkg/database/partman/intervals.go
2024-11-29 23:24:43 -05:00

103 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()),
}
}