Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ workflows:
only:
- develop
- PM-4931
- improve-member-search-2
- PM-4704
tags:
only: /^dev-.*/

Expand Down
5 changes: 5 additions & 0 deletions sql/reports/statistics/expert-skills/categories.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
SELECT
sc.id::text AS id,
sc.name
FROM skills.skill_category sc
ORDER BY sc.name ASC;
45 changes: 45 additions & 0 deletions sql/reports/statistics/expert-skills/category-members.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
WITH category_wins AS (
SELECT
se.user_id,
COUNT(*)::int AS wins
FROM skills.skill_event se
JOIN skills.skill sk
ON sk.id = se.skill_id
AND sk.deleted_at IS NULL
JOIN skills.skill_event_type set_t
ON set_t.id = se.skill_event_type_id
JOIN skills.source_type sest
ON sest.id = se.source_type_id
WHERE sk.category_id = $1::uuid
AND (
LOWER(set_t.name) IN (
'challenge_win',
'challenge_2nd_place',
'challenge_3rd_place',
'gig_completion'
)
OR sest.name = 'engagement'
)
GROUP BY se.user_id
)
SELECT
m.handle,
m."firstName" AS "firstName",
m."lastName" AS "lastName",
m."photoURL" AS "photoUrl",
COALESCE(m."homeCountryCode", m."competitionCountryCode", m.country, '') AS "countryCode",
COALESCE(mr.rating, 0) AS rating,
cw.wins
FROM category_wins cw
JOIN members.member m
ON m."userId" = cw.user_id
AND m.status = 'ACTIVE'
LEFT JOIN LATERAL (
SELECT rating
FROM members."memberMaxRating" mmr
WHERE mmr."userId" = m."userId"
ORDER BY mmr.rating DESC NULLS LAST
LIMIT 1
) mr ON TRUE
ORDER BY cw.wins DESC, m.handle ASC
LIMIT $2;
95 changes: 95 additions & 0 deletions sql/reports/statistics/expert-skills/category-stats.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
WITH requested_categories AS (
SELECT DISTINCT id
FROM unnest($1::uuid[]) AS t(id)
),
skill_counts AS (
SELECT
sk.category_id,
COUNT(*)::int AS total_skills
FROM skills.skill sk
WHERE sk.deleted_at IS NULL
AND sk.category_id = ANY($1::uuid[])
GROUP BY sk.category_id
),
member_counts AS (
SELECT
sk.category_id,
COUNT(DISTINCT us.user_id)::int AS total_members
FROM skills.user_skill us
JOIN skills.skill sk
ON sk.id = us.skill_id
AND sk.deleted_at IS NULL
WHERE sk.category_id = ANY($1::uuid[])
GROUP BY sk.category_id
),
win_events AS (
SELECT
sk.category_id,
sk.id AS skill_id,
sk.name AS skill_name,
se.user_id
FROM skills.skill_event se
JOIN skills.skill sk
ON sk.id = se.skill_id
AND sk.deleted_at IS NULL
JOIN skills.skill_event_type set_t
ON set_t.id = se.skill_event_type_id
JOIN skills.source_type sest
ON sest.id = se.source_type_id
WHERE sk.category_id = ANY($1::uuid[])
AND (
LOWER(set_t.name) IN (
'challenge_win',
'challenge_2nd_place',
'challenge_3rd_place',
'gig_completion'
)
OR sest.name = 'engagement'
)
),
win_counts AS (
SELECT
category_id,
COUNT(*)::int AS total_wins
FROM win_events
GROUP BY category_id
),
top_skills AS (
SELECT
category_id,
skill_name AS name,
COUNT(*)::int AS skill_wins,
ROW_NUMBER() OVER (
PARTITION BY category_id
ORDER BY COUNT(*) DESC, skill_name ASC
) AS rn
FROM win_events
GROUP BY category_id, skill_id, skill_name
)
SELECT
rc.id::text AS id,
COALESCE(mc.total_members, 0) AS "totalMembers",
COALESCE(sc.total_skills, 0) AS "totalSkills",
COALESCE(wc.total_wins, 0) AS "totalWins",
COALESCE(
(
SELECT jsonb_agg(
jsonb_build_object(
'name', ts.name,
'percentage', CASE
WHEN COALESCE(wc.total_wins, 0) = 0 THEN 0
ELSE ROUND((ts.skill_wins::numeric / wc.total_wins::numeric) * 100)::int
END
)
ORDER BY ts.rn
)
FROM top_skills ts
WHERE ts.category_id = rc.id
AND ts.rn <= 3
),
'[]'::jsonb
) AS "skillsBreakdown"
FROM requested_categories rc
LEFT JOIN skill_counts sc ON sc.category_id = rc.id
LEFT JOIN member_counts mc ON mc.category_id = rc.id
LEFT JOIN win_counts wc ON wc.category_id = rc.id;
3 changes: 3 additions & 0 deletions sql/reports/statistics/general/country-member-details.sql
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ stats_wins AS (
AND history."typeId" = stats."typeId"
LEFT JOIN challenges."ChallengeTrack" track
ON track.id::text = stats."trackId"
LEFT JOIN challenges."ChallengeType" ct
ON ct.id::text = stats."typeId"
WHERE stats."isPrivate" = false
AND (
UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DEVELOP%'
Expand All @@ -87,6 +89,7 @@ stats_wins AS (
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%QUALITY%ASSURANCE%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%COPILOT%'
)
AND (ct.name IS NULL OR NOT ct.name = ANY($1))
GROUP BY stats."userId"
),
winner_counts AS (
Expand Down
3 changes: 3 additions & 0 deletions sql/reports/statistics/general/first-place-by-country.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ member_wins AS (
AND history."typeId" = stats."typeId"
LEFT JOIN challenges."ChallengeTrack" track
ON track.id::text = stats."trackId"
LEFT JOIN challenges."ChallengeType" ct
ON ct.id::text = stats."typeId"
WHERE stats."isPrivate" = false
AND (
UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DEVELOP%'
Expand All @@ -28,6 +30,7 @@ member_wins AS (
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%QUALITY%ASSURANCE%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%COPILOT%'
)
AND (ct.name IS NULL OR NOT ct.name = ANY($1))
GROUP BY stats."userId"
),
winners_country AS (
Expand Down
3 changes: 3 additions & 0 deletions sql/reports/statistics/general/top-winners-by-country.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ stats_wins AS (
AND history."typeId" = stats."typeId"
LEFT JOIN challenges."ChallengeTrack" track
ON track.id::text = stats."trackId"
LEFT JOIN challenges."ChallengeType" ct
ON ct.id::text = stats."typeId"
WHERE stats."isPrivate" = false
AND (
UPPER(COALESCE(track.name, stats."trackId")) LIKE '%DEVELOP%'
Expand All @@ -28,6 +30,7 @@ stats_wins AS (
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%QUALITY%ASSURANCE%'
OR UPPER(COALESCE(track.name, stats."trackId")) LIKE '%COPILOT%'
)
AND (ct.name IS NULL OR NOT ct.name = ANY($1))
GROUP BY stats."userId"
),
winner_profiles AS (
Expand Down
48 changes: 48 additions & 0 deletions sql/reports/topcoder/campus-leaderboard-group.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
-- Resolves a campus program group by name (or id / legacy id) and reports whether
-- the caller ($2, an optional user id) belongs to it, directly or via a sub-group.
-- $1 = group name (case insensitive), $2 = caller user id (nullable)
WITH RECURSIVE params AS (
SELECT
LOWER(BTRIM($1)) AS group_key,
NULLIF(BTRIM(COALESCE($2, '')), '') AS caller_id
),
root_group AS (
SELECT
g.id,
g.name,
g."oldId",
g."privateGroup"
FROM groups."Group" AS g
CROSS JOIN params AS p
WHERE LOWER(g.name) = p.group_key
OR LOWER(g.id) = p.group_key
OR LOWER(COALESCE(g."oldId", '')) = p.group_key
ORDER BY (LOWER(g.name) = p.group_key) DESC, g."createdAt" ASC
LIMIT 1
),
group_tree AS (
SELECT rg.id
FROM root_group AS rg
UNION
SELECT gm."memberId"
FROM groups."GroupMember" AS gm
JOIN group_tree AS gt
ON gt.id = gm."groupId"
WHERE LOWER(gm."membershipType") = 'group'
)
SELECT
rg.id AS "groupId",
rg.name AS "groupName",
rg."oldId" AS "groupOldId",
rg."privateGroup" AS "privateGroup",
EXISTS (
SELECT 1
FROM groups."GroupMember" AS gm
JOIN group_tree AS gt
ON gt.id = gm."groupId"
CROSS JOIN params AS p
WHERE LOWER(gm."membershipType") = 'user'
AND p.caller_id IS NOT NULL
AND gm."memberId" = p.caller_id
) AS "callerIsMember"
FROM root_group AS rg;
Loading
Loading