Select Git revision
periods.go 2.50 KiB
package logs
import (
"time"
)
type Period struct {
Start time.Time `json:"start_time"`
End time.Time `json:"end_time"`
}
func (p Period) Duration() time.Duration {
return p.End.Sub(p.Start)
}
type Periods []Period
func NewPeriods(start time.Time, end time.Time) Periods {
if end.Before(start) {
return []Period{}
}
return []Period{{Start: start, End: end}}
}
func (ps Periods) Without(p Period) Periods {
if len(ps) == 0 {
return ps //nothing left to take from
}
if p.End.Before(ps[0].Start) {
return ps //before first period
}
if p.Start.After(ps[len(ps)-1].End) {
return ps //after last period
}
//logger.Debugf("Start: %+v", ps)
nextIndex := 0
for nextIndex < len(ps) && ps[nextIndex].End.Before(p.Start) {
//logger.Debugf("skip[%d]: %s > %s", nextIndex, p.Start, ps[nextIndex].End)
nextIndex++
}
toDelete := []int{}
for nextIndex < len(ps) && ps[nextIndex].End.Before(p.End) {
if ps[nextIndex].Start.Before(p.Start) {
//trim tail
//logger.Debugf("tail[%d] %s->%s", nextIndex, ps[nextIndex].End, p.Start)
ps[nextIndex].End = p.Start
} else {
//delete this period completely and move to next
toDelete = append(toDelete, nextIndex)
//logger.Debugf("delete[%d] %s..%s", nextIndex, ps[nextIndex].Start, ps[nextIndex].End)
}
nextIndex++
}
if nextIndex < len(ps) && ps[nextIndex].End.After(p.End) {
if ps[nextIndex].Start.Before(p.Start) {
//remove part of this period
ps = append(ps, Period{Start: p.End, End: ps[nextIndex].End})
ps[nextIndex].End = p.Start
//logger.Debugf("split[%d]", nextIndex)
} else {
if ps[nextIndex].Start.Before(p.End) {
//trim head of period to start after removed peroid, then stop
//logger.Debugf("head[%d] %s->%s", nextIndex, ps[nextIndex].Start, p.End)
ps[nextIndex].Start = p.End
}
}
}
//delete selected periods completely