Skip to content

Commit b4b9d21

Browse files
committed
Merge
2 parents 91ebfef + af1b781 commit b4b9d21

9 files changed

Lines changed: 519 additions & 72 deletions

src/common/prismaHelper.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ const marathonRankFields = [
4949
'minimumRating', 'maximumRating', 'countryRank', 'schoolRank', 'defaultLanguage'
5050
]
5151

52+
const groupedSubTrackStatsTrackNames = ['DEVELOP', 'DESIGN', 'QA']
53+
const supportedUnifiedStatsTrackNames = ['DEVELOP', 'DESIGN', 'DATA_SCIENCE', 'QA', 'COPILOT']
54+
const supportedUnifiedHistoryTrackNames = ['DEVELOP', 'DESIGN', 'DATA_SCIENCE', 'QA']
55+
5256
const auditFields = [
5357
'createdAt', 'createdBy', 'updatedAt', 'updatedBy'
5458
]
@@ -331,8 +335,10 @@ function applyMaxRatingRankFallback (item) {
331335
return
332336
}
333337

334-
if (trackName === 'DEVELOP' && item.DEVELOP && _.isArray(item.DEVELOP.subTracks)) {
335-
const statsItem = _.find(item.DEVELOP.subTracks, subTrack =>
338+
if ((trackName === 'DEVELOP' || trackName === 'QA') &&
339+
item[trackName] &&
340+
_.isArray(item[trackName].subTracks)) {
341+
const statsItem = _.find(item[trackName].subTracks, subTrack =>
336342
getUnifiedTypeName(subTrack.id || subTrack.name) === typeName
337343
)
338344
if (statsItem) {
@@ -616,7 +622,7 @@ function buildUnifiedStatsResponse (member, statsData, fields) {
616622
resolvedTrackName: getUnifiedTrackName(row.trackName || row.trackId),
617623
resolvedTypeName: getUnifiedTypeName(row.typeName || row.typeId)
618624
}))
619-
.filter(row => _.includes(['DEVELOP', 'DESIGN', 'DATA_SCIENCE', 'COPILOT'], row.resolvedTrackName))
625+
.filter(row => _.includes(supportedUnifiedStatsTrackNames, row.resolvedTrackName))
620626
.value()
621627
const first = _.head(validRows) || {}
622628
const item = {
@@ -635,18 +641,18 @@ function buildUnifiedStatsResponse (member, statsData, fields) {
635641
_.forEach(validRows, (row) => {
636642
const trackName = row.resolvedTrackName
637643
const typeName = row.resolvedTypeName
638-
if (trackName === 'DEVELOP') {
644+
if (trackName === 'DEVELOP' || trackName === 'QA') {
639645
const challengeCount = toNumber(row.challenges)
640-
if (!item.DEVELOP) {
641-
item.DEVELOP = {
646+
if (!item[trackName]) {
647+
item[trackName] = {
642648
challenges: 0,
643649
wins: 0,
644650
mostRecentSubmission: null,
645651
mostRecentEventDate: null,
646652
subTracks: []
647653
}
648654
}
649-
mergeTrackCounters(item.DEVELOP, row)
655+
mergeTrackCounters(item[trackName], row)
650656
const submissionStats = _.omitBy({
651657
..._.pick(row, developSubmissionFields),
652658
..._.mapValues(_.pick(row, developSubmissionBigIntFields), v => toNumber(v))
@@ -686,7 +692,7 @@ function buildUnifiedStatsResponse (member, statsData, fields) {
686692
rank.minRating = row.minRating
687693
}
688694
subTrackItem.rank = rank
689-
item.DEVELOP.subTracks.push(subTrackItem)
695+
item[trackName].subTracks.push(subTrackItem)
690696
} else if (trackName === 'DESIGN') {
691697
if (!item.DESIGN) {
692698
item.DESIGN = {
@@ -815,7 +821,7 @@ function buildUnifiedStatsHistoryResponse (member, historyStats, fields) {
815821
resolvedTrackName: getUnifiedTrackName(row.trackName || row.trackId),
816822
resolvedTypeName: getUnifiedTypeName(row.typeName || row.typeId)
817823
}))
818-
.filter(row => _.includes(['DEVELOP', 'DESIGN', 'DATA_SCIENCE'], row.resolvedTrackName))
824+
.filter(row => _.includes(supportedUnifiedHistoryTrackNames, row.resolvedTrackName))
819825
.value()
820826
const first = _.head(validRows) || {}
821827
const item = {
@@ -828,8 +834,8 @@ function buildUnifiedStatsHistoryResponse (member, historyStats, fields) {
828834
const groupedByTrackType = _.groupBy(validRows, row => `${row.resolvedTrackName}::${row.resolvedTypeName}`)
829835
_.forEach(groupedByTrackType, (trackHistory, key) => {
830836
const [trackName, typeName] = key.split('::')
831-
if (trackName === 'DEVELOP' || trackName === 'DESIGN') {
832-
const historyTrackName = trackName === 'DESIGN' ? 'DESIGN' : 'DEVELOP'
837+
if (_.includes(groupedSubTrackStatsTrackNames, trackName)) {
838+
const historyTrackName = trackName
833839
if (!item[historyTrackName]) {
834840
item[historyTrackName] = { subTracks: [] }
835841
}

src/common/statsDimensionHelper.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ const TRACK_NAMES = {
44
DEVELOP: 'DEVELOP',
55
DESIGN: 'DESIGN',
66
DATA_SCIENCE: 'DATA_SCIENCE',
7+
QA: 'QA',
78
COPILOT: 'COPILOT'
89
}
910

1011
const TYPE_NAMES = {
1112
CHALLENGE: 'Challenge',
1213
CODE: 'CODE',
14+
BUG_HUNT: 'BUG_HUNT',
15+
TEST_SCENARIOS: 'TEST_SCENARIOS',
16+
TEST_SUITES: 'TEST_SUITES',
1317
FIRST2FINISH: 'First2Finish',
1418
TASK: 'Task',
1519
SRM: 'SRM',
@@ -48,6 +52,10 @@ function getCanonicalTrackName (value) {
4852
return TRACK_NAMES.DATA_SCIENCE
4953
}
5054

55+
if (normalized === 'QA' || (normalized.includes('QUALITY') && normalized.includes('ASSURANCE'))) {
56+
return TRACK_NAMES.QA
57+
}
58+
5159
if (normalized.includes('DEVELOP') || normalized === 'DEV') {
5260
return TRACK_NAMES.DEVELOP
5361
}
@@ -140,6 +148,9 @@ function buildChallengeDimensionLookup (trackRows, typeRows) {
140148
addLookupEntry(trackIdsByLookup, row.abbreviation, id)
141149
addLookupEntry(trackIdsByLookup, row.legacyId, id)
142150
addLookupEntry(trackIdsByLookup, canonicalTrackName, id)
151+
if (canonicalTrackName === TRACK_NAMES.QA) {
152+
addLookupEntry(trackIdsByLookup, 'QUALITY_ASSURANCE', id)
153+
}
143154
})
144155

145156
typeRows.forEach((row) => {
@@ -170,11 +181,15 @@ function buildChallengeDimensionLookup (trackRows, typeRows) {
170181
DEVELOP: resolveTrackIdFromLookup(lookup, TRACK_NAMES.DEVELOP) || null,
171182
DESIGN: resolveTrackIdFromLookup(lookup, TRACK_NAMES.DESIGN) || null,
172183
DATA_SCIENCE: resolveTrackIdFromLookup(lookup, TRACK_NAMES.DATA_SCIENCE) || null,
184+
QA: resolveTrackIdFromLookup(lookup, TRACK_NAMES.QA) || null,
173185
COPILOT: resolveTrackIdFromLookup(lookup, TRACK_NAMES.COPILOT) || null
174186
}
175187
lookup.typeIds = {
176188
CHALLENGE: resolveTypeIdFromLookup(lookup, TYPE_NAMES.CHALLENGE) || null,
177189
CODE: resolveTypeIdFromLookup(lookup, TYPE_NAMES.CODE) || null,
190+
BUG_HUNT: resolveTypeIdFromLookup(lookup, TYPE_NAMES.BUG_HUNT) || null,
191+
TEST_SCENARIOS: resolveTypeIdFromLookup(lookup, TYPE_NAMES.TEST_SCENARIOS) || null,
192+
TEST_SUITES: resolveTypeIdFromLookup(lookup, TYPE_NAMES.TEST_SUITES) || null,
178193
FIRST2FINISH: resolveTypeIdFromLookup(lookup, TYPE_NAMES.FIRST2FINISH) || null,
179194
TASK: resolveTypeIdFromLookup(lookup, TYPE_NAMES.TASK) || null,
180195
SRM: resolveTypeIdFromLookup(lookup, TYPE_NAMES.SRM) || null,

src/scripts/recalculateMemberStats.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ function isMarathonMatchTypeId (typeId) {
365365
/**
366366
* Normalize challenge metadata dimensions into the public stats dimensions.
367367
* Marathon Match stats/history belong to DATA_SCIENCE even when the source
368-
* challenge row was imported with a Development track.
368+
* challenge row was imported with a Development track. QA Challenge rows belong
369+
* to the first-class QA / Challenge dimension.
369370
* @param {*} trackId raw ChallengeTrack id
370371
* @param {*} typeId raw ChallengeType id
371372
* @returns {Object} normalized trackId/typeId pair
@@ -379,6 +380,20 @@ function normalizeChallengeStatsDimension (trackId, typeId) {
379380
}
380381
}
381382

383+
const trackName = resolveTrackNameFromLookup(legacyLookupCache, trackId)
384+
const typeName = resolveTypeNameFromLookup(legacyLookupCache, normalizedTypeId) || resolveTypeName(normalizedTypeId)
385+
const normalizedTrackName = normalizeLookupKey(trackName).replace(/[\s-]+/g, '_')
386+
if (legacyLookupCache &&
387+
(normalizedTrackName === 'QUALITY_ASSURANCE' || normalizedTrackName === 'QA') &&
388+
typeName === TYPE_NAMES.CHALLENGE &&
389+
legacyLookupCache.trackIds.QA &&
390+
legacyLookupCache.typeIds.CHALLENGE) {
391+
return {
392+
trackId: legacyLookupCache.trackIds.QA,
393+
typeId: legacyLookupCache.typeIds.CHALLENGE
394+
}
395+
}
396+
382397
return {
383398
trackId: String(trackId),
384399
typeId: normalizedTypeId

src/services/SearchService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const MEMBER_AUTOCOMPLETE_FIELDS = ['userId', 'handle', 'handleLower',
4949

5050
var MEMBER_STATS_FIELDS = ['userId', 'handle', 'handleLower', 'maxRating',
5151
'numberOfChallengesWon', 'numberOfChallengesPlaced',
52-
'challenges', 'wins', 'DEVELOP', 'DESIGN', 'DATA_SCIENCE', 'COPILOT']
52+
'challenges', 'wins', 'DEVELOP', 'DESIGN', 'DATA_SCIENCE', 'QA', 'COPILOT']
5353

5454
const SKILL_LEVEL_WEIGHTS = {
5555
verified: 1.0,

0 commit comments

Comments
 (0)