Skip to content
Snippets Groups Projects
Select Git revision
  • 7d54e7f76c62ebcf8687274b73439adaac141a63
  • main default protected
  • v1.298.0
  • v1.297.0
  • v1.296.0
  • v1.295.0
  • v1.294.0
  • v1.293.0
  • v1.292.0
  • v1.291.0
  • v1.290.0
  • v1.289.0
  • v1.288.0
  • v1.287.0
  • v1.286.0
  • v1.285.0
  • v1.284.0
  • v1.283.0
  • v1.282.0
  • v1.281.0
  • v1.280.0
  • v1.279.0
22 results

periods.go

Blame
  • 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