Skip to content

Commit 16377dc

Browse files
Merge pull request #95 from topcoder-platform/PM-4931
Pm 4931 Fix query to account for verified skills coming from submissions
2 parents 52bb08e + 3c08613 commit 16377dc

4 files changed

Lines changed: 34 additions & 21 deletions

File tree

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ workflows:
6464
branches:
6565
only:
6666
- develop
67-
- PM-4961
67+
- PM-4931
6868

6969
# Production builds are exectuted only on tagged commits to the
7070
# master branch.

src/reports/member/dto/member-search-response.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class MatchedSkillDto {
99

1010
@ApiProperty({
1111
description:
12-
"True when the member has at least one challenge-win event for this skill.",
12+
"True for platform-backed skill activity (wins and/or skill events). Matched skills only include these, not self-attested-only skills.",
1313
})
1414
isVerified!: boolean;
1515

src/reports/member/member-search.service.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ describe("MemberSearchService", () => {
142142
expect(dataSql).not.toContain(
143143
'EXISTS (SELECT 1 FROM recently_active ra WHERE ra.user_id = m."userId")',
144144
);
145-
expect(dataSql).not.toContain("COALESCE(m.verified, false) = true");
146145
});
147146

148147
it("adds profileComplete CTE/join only when enabled and keeps count params free of pagination", async () => {
@@ -226,7 +225,11 @@ describe("MemberSearchService", () => {
226225
expect(validationParams).toEqual([[skillA, skillB]]);
227226

228227
expect(dataSql).toContain("requested_skills AS");
228+
expect(dataSql).toContain("FILTER (WHERE usd.wins > 0 OR usd.submitted > 0)");
229229
expect(dataSql).toContain("INNER JOIN user_match_data umd");
230+
expect(dataSql).toContain("THEN COUNT(DISTINCT CASE");
231+
expect(dataSql).toContain("ELSE COUNT(DISTINCT CASE");
232+
expect(dataSql).toContain("(usd.wins >= rs.min_wins OR usd.submitted > 0)");
230233
expect(dataParams).toContainEqual([skillA, skillB]);
231234
expect(dataParams).toContainEqual([5, 0]);
232235
expect(dataParams).toContain("AND");

src/reports/member/member-search.service.ts

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -141,31 +141,41 @@ qualifying_users AS (
141141
GROUP BY usd.user_id
142142
HAVING
143143
CASE WHEN ${pSearchType} = 'AND'
144-
THEN COUNT(DISTINCT CASE WHEN usd.wins >= rs.min_wins THEN usd.skill_id END)
144+
THEN COUNT(DISTINCT CASE
145+
WHEN (usd.wins >= rs.min_wins OR usd.submitted > 0)
146+
THEN usd.skill_id END)
145147
= ${pNumSkills}::integer
146-
ELSE COUNT(DISTINCT CASE WHEN usd.wins >= rs.min_wins THEN usd.skill_id END) >= 1
148+
ELSE COUNT(DISTINCT CASE
149+
WHEN (usd.wins >= rs.min_wins OR usd.submitted > 0)
150+
THEN usd.skill_id END) >= 1
147151
END
148152
),
149153
user_match_data AS (
150154
SELECT
151155
usd.user_id,
152-
SUM(
153-
1.0
154-
+ LEAST(usd.wins::float / 100.0, 0.5)
155-
+ CASE WHEN usd.submitted > 0
156-
THEN (usd.wins::float / usd.submitted::float) * 0.5
157-
ELSE 0.0
158-
END
156+
COALESCE(
157+
SUM(
158+
1.0
159+
+ LEAST(usd.wins::float / 100.0, 0.5)
160+
+ CASE WHEN usd.submitted > 0
161+
THEN (usd.wins::float / usd.submitted::float) * 0.5
162+
ELSE 0.0
163+
END
164+
) FILTER (WHERE usd.wins > 0 OR usd.submitted > 0),
165+
0.0
159166
) AS total_skill_points,
160-
jsonb_agg(
161-
jsonb_build_object(
162-
'id', usd.skill_id::text,
163-
'name', usd.skill_name,
164-
'isVerified', usd.wins > 0,
165-
'wins', usd.wins,
166-
'submitted', usd.submitted
167-
)
168-
ORDER BY usd.skill_name
167+
COALESCE(
168+
jsonb_agg(
169+
jsonb_build_object(
170+
'id', usd.skill_id::text,
171+
'name', usd.skill_name,
172+
'isVerified', (usd.wins > 0 OR usd.submitted > 0),
173+
'wins', usd.wins,
174+
'submitted', usd.submitted
175+
)
176+
ORDER BY usd.skill_name
177+
) FILTER (WHERE usd.wins > 0 OR usd.submitted > 0),
178+
'[]'::jsonb
169179
) AS matched_skills
170180
FROM user_skill_data usd
171181
WHERE usd.user_id IN (SELECT user_id FROM qualifying_users)

0 commit comments

Comments
 (0)