@@ -446,6 +446,11 @@ fn releaseSegments(self: *Self, segments: *SegmentsSnapshot) void {
446
446
FileSegmentList .destroySegments (self .allocator , & segments .file_segments );
447
447
}
448
448
449
+ const segment_lists = [_ ][]const u8 {
450
+ "file_segments" ,
451
+ "memory_segments" ,
452
+ };
453
+
449
454
pub fn search (self : * Self , hashes : []const u32 , allocator : std.mem.Allocator , deadline : Deadline ) ! SearchResults {
450
455
const sorted_hashes = try allocator .dupe (u32 , hashes );
451
456
defer allocator .free (sorted_hashes );
@@ -457,14 +462,39 @@ pub fn search(self: *Self, hashes: []const u32, allocator: std.mem.Allocator, de
457
462
var snapshot = self .acquireSegments ();
458
463
defer self .releaseSegments (& snapshot ); // FIXME this possibly deletes orphaned segments, do it in a separate thread
459
464
460
- try snapshot .file_segments .value .search (sorted_hashes , & results , deadline );
461
- try snapshot .memory_segments .value .search (sorted_hashes , & results , deadline );
465
+ inline for (segment_lists ) | n | {
466
+ const segments = @field (snapshot , n );
467
+ try segments .value .search (sorted_hashes , & results , deadline );
468
+ }
462
469
463
470
results .sort ();
464
471
465
472
return results ;
466
473
}
467
474
475
+ pub fn getAttributes (self : * Self , allocator : std.mem.Allocator ) ! std. AutoHashMapUnmanaged (u64 , u64 ) {
476
+ var result : std .AutoHashMapUnmanaged (u64 , u64 ) = .{};
477
+ errdefer result .deinit (allocator );
478
+
479
+ var snapshot = self .acquireSegments ();
480
+ defer self .releaseSegments (& snapshot ); // FIXME this possibly deletes orphaned segments, do it in a separate thread
481
+
482
+ var last_version : u64 = 0 ;
483
+ inline for (segment_lists ) | n | {
484
+ const segments = @field (snapshot , n );
485
+ for (segments .value .nodes .items ) | node | {
486
+ var iter = node .value .attributes .iterator ();
487
+ while (iter .next ()) | entry | {
488
+ try result .put (allocator , entry .key_ptr .* , entry .value_ptr .* );
489
+ }
490
+ std .debug .assert (node .value .info .version > last_version );
491
+ last_version = node .value .info .version ;
492
+ }
493
+ }
494
+
495
+ return result ;
496
+ }
497
+
468
498
test {
469
499
_ = @import ("index_tests.zig" );
470
500
}
0 commit comments