mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-15 10:04:07 -08:00
81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
|
package chunkenc
|
||
|
|
||
|
import (
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
type sample struct {
|
||
|
t int64
|
||
|
v float64
|
||
|
}
|
||
|
|
||
|
// OOOChunk maintains samples in time-ascending order.
|
||
|
// Inserts for timestamps already seen, are dropped.
|
||
|
// Samples are stored uncompressed to allow easy sorting.
|
||
|
// Perhaps we can be more efficient later.
|
||
|
type OOOChunk struct {
|
||
|
samples []sample
|
||
|
}
|
||
|
|
||
|
func NewOOOChunk(capacity int) *OOOChunk {
|
||
|
return &OOOChunk{samples: make([]sample, 0, capacity)}
|
||
|
}
|
||
|
|
||
|
// Insert inserts the sample such that order is maintained.
|
||
|
// Returns false if insert was not possible due to the same timestamp already existing.
|
||
|
func (o *OOOChunk) Insert(t int64, v float64) bool {
|
||
|
// find index of sample we should replace
|
||
|
i := sort.Search(len(o.samples), func(i int) bool { return o.samples[i].t >= t })
|
||
|
|
||
|
if i >= len(o.samples) {
|
||
|
// none found. append it at the end
|
||
|
o.samples = append(o.samples, sample{t, v})
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
if o.samples[i].t == t {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// expand length by 1 to make room. use a zero sample, we will overwrite it anyway
|
||
|
o.samples = append(o.samples, sample{})
|
||
|
copy(o.samples[i+1:], o.samples[i:])
|
||
|
o.samples[i] = sample{t, v}
|
||
|
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (o *OOOChunk) NumSamples() int {
|
||
|
return len(o.samples)
|
||
|
}
|
||
|
|
||
|
func (o *OOOChunk) ToXor() (*XORChunk, error) {
|
||
|
x := NewXORChunk()
|
||
|
app, err := x.Appender()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
for _, s := range o.samples {
|
||
|
app.Append(s.t, s.v)
|
||
|
}
|
||
|
return x, nil
|
||
|
}
|
||
|
|
||
|
func (o *OOOChunk) ToXorBetweenTimestamps(mint, maxt int64) (*XORChunk, error) {
|
||
|
x := NewXORChunk()
|
||
|
app, err := x.Appender()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
for _, s := range o.samples {
|
||
|
if s.t < mint {
|
||
|
continue
|
||
|
}
|
||
|
if s.t > maxt {
|
||
|
break
|
||
|
}
|
||
|
app.Append(s.t, s.v)
|
||
|
}
|
||
|
return x, nil
|
||
|
}
|