@@ -29,9 +29,10 @@ const SIMPLE_SEQUENCE_MAX_THRESHOLD = 16
2929//
3030// This is the "writer" counterpart of SequenceReader.
3131type 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
6563func (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
7372func (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
8179func (b * SequenceBuilder ) AppendBytes (buf []byte ) []byte {
@@ -88,22 +86,12 @@ func (b *SequenceBuilder) AppendBytes(buf []byte) []byte {
8886
8987func (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