From dbe39d810c96188fc45be77bfe3cf745b3d96707 Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Sun, 23 Nov 2025 09:55:20 +1100 Subject: [PATCH] Ranking fix for MM finals 2025 --- src/shared/utils/mm-review-summations.js | 46 +++++++++++++++--------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/shared/utils/mm-review-summations.js b/src/shared/utils/mm-review-summations.js index 115f01e18..282c6effe 100644 --- a/src/shared/utils/mm-review-summations.js +++ b/src/shared/utils/mm-review-summations.js @@ -54,6 +54,7 @@ function ensureSubmissionEntry(existingEntry, { submissionId, timestamp, timesta const baseEntry = { submissionId, submissionTime: timestamp || null, + isLatest: null, provisionalScore: null, finalScore: null, status: 'completed', @@ -80,6 +81,7 @@ function ensureSubmissionEntry(existingEntry, { submissionId, timestamp, timesta ...existingEntry, submissionId: existingEntry.submissionId || submissionId, submissionTime: existingEntry.submissionTime || baseEntry.submissionTime, + isLatest: existingEntry.isLatest === undefined ? baseEntry.isLatest : existingEntry.isLatest, status: existingEntry.status || 'completed', reviewSummations, reviewSummation, @@ -128,6 +130,7 @@ function updateSubmissionEntry(existingEntry, { normalizedScore, summation, isProvisional, + isLatest, }) { const baseEntry = ensureSubmissionEntry(existingEntry, { submissionId, @@ -137,10 +140,12 @@ function updateSubmissionEntry(existingEntry, { const { submissionTime: baseSubmissionTime, latestTimestamp: baseLatestTimestamp, + isLatest: baseIsLatest, } = baseEntry; let submissionTime = baseSubmissionTime; let latestTimestamp = baseLatestTimestamp; + let submissionIsLatest = baseIsLatest; if (timestampValue > latestTimestamp) { latestTimestamp = timestampValue; @@ -149,6 +154,10 @@ function updateSubmissionEntry(existingEntry, { submissionTime = timestamp; } + if (!_.isNil(isLatest)) { + submissionIsLatest = Boolean(isLatest); + } + const provisionalResult = isProvisional ? mergeScoreData( baseEntry.provisionalMeta, @@ -173,6 +182,7 @@ function updateSubmissionEntry(existingEntry, { ...baseEntry, submissionTime, latestTimestamp, + isLatest: submissionIsLatest, provisionalMeta: provisionalResult.meta, provisionalScore: provisionalResult.value, finalMeta: finalResult.meta, @@ -278,8 +288,6 @@ export function buildMmSubmissionData(reviewSummations = []) { memberId: null, rating: null, submissionsMap: new Map(), - bestProvisionalScore: null, - bestFinalScore: null, }); } @@ -302,7 +310,7 @@ export function buildMmSubmissionData(reviewSummations = []) { const normalizedScore = normalizeScoreValue(_.get(summation, 'aggregateScore')); const isProvisional = Boolean(summation.isProvisional); - const isLatest = _.isNil(summation.isLatest) ? true : Boolean(summation.isLatest); + const isLatest = _.isNil(summation.isLatest) ? null : Boolean(summation.isLatest); const updatedEntry = updateSubmissionEntry(memberEntry.submissionsMap.get(submissionId), { submissionId, @@ -311,21 +319,10 @@ export function buildMmSubmissionData(reviewSummations = []) { normalizedScore, summation, isProvisional, + isLatest, }); memberEntry.submissionsMap.set(submissionId, updatedEntry); - - if (!_.isNil(normalizedScore) && isLatest) { - if (isProvisional) { - memberEntry.bestProvisionalScore = _.isNil(memberEntry.bestProvisionalScore) - ? normalizedScore - : Math.max(memberEntry.bestProvisionalScore, normalizedScore); - } else { - memberEntry.bestFinalScore = _.isNil(memberEntry.bestFinalScore) - ? normalizedScore - : Math.max(memberEntry.bestFinalScore, normalizedScore); - } - } }); const members = Array.from(membersByHandle.values()).map((memberEntry) => { @@ -333,6 +330,7 @@ export function buildMmSubmissionData(reviewSummations = []) { .map(submission => ({ submissionId: submission.submissionId, submissionTime: submission.submissionTime, + isLatest: submission.isLatest, provisionalScore: _.isNil(submission.provisionalScore) ? null : submission.provisionalScore, finalScore: _.isNil(submission.finalScore) ? null : submission.finalScore, status: submission.status || 'completed', @@ -341,6 +339,20 @@ export function buildMmSubmissionData(reviewSummations = []) { })) .sort((a, b) => toTimestampValue(b.submissionTime) - toTimestampValue(a.submissionTime)); + const hasLatestFlag = submissions.some(s => !_.isNil(s.isLatest)); + const latestSubmissions = hasLatestFlag ? submissions.filter(s => s.isLatest) : submissions; + const candidates = latestSubmissions.length ? latestSubmissions : submissions; + const bestProvisionalScore = _.chain(candidates) + .map(s => (_.isNil(s.provisionalScore) ? null : s.provisionalScore)) + .filter(s => !_.isNil(s)) + .max() + .value() || null; + const bestFinalScore = _.chain(candidates) + .map(s => (_.isNil(s.finalScore) ? null : s.finalScore)) + .filter(s => !_.isNil(s)) + .max() + .value() || null; + const rating = _.isNil(memberEntry.rating) ? null : memberEntry.rating; const memberId = memberEntry.memberId ? _.toString(memberEntry.memberId) : null; @@ -358,8 +370,8 @@ export function buildMmSubmissionData(reviewSummations = []) { provisionalRank: null, finalRank: null, submissions, - bestProvisionalScore: memberEntry.bestProvisionalScore, - bestFinalScore: memberEntry.bestFinalScore, + bestProvisionalScore, + bestFinalScore, }; });