@@ -8,7 +8,12 @@ const SharedPtr = @import("utils/shared_ptr.zig").SharedPtr;
8
8
pub const MergedSegmentInfo = struct {
9
9
info : SegmentInfo = .{},
10
10
attributes : std .AutoHashMapUnmanaged (u64 , u64 ) = .{},
11
- docs : std .AutoHashMap (u32 , bool ),
11
+ docs : std .AutoHashMapUnmanaged (u32 , bool ) = .{},
12
+
13
+ pub fn deinit (self : * MergedSegmentInfo , allocator : std.mem.Allocator ) void {
14
+ self .attributes .deinit (allocator );
15
+ self .docs .deinit (allocator );
16
+ }
12
17
};
13
18
14
19
pub fn SegmentMerger (comptime Segment : type ) type {
@@ -17,7 +22,12 @@ pub fn SegmentMerger(comptime Segment: type) type {
17
22
18
23
const Source = struct {
19
24
reader : Segment.Reader ,
20
- skip_docs : std .AutoHashMap (u32 , void ),
25
+ skip_docs : std .AutoHashMapUnmanaged (u32 , void ) = .{},
26
+
27
+ pub fn deinit (self : * Source , allocator : std.mem.Allocator ) void {
28
+ self .reader .close ();
29
+ self .skip_docs .deinit (allocator );
30
+ }
21
31
22
32
pub fn read (self : * Source ) ! ? Item {
23
33
while (true ) {
@@ -36,38 +46,33 @@ pub fn SegmentMerger(comptime Segment: type) type {
36
46
};
37
47
38
48
allocator : std.mem.Allocator ,
39
- sources : std .ArrayList (Source ),
40
49
collection : * SegmentList (Segment ),
41
- segment : MergedSegmentInfo ,
50
+ sources : std .ArrayListUnmanaged (Source ) = .{},
51
+ segment : MergedSegmentInfo = .{},
42
52
estimated_size : usize = 0 ,
43
53
44
54
current_item : ? Item = null ,
45
55
46
- pub fn init (allocator : std.mem.Allocator , collection : * SegmentList (Segment )) Self {
56
+ pub fn init (allocator : std.mem.Allocator , collection : * SegmentList (Segment ), num_sources : usize ) ! Self {
47
57
return .{
48
58
.allocator = allocator ,
49
- .sources = std .ArrayList (Source ).init (allocator ),
50
59
.collection = collection ,
51
- .segment = .{
52
- .docs = std .AutoHashMap (u32 , bool ).init (allocator ),
53
- },
60
+ .sources = try std .ArrayListUnmanaged (Source ).initCapacity (allocator , num_sources ),
54
61
};
55
62
}
56
63
57
64
pub fn deinit (self : * Self ) void {
58
65
for (self .sources .items ) | * source | {
59
- source .reader .close ();
60
- source .skip_docs .deinit ();
66
+ source .deinit (self .allocator );
61
67
}
62
- self .sources .deinit ();
63
- self .segment .docs . deinit ();
68
+ self .sources .deinit (self . allocator );
69
+ self .segment .deinit (self . allocator );
64
70
self .* = undefined ;
65
71
}
66
72
67
- pub fn addSource (self : * Self , source : * Segment ) ! void {
68
- try self .sources .append (.{
73
+ pub fn addSource (self : * Self , source : * Segment ) void {
74
+ self .sources .appendAssumeCapacity (.{
69
75
.reader = source .reader (),
70
- .skip_docs = std .AutoHashMap (u32 , void ).init (self .allocator ),
71
76
});
72
77
}
73
78
@@ -100,7 +105,7 @@ pub fn SegmentMerger(comptime Segment: type) type {
100
105
}
101
106
}
102
107
103
- try self .segment .docs .ensureTotalCapacity (total_docs );
108
+ try self .segment .docs .ensureTotalCapacity (self . allocator , total_docs );
104
109
for (sources ) | * source | {
105
110
const segment = source .reader .segment ;
106
111
var docs_added : usize = 0 ;
@@ -111,10 +116,10 @@ pub fn SegmentMerger(comptime Segment: type) type {
111
116
const doc_id = entry .key_ptr .* ;
112
117
const doc_status = entry .value_ptr .* ;
113
118
if (! self .collection .hasNewerVersion (doc_id , segment .info .version )) {
114
- try self .segment .docs .put (doc_id , doc_status );
119
+ try self .segment .docs .put (self . allocator , doc_id , doc_status );
115
120
docs_added += 1 ;
116
121
} else {
117
- try source .skip_docs .put (doc_id , {});
122
+ try source .skip_docs .put (self . allocator , doc_id , {});
118
123
}
119
124
}
120
125
if (docs_found > 0 ) {
@@ -158,7 +163,7 @@ test "merge segments" {
158
163
var collection = try SegmentList (MemorySegment ).init (std .testing .allocator , 3 );
159
164
defer collection .deinit (std .testing .allocator , .delete );
160
165
161
- var merger = SegmentMerger (MemorySegment ).init (std .testing .allocator , & collection );
166
+ var merger = try SegmentMerger (MemorySegment ).init (std .testing .allocator , & collection , 3 );
162
167
defer merger .deinit ();
163
168
164
169
var node1 = try SegmentList (MemorySegment ).createSegment (std .testing .allocator , .{});
@@ -174,9 +179,9 @@ test "merge segments" {
174
179
node2 .value .info = .{ .version = 12 , .merges = 0 };
175
180
node3 .value .info = .{ .version = 13 , .merges = 0 };
176
181
177
- try merger .addSource (node1 .value );
178
- try merger .addSource (node2 .value );
179
- try merger .addSource (node3 .value );
182
+ merger .addSource (node1 .value );
183
+ merger .addSource (node2 .value );
184
+ merger .addSource (node3 .value );
180
185
181
186
try merger .prepare ();
182
187
0 commit comments