Skip to content

Commit 29a8bb2

Browse files
committed
save
1 parent 2cd1a40 commit 29a8bb2

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

db/recsplit/multiencseq/sequence_builder.go

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ const SIMPLE_SEQUENCE_MAX_THRESHOLD = 16
2929
//
3030
// This is the "writer" counterpart of SequenceReader.
3131
type SequenceBuilder struct {
32-
baseNum uint64
33-
ef *eliasfano32.EliasFano // intermediate EF for simple encoding (count <= 16)
34-
rebasedEf *eliasfano32.EliasFano // direct rebased EF for large sequences (count > 16)
32+
baseNum uint64
33+
smallBuf [SIMPLE_SEQUENCE_MAX_THRESHOLD]uint32 // rebased values for simple encoding (count <= 16)
34+
smallCount uint8
35+
rebasedEf *eliasfano32.EliasFano // direct rebased EF for large sequences (count > 16)
3536
}
3637

3738
// Creates a new builder. The builder is not meant to be reused. The construction
@@ -56,26 +57,23 @@ func NewBuilder(baseNum, count, maxOffset uint64) *SequenceBuilder {
5657
rebasedEf: eliasfano32.NewEliasFano(count, maxOffset-baseNum),
5758
}
5859
}
59-
return &SequenceBuilder{
60-
baseNum: baseNum,
61-
ef: eliasfano32.NewEliasFano(count, maxOffset),
62-
}
60+
return &SequenceBuilder{baseNum: baseNum}
6361
}
6462

6563
func (b *SequenceBuilder) AddOffset(offset uint64) {
6664
if b.rebasedEf != nil {
6765
b.rebasedEf.AddOffset(offset - b.baseNum)
6866
return
6967
}
70-
b.ef.AddOffset(offset)
68+
b.smallBuf[b.smallCount] = uint32(offset - b.baseNum)
69+
b.smallCount++
7170
}
7271

7372
func (b *SequenceBuilder) Build() {
7473
if b.rebasedEf != nil {
7574
b.rebasedEf.Build()
76-
return
7775
}
78-
b.ef.Build()
76+
// small path: no-op
7977
}
8078

8179
func (b *SequenceBuilder) AppendBytes(buf []byte) []byte {
@@ -88,22 +86,12 @@ func (b *SequenceBuilder) AppendBytes(buf []byte) []byte {
8886

8987
func (b *SequenceBuilder) simpleEncoding(buf []byte) []byte {
9088
// Simple encoding type + size: [0x80, 0x8F]
91-
count := b.ef.Count()
92-
enc := byte(count-1) & byte(0b00001111)
93-
enc |= byte(SimpleEncoding)
89+
enc := (b.smallCount-1)&0x0F | byte(SimpleEncoding)
9490
buf = append(buf, enc)
9591

96-
// Encode elems
9792
var bn [4]byte
98-
for it := b.ef.Iterator(); it.HasNext(); {
99-
n, err := it.Next()
100-
if err != nil {
101-
// TODO: err
102-
panic(err)
103-
}
104-
n -= b.baseNum
105-
106-
binary.BigEndian.PutUint32(bn[:], uint32(n))
93+
for _, v := range b.smallBuf[:b.smallCount] {
94+
binary.BigEndian.PutUint32(bn[:], v)
10795
buf = append(buf, bn[:]...)
10896
}
10997

0 commit comments

Comments
 (0)