fix: add deterministic tiebreaker to RR host selection algorithm (#28783)
* fix: add deterministic tiebreaker to RR host selection algorithm * chore: cleanup comments * Update packages/features/bookings/lib/getLuckyUser.integration-test.ts Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Sahitya Chandra <sahityajb@gmail.com> Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Sahitya Chandra
devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent
4313bd2dc5
commit
88859e4e31
@@ -441,7 +441,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
|
||||
vi.setSystemTime("2024-11-14T00:00:13Z");
|
||||
});
|
||||
|
||||
it("should sort as per availableUsers if no other criteria like weight/priority/calibration (TODO: make it independent of availableUsers order)", async () => {
|
||||
it("should sort by user id if no other criteria like weight/priority/calibration", async () => {
|
||||
const [host1, host2, host3] = await Promise.all([
|
||||
createHostWithBookings({
|
||||
user: { email: "test-user1@example.com" },
|
||||
@@ -475,7 +475,9 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
|
||||
routingFormResponse: null,
|
||||
});
|
||||
|
||||
expectLuckyUsers(luckyUsers, [user2, user1, user3]);
|
||||
const expectedOrder = [user1, user2, user3].sort((a, b) => a.id - b.id)
|
||||
|
||||
expectLuckyUsers(luckyUsers, expectedOrder);
|
||||
|
||||
const { users: luckyUsers2 } = await luckyUserService.getOrderedListOfLuckyUsers({
|
||||
availableUsers: [user3, user1, user2],
|
||||
@@ -487,7 +489,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
|
||||
allRRHosts: [],
|
||||
routingFormResponse: null,
|
||||
});
|
||||
expectLuckyUsers(luckyUsers2, [user3, user1, user2]);
|
||||
expectLuckyUsers(luckyUsers2, expectedOrder);
|
||||
});
|
||||
|
||||
describe("should sort as per weights", () => {
|
||||
|
||||
@@ -170,6 +170,7 @@ export class LuckyUserService implements ILuckyUserService {
|
||||
availableUsers,
|
||||
bookingsOfAvailableUsers,
|
||||
organizersWithLastCreated,
|
||||
eventType,
|
||||
}: GetLuckyUserParams<T> & {
|
||||
bookingsOfAvailableUsers: PartialBooking[];
|
||||
organizersWithLastCreated: { id: number; bookings: { createdAt: Date }[] }[];
|
||||
@@ -216,7 +217,7 @@ export class LuckyUserService implements ILuckyUserService {
|
||||
const leastRecentlyBookedUser = availableUsers.sort((a, b) => {
|
||||
if (userIdAndAtCreatedPair[a.id] > userIdAndAtCreatedPair[b.id]) return 1;
|
||||
else if (userIdAndAtCreatedPair[a.id] < userIdAndAtCreatedPair[b.id]) return -1;
|
||||
else return 0;
|
||||
else return eventType.isRRWeightsEnabled ? 0 : a.id - b.id;
|
||||
})[0];
|
||||
|
||||
return leastRecentlyBookedUser;
|
||||
|
||||
Reference in New Issue
Block a user