╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────╮ │src/event/Repo.zig│ ╰──────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────╮ │79 const user_id_to_repo_id_set = try DB.HashMap(.read_write).init(user_id_to_repo_id_set_cursor);│ │80 │ │81 if (existing_record_maybe) |existing_record| { │ │82 - // updates preserve the original creation timestamp │ │83 - record_to_write.created_ts = existing_record.created_ts; │ │84 - const order_key = evt.orderKeyDesc(existing_record.created_ts, event_id); │ │82 + // updates preserve the original creation metadata │ │83 + record_to_write.created_order = existing_record.created_order; │ │84 + const order_key = evt.orderKeyDesc(existing_record.created_order, event_id); │ │85 │ │86 // drop the old active indexes; active values are re-added below │ │87 if (!existing_record.removed) { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 97 const repo_cursor = try event_id_to_repo.putCursor(repo_key); │ │ 98 const repo = try DB.HashMap(.read_write).init(repo_cursor); │ │ 99 try evt.upsert(Record, DB, hash_kind, repo, record_to_write); │ │100 - try evt.indexEvent(DB, hash_kind, haxy_moment, event_id, .repo, record_to_write.created_ts, record_to_write.removed); │ │100 + try evt.indexEvent(DB, hash_kind, haxy_moment, event_id, .repo, record_to_write.created_order, record_to_write.removed);│ │101 │ │102 - const order_key = evt.orderKeyDesc(record_to_write.created_ts, event_id); │ │102 + const order_key = evt.orderKeyDesc(record_to_write.created_order, event_id); │ │103 │ │104 // the id set retains removed records so merges can carry removals │ │105 if (existing_cursor_maybe == null) { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────╮ │src/event/User.zig│ ╰──────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ │15 pub const Record = struct { │ │16 event: Self, │ │17 removed: bool = false, │ │18 - created_ts: u64 = 0, // the commit timestamp of the event that first created this user│ │18 + created_order: u64 = 0, │ │19 │ │20 // a user's key in the name index │ │21 pub fn indexKey(self: Record, allocator: std.mem.Allocator) ![]const u8 { │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────╮ │ 97 if (!record_to_write.removed) try validateName(record_to_write.event.name);│ │ 98 │ │ 99 if (existing_record_maybe) |existing_record| { │ │100 - // updates preserve the original creation timestamp │ │101 - record_to_write.created_ts = existing_record.created_ts; │ │100 + // updates preserve the original creation metadata │ │101 + record_to_write.created_order = existing_record.created_order; │ │102 │ │103 // drop the old active indexes; active values are re-added below │ │104 if (!existing_record.removed) { │ ╰────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │110 const user_cursor = try event_id_to_user.putCursor(user_key); │ │111 const user = try DB.HashMap(.read_write).init(user_cursor); │ │112 try evt.upsert(Record, DB, hash_kind, user, record_to_write); │ │113 - try evt.indexEvent(DB, hash_kind, haxy_moment, event_id, .user, record_to_write.created_ts, record_to_write.removed); │ │113 + try evt.indexEvent(DB, hash_kind, haxy_moment, event_id, .user, record_to_write.created_order, record_to_write.removed);│ │114 │ │115 - const order_key = evt.orderKeyDesc(record_to_write.created_ts, event_id); │ │115 + const order_key = evt.orderKeyDesc(record_to_write.created_order, event_id); │ │116 │ │117 // the id set retains removed records so merges can carry removals │ │118 if (existing_cursor_maybe == null) { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────╮ │src/test/event.zig│ ╰──────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮ │692 const conflicts = try Repo.DB.SortedMap(.read_only).init(conflicts_cursor); │ │693 try std.testing.expectEqual(1, try conflicts.count()); │ │694 │ │695 - const order_key = evt.orderKeyDesc(issue.created_ts, &issue_id); │ │695 + const order_key = evt.orderKeyDesc(issue.created_order, &issue_id); │ │696 const conflict_cursor = try conflicts.getCursor(&order_key) orelse return error.NotFound;│ │697 const conflict = try Repo.DB.HashMap(.read_only).init(conflict_cursor); │ │698 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │1172 │ │1173 try std.testing.expectEqual(1, try user_repos.count()); │ │1174 │ │1175 - // the set is keyed by orderKeyDesc([created-ts][event-id]) │ │1176 - const order_key = evt.orderKeyDesc(repo_event.created_ts, &repo_event_id); │ │1175 + // the set is keyed by orderKeyDesc([created-order][event-id]) │ │1176 + const order_key = evt.orderKeyDesc(repo_event.created_order, &repo_event_id);│ │1177 try std.testing.expect(try user_repos.contains(&order_key)); │ │1178 } │ │1179 │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1324 try std.testing.expectEqual(expected.len, try set.count()); │ │1325 for (expected, 0..) |id, i| { │ │1326 const kv = (try set.getIndexKeyValuePair(@intCast(i))) orelse return error.NotFound; │ │1327 - // the key is orderKeyDesc ([timestamp][event-id]); its trailing bytes are the id │ │1327 + // the key is orderKeyDesc ([created-order][event-id]); its trailing bytes are the id│ │1328 var order_key: [@sizeOf(u64) + evt.event_id_size]u8 = undefined; │ │1329 _ = try kv.key_cursor.readBytes(&order_key); │ │1330 try std.testing.expectEqualSlices(u8, id, order_key[@sizeOf(u64)..]); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1332 } │ │1333 }; │ │1334 │ │1335 - // one user, then four repos, each with its own creation timestamp (user@100, │ │1336 - // repos@101..104) │ │1335 + // one user, then four repos in creation order with deliberately skewed │ │1336 + // timestamps │ │1337 const events = [_]evt.EventWithId{ │ │1338 .{ .id = std.fmt.bytesToHex(user_id, .lower), .author = author, .timestamp = 100, .event = .{ .user = .{ .name = "alice", .email = "alice@example.test", .password_hash = pw } } },│ │1339 - .{ .id = std.fmt.bytesToHex(repo_ids[0], .lower), .author = author, .timestamp = 101, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo0", .description = "d0" } } }, │ │1340 - .{ .id = std.fmt.bytesToHex(repo_ids[1], .lower), .author = author, .timestamp = 102, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo1", .description = "d1" } } }, │ │1341 - .{ .id = std.fmt.bytesToHex(repo_ids[2], .lower), .author = author, .timestamp = 103, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo2", .description = "d2" } } }, │ │1342 - .{ .id = std.fmt.bytesToHex(repo_ids[3], .lower), .author = author, .timestamp = 104, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo3", .description = "d3" } } }, │ │1339 + .{ .id = std.fmt.bytesToHex(repo_ids[0], .lower), .author = author, .timestamp = 10_000, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo0", .description = "d0" } } }, │ │1340 + .{ .id = std.fmt.bytesToHex(repo_ids[1], .lower), .author = author, .timestamp = 10, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo1", .description = "d1" } } }, │ │1341 + .{ .id = std.fmt.bytesToHex(repo_ids[2], .lower), .author = author, .timestamp = 5_000, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo2", .description = "d2" } } }, │ │1342 + .{ .id = std.fmt.bytesToHex(repo_ids[3], .lower), .author = author, .timestamp = 20, .event = .{ .repo = .{ .user_id = &user_id, .name = "repo3", .description = "d3" } } }, │ │1343 }; │ │1344 try evt.consume(.xit, repo_opts, io, allocator, &repo, evt.events_ref, &events); │ │1345 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭────────────────────────────────────────────────────────────╮ │111 name: Array(repo_route_max_len), │ │112 tag: Array(discussion_tag_route_max_len) = .{},│ │113 selected: Array(evt.event_id_size * 2) = .{}, │ │114 - view: DiscussionsView = .all, │ │114 + view: DiscussionsView = .recent, │ │115 comments_start: usize = 0, │ │116 comment: Array(evt.event_id_size * 2) = .{}, │ │117 }, │ ╰────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯