╭ changed ────────────╮ │src/ui/Home/Repos.zig│ ╰─────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │33 const empty: Self = .{ .repos = &.{}, .owner_names = &.{}, .after = after, .next_after = null }; │ │34 │ │35 // the repos ordered by creation time (oldest first); absent until the first │ │36 - // repo exists. keyed by [timestamp][event-id], value = event-id. │ │37 - const created_ts_to_repo_id_cursor = try haxy_moment.getCursor(hash.hashInt(hash_kind, "created-ts->repo-id")) orelse return empty;│ │38 - const created_ts_to_repo_id = try DB.SortedMap(.read_only).init(created_ts_to_repo_id_cursor); │ │39 - const count = try created_ts_to_repo_id.count(); │ │36 + // repo exists. keyed by orderKey ([timestamp][event-id]); the trailing bytes │ │37 + // of each key are the repo event id. │ │38 + const repo_id_set_cursor = try haxy_moment.getCursor(hash.hashInt(hash_kind, "repo-id-set")) orelse return empty; │ │39 + const repo_id_set = try DB.SortedSet(.read_only).init(repo_id_set_cursor); │ │40 + const count = try repo_id_set.count(); │ │41 │ │42 const event_id_to_repo_cursor = try haxy_moment.getCursor(hash.hashInt(hash_kind, "event-id->repo")) orelse return empty; │ │43 const event_id_to_repo = try DB.HashMap(.read_only).init(event_id_to_repo_cursor); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────╮ │45 // read the window [after, after+page_size) with one seek to the start rank,│ │46 // then a sequential walk │ │47 const end = @min(after + page_size, count); │ │47 - var iter = try created_ts_to_repo_id.iteratorFromIndex(after); │ │48 + var iter = try repo_id_set.iteratorFromIndex(after); │ │49 var i = after; │ │50 while (i < end) : (i += 1) { │ │51 var id_cursor = (try iter.next()) orelse break; │ ╰────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │52 const id_kv = try id_cursor.readKeyValuePair(); │ │52 - var event_id: [evt.event_id_size]u8 = undefined; │ │53 - _ = try id_kv.value_cursor.readBytes(&event_id); │ │54 - const repo_cursor = try event_id_to_repo.getCursor(hash.hashInt(hash_kind, &event_id)) orelse continue;│ │53 + var order_key: [@sizeOf(u64) + evt.event_id_size]u8 = undefined; │ │54 + _ = try id_kv.key_cursor.readBytes(&order_key); │ │55 + const event_id = order_key[@sizeOf(u64)..]; │ │56 + const repo_cursor = try event_id_to_repo.getCursor(hash.hashInt(hash_kind, event_id)) orelse continue; │ │57 const repo_map = try DB.HashMap(.read_only).init(repo_cursor); │ │58 const repo_event = try evt.read(evt.Repo, DB, hash_kind, arena, repo_map); │ │59 try repos.append(arena.allocator(), repo_event); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯