@@ -103,7 +103,7 @@ const BlockHeader = struct {
103
103
first_item : Item ,
104
104
};
105
105
106
- pub fn decodeBlockHeader (data : []const u8 ) ! BlockHeader {
106
+ pub fn decodeBlockHeader (data : []const u8 , min_doc_id : u32 ) ! BlockHeader {
107
107
assert (data .len >= min_block_size );
108
108
109
109
const num_items = std .mem .readInt (u16 , data [0.. 2], .little );
@@ -119,11 +119,11 @@ pub fn decodeBlockHeader(data: []const u8) !BlockHeader {
119
119
120
120
return .{
121
121
.num_items = num_items ,
122
- .first_item = Item { .hash = hash .value , .id = id .value },
122
+ .first_item = Item { .hash = hash .value , .id = id .value + min_doc_id },
123
123
};
124
124
}
125
125
126
- pub fn readBlock (data : []const u8 , items : * std .ArrayList (Item )) ! void {
126
+ pub fn readBlock (data : []const u8 , items : * std .ArrayList (Item ), min_doc_id : u32 ) ! void {
127
127
var ptr : usize = 0 ;
128
128
129
129
if (data .len < 2 ) {
@@ -149,7 +149,7 @@ pub fn readBlock(data: []const u8, items: *std.ArrayList(Item)) !void {
149
149
ptr += diff_doc_id .size ;
150
150
151
151
last_hash += diff_hash .value ;
152
- last_doc_id = if (diff_hash .value > 0 ) diff_doc_id .value else last_doc_id + diff_doc_id .value ;
152
+ last_doc_id = if (diff_hash .value > 0 ) diff_doc_id .value + min_doc_id else last_doc_id + diff_doc_id .value ;
153
153
154
154
const item = items .addOneAssumeCapacity ();
155
155
item .* = .{ .hash = last_hash , .id = last_doc_id };
@@ -161,7 +161,7 @@ pub fn readBlock(data: []const u8, items: *std.ArrayList(Item)) !void {
161
161
}
162
162
}
163
163
164
- pub fn encodeBlock (data : []u8 , reader : anytype ) ! u16 {
164
+ pub fn encodeBlock (data : []u8 , reader : anytype , min_doc_id : u32 ) ! u16 {
165
165
assert (data .len >= 2 );
166
166
167
167
var ptr : usize = 2 ;
@@ -174,7 +174,7 @@ pub fn encodeBlock(data: []u8, reader: anytype) !u16 {
174
174
assert (item .hash > last_hash or (item .hash == last_hash and item .id >= last_doc_id ));
175
175
176
176
const diff_hash = item .hash - last_hash ;
177
- const diff_doc_id = if (diff_hash > 0 ) item .id else item .id - last_doc_id ;
177
+ const diff_doc_id = if (diff_hash > 0 ) item .id - min_doc_id else item .id - last_doc_id ;
178
178
179
179
if (ptr + varint32Size (diff_hash ) + varint32Size (diff_doc_id ) > data .len ) {
180
180
break ;
@@ -211,13 +211,13 @@ test "writeBlock/readBlock/readFirstItemFromBlock" {
211
211
var block_data : [block_size ]u8 = undefined ;
212
212
213
213
var reader = segment .reader ();
214
- const num_items = try encodeBlock (block_data [0.. ], & reader );
214
+ const num_items = try encodeBlock (block_data [0.. ], & reader , 0 );
215
215
try testing .expectEqual (segment .items .items .len , num_items );
216
216
217
217
var items = std .ArrayList (Item ).init (std .testing .allocator );
218
218
defer items .deinit ();
219
219
220
- try readBlock (block_data [0.. ], & items );
220
+ try readBlock (block_data [0.. ], & items , 0 );
221
221
try testing .expectEqualSlices (
222
222
Item ,
223
223
&[_ ]Item {
@@ -230,7 +230,7 @@ test "writeBlock/readBlock/readFirstItemFromBlock" {
230
230
items .items ,
231
231
);
232
232
233
- const header = try decodeBlockHeader (block_data [0.. ]);
233
+ const header = try decodeBlockHeader (block_data [0.. ], 0 );
234
234
try testing .expectEqual (items .items .len , header .num_items );
235
235
try testing .expectEqual (items .items [0 ], header .first_item );
236
236
}
@@ -343,7 +343,7 @@ pub fn writeSegmentFile(dir: std.fs.Dir, reader: anytype) !void {
343
343
344
344
var block_data : [block_size ]u8 = undefined ;
345
345
while (true ) {
346
- const n = try encodeBlock (block_data [0.. ], reader );
346
+ const n = try encodeBlock (block_data [0.. ], reader , segment . min_doc_id );
347
347
try writer .writeAll (block_data [0.. ]);
348
348
if (n == 0 ) {
349
349
break ;
@@ -466,7 +466,7 @@ pub fn readSegmentFile(dir: fs.Dir, info: SegmentInfo, segment: *FileSegment) !v
466
466
var block_data = block_data_buffer [0.. block_size ];
467
467
while (true ) {
468
468
try reader .readNoEof (block_data );
469
- const block_header = try decodeBlockHeader (block_data );
469
+ const block_header = try decodeBlockHeader (block_data , segment . min_doc_id );
470
470
if (block_header .num_items == 0 ) {
471
471
break ;
472
472
}
@@ -534,7 +534,7 @@ test "writeFile/readFile" {
534
534
var items = std .ArrayList (Item ).init (testing .allocator );
535
535
defer items .deinit ();
536
536
537
- try readBlock (segment .getBlockData (0 ), & items );
537
+ try readBlock (segment .getBlockData (0 ), & items , segment . min_doc_id );
538
538
try std .testing .expectEqualSlices (Item , &[_ ]Item {
539
539
Item { .hash = 1 , .id = 1 },
540
540
Item { .hash = 2 , .id = 1 },
0 commit comments