Skip to content

Commit

Permalink
Merge pull request #138 from topcoder-platform/feature/emsi_skills_se…
Browse files Browse the repository at this point in the history
…arch

HOTFIX - only add namesandhandle trait to paginated search results for performance reasons
  • Loading branch information
jmgasper committed Aug 15, 2023
2 parents d56dbe2 + 8a45ac4 commit 37a8175
Showing 1 changed file with 47 additions and 42 deletions.
89 changes: 47 additions & 42 deletions src/services/SearchService.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,41 +107,41 @@ searchMembers.schema = {

async function addStats(results, query){
console.log("Adding stats to results")
// get stats for the members fetched
const docsStats = await eshelper.getMembersStats(query, esClient)
// extract data from hits
const mbrsSkillsStats = _.map(docsStats.hits.hits, (item) => item._source)

// merge overall members and stats
const mbrsSkillsStatsKeys = _.keyBy(mbrsSkillsStats, 'userId')
const resultsWithStats = _.map(results, function (item) {
item.numberOfChallengesWon = 0;
item.numberOfChallengesPlaced = 0;
if (mbrsSkillsStatsKeys[item.userId]) {
item.stats = []
if (mbrsSkillsStatsKeys[item.userId].maxRating) {
// add the maxrating
item.maxRating = mbrsSkillsStatsKeys[item.userId].maxRating
// set the rating color
if (item.maxRating.hasOwnProperty('rating')) {
item.maxRating.ratingColor = helper.getRatingColor(item.maxRating.rating)
}
}
if (mbrsSkillsStatsKeys[item.userId].wins > item.numberOfChallengesWon) {
item.numberOfChallengesWon = mbrsSkillsStatsKeys[item.userId].wins
// get stats for the members fetched
const docsStats = await eshelper.getMembersStats(query, esClient)
// extract data from hits
const mbrsSkillsStats = _.map(docsStats.hits.hits, (item) => item._source)

// merge overall members and stats
const mbrsSkillsStatsKeys = _.keyBy(mbrsSkillsStats, 'userId')
const resultsWithStats = _.map(results, function (item) {
item.numberOfChallengesWon = 0;
item.numberOfChallengesPlaced = 0;
if (mbrsSkillsStatsKeys[item.userId]) {
item.stats = []
if (mbrsSkillsStatsKeys[item.userId].maxRating) {
// add the maxrating
item.maxRating = mbrsSkillsStatsKeys[item.userId].maxRating
// set the rating color
if (item.maxRating.hasOwnProperty('rating')) {
item.maxRating.ratingColor = helper.getRatingColor(item.maxRating.rating)
}
}
if (mbrsSkillsStatsKeys[item.userId].wins > item.numberOfChallengesWon) {
item.numberOfChallengesWon = mbrsSkillsStatsKeys[item.userId].wins
}

item.numberOfChallengesPlaced = mbrsSkillsStatsKeys[item.userId].challenges
item.numberOfChallengesPlaced = mbrsSkillsStatsKeys[item.userId].challenges

// clean up stats fileds and filter on stats fields
item.stats.push(_.pick(mbrsSkillsStatsKeys[item.userId], MEMBER_STATS_FIELDS))
} else {
item.stats = []
}
return item
})
// clean up stats fields and filter on stats fields
item.stats.push(_.pick(mbrsSkillsStatsKeys[item.userId], MEMBER_STATS_FIELDS))
} else {
item.stats = []
}
return item
})

return resultsWithStats
return resultsWithStats
}

async function addNamesAndHandleAppearance(results, query){
Expand Down Expand Up @@ -202,31 +202,36 @@ async function fillMembers(docsMembers, query, fields) {
let results = []
if (total > 0) {
// extract member profiles from hits
const members = _.map(docsMembers.hits.hits, (item) => item._source)
results = _.map(docsMembers.hits.hits, (item) => item._source)

// search for a list of members
query.handlesLower = _.map(members, 'handleLower')
query.memberIds = _.map(members, 'userId')

results = await addNamesAndHandleAppearance(members, query)
query.handlesLower = _.map(results, 'handleLower')
query.memberIds = _.map(results, 'userId')

// Include the stats by default, but allow them to be ignored with ?includeStats=false
// This is for performance reasons - pulling the stats is a bit of a resource hog
if(!query.includeStats || query.includeStats=="true"){
results = await addStats(results, query)
console.log(results[0])
}

results = await addVerifiedFlag(results)


// filter member based on fields
results = _.map(results, (item) => _.pick(item, fields))

// Sort the results
results = _.orderBy(members, [query.sortBy, "handleLower"], [query.sortOrder])
results = _.orderBy(results, [query.sortBy, "handleLower"], [query.sortOrder])

results = helper.paginate(results, query.perPage, query.page - 1)
// filter member based on fields

// Add the name and handle appearance and verified flag *only* to each page, for performance
query.handlesLower = _.map(results, 'handleLower')
query.memberIds = _.map(results, 'userId')

results = await addNamesAndHandleAppearance(results, query)
results = await addVerifiedFlag(results)
}

results = helper.paginate(results, query.perPage, query.page - 1)
// filter member based on fields

return { total: total, page: query.page, perPage: query.perPage, result: results }
}
Expand Down

0 comments on commit 37a8175

Please sign in to comment.