prometheus/chunks/xor.go

78 lines
1.5 KiB
Go

package chunks
import (
"encoding/binary"
"math"
"github.com/prometheus/common/model"
)
// XORChunk holds XOR encoded sample data.
type XORChunk struct {
rawChunk
}
// NewXORChunk returns a new chunk with XOR encoding of the given size.
func NewXORChunk(sz int) *XORChunk {
return &XORChunk{rawChunk: newRawChunk(sz, EncXOR)}
}
// Appender implements the Chunk interface.
func (c *XORChunk) Appender() Appender {
return &xorAppender{c: &c.rawChunk}
}
// Iterator implements the Chunk interface.
func (c *XORChunk) Iterator() Iterator {
return &xorIterator{d: c.d[1:c.l]}
}
type xorAppender struct {
c *rawChunk
num int
buf [16]byte
lastV float64
lastT int64
lastTDelta uint64
}
func (a *xorAppender) Append(ts model.Time, v model.SampleValue) error {
if a.num == 0 {
n := binary.PutVarint(a.buf[:], int64(ts))
binary.BigEndian.PutUint64(a.buf[n:], math.Float64bits(float64(v)))
if err := a.c.append(a.buf[:n+8]); err != nil {
return err
}
a.lastT, a.lastV = int64(ts), float64(v)
a.num++
return nil
}
if a.num == 1 {
a.lastTDelta = uint64(int64(ts) - a.lastT)
}
a.num++
return nil
}
type xorIterator struct {
d []byte
}
func (it *xorIterator) First() (model.SamplePair, bool) {
return model.SamplePair{}, false
}
func (it *xorIterator) Seek(ts model.Time) (model.SamplePair, bool) {
return model.SamplePair{}, false
}
func (it *xorIterator) Next() (model.SamplePair, bool) {
return model.SamplePair{}, false
}
func (it *xorIterator) Err() error {
return nil
}