mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
78 lines
1.5 KiB
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
|
|
}
|