Skip to content

Commit b9c3b5f

Browse files
authored
Merge pull request #143 from topcoder-platform/performance
Further performance update for my-reviews
2 parents 14ea642 + cab9f46 commit b9c3b5f

File tree

1 file changed

+109
-46
lines changed

1 file changed

+109
-46
lines changed

src/api/my-review/myReview.service.ts

Lines changed: 109 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,47 @@ export class MyReviewService {
181181
)
182182
`,
183183
);
184+
cteFragments.push(
185+
Prisma.sql`
186+
review_totals AS (
187+
SELECT
188+
rv."resourceId",
189+
COUNT(*)::bigint AS "totalReviews",
190+
COALESCE(
191+
SUM(CASE WHEN rv.status = 'COMPLETED' THEN 1 ELSE 0 END),
192+
0
193+
)::bigint AS "completedReviews"
194+
FROM reviews.review rv
195+
WHERE rv."resourceId" IN (
196+
SELECT mr.id FROM member_resources mr
197+
)
198+
GROUP BY rv."resourceId"
199+
)
200+
`,
201+
);
202+
cteFragments.push(
203+
Prisma.sql`
204+
incomplete_reviews AS (
205+
SELECT DISTINCT ON (rv."resourceId")
206+
rv."resourceId",
207+
TRUE AS "hasIncompleteReviews",
208+
cp_incomplete.name AS "incompletePhaseName"
209+
FROM reviews.review rv
210+
JOIN challenges."ChallengePhase" cp_incomplete
211+
ON cp_incomplete.id = rv."phaseId"
212+
WHERE rv."resourceId" IN (
213+
SELECT mr.id FROM member_resources mr
214+
)
215+
AND (rv.status IS NULL OR rv.status <> 'COMPLETED')
216+
ORDER BY
217+
rv."resourceId",
218+
CASE WHEN cp_incomplete."isOpen" IS TRUE THEN 0 ELSE 1 END,
219+
cp_incomplete."scheduledEndDate" NULLS LAST,
220+
cp_incomplete."actualEndDate" NULLS LAST,
221+
cp_incomplete.name ASC
222+
)
223+
`,
224+
);
184225
cteFragments.push(
185226
Prisma.sql`
186227
appeals_phase AS (
@@ -252,7 +293,9 @@ export class MyReviewService {
252293
`,
253294
);
254295

255-
const metricJoins: Prisma.Sql[] = [
296+
const metricJoins: Prisma.Sql[] = [];
297+
298+
metricJoins.push(
256299
Prisma.sql`
257300
LEFT JOIN LATERAL (
258301
SELECT
@@ -268,18 +311,28 @@ export class MyReviewService {
268311
LIMIT 1
269312
) cp ON TRUE
270313
`,
271-
Prisma.sql`
272-
LEFT JOIN LATERAL (
273-
SELECT
274-
COUNT(*)::bigint AS "totalReviews",
275-
COALESCE(
276-
SUM(CASE WHEN rv.status = 'COMPLETED' THEN 1 ELSE 0 END),
277-
0
278-
)::bigint AS "completedReviews"
279-
FROM reviews.review rv
280-
WHERE rv."resourceId" = r.id
281-
) rp ON r.id IS NOT NULL
282-
`,
314+
);
315+
316+
const reviewTotalsJoin = adminUser
317+
? Prisma.sql`
318+
LEFT JOIN LATERAL (
319+
SELECT
320+
COUNT(*)::bigint AS "totalReviews",
321+
COALESCE(
322+
SUM(CASE WHEN rv.status = 'COMPLETED' THEN 1 ELSE 0 END),
323+
0
324+
)::bigint AS "completedReviews"
325+
FROM reviews.review rv
326+
WHERE rv."resourceId" = r.id
327+
) review_totals ON r.id IS NOT NULL
328+
`
329+
: Prisma.sql`
330+
LEFT JOIN review_totals
331+
ON review_totals."resourceId" = r.id
332+
`;
333+
metricJoins.push(reviewTotalsJoin);
334+
335+
metricJoins.push(
283336
Prisma.sql`
284337
LEFT JOIN LATERAL (
285338
SELECT
@@ -296,36 +349,46 @@ export class MyReviewService {
296349
WHERE w."challengeId" = c.id
297350
) cw ON TRUE
298351
`,
299-
Prisma.sql`
300-
LEFT JOIN LATERAL (
301-
SELECT
302-
EXISTS (
303-
SELECT 1
304-
FROM reviews.review rv_incomplete
305-
WHERE rv_incomplete."resourceId" = r.id
306-
AND (rv_incomplete.status IS NULL OR rv_incomplete.status <> 'COMPLETED')
307-
) AS "hasIncompleteReviews",
308-
(
309-
SELECT cp_incomplete.name
310-
FROM reviews.review rv_incomplete2
311-
JOIN challenges."ChallengePhase" cp_incomplete
312-
ON cp_incomplete.id = rv_incomplete2."phaseId"
313-
WHERE rv_incomplete2."resourceId" = r.id
314-
AND (rv_incomplete2.status IS NULL OR rv_incomplete2.status <> 'COMPLETED')
315-
ORDER BY
316-
CASE WHEN cp_incomplete."isOpen" IS TRUE THEN 0 ELSE 1 END,
317-
cp_incomplete."scheduledEndDate" NULLS LAST,
318-
cp_incomplete."actualEndDate" NULLS LAST,
319-
cp_incomplete.name ASC
320-
LIMIT 1
321-
) AS "incompletePhaseName"
322-
) deliverable_reviews ON r.id IS NOT NULL
323-
`,
352+
);
353+
354+
const incompleteReviewsJoin = adminUser
355+
? Prisma.sql`
356+
LEFT JOIN LATERAL (
357+
SELECT
358+
EXISTS (
359+
SELECT 1
360+
FROM reviews.review rv_incomplete
361+
WHERE rv_incomplete."resourceId" = r.id
362+
AND (rv_incomplete.status IS NULL OR rv_incomplete.status <> 'COMPLETED')
363+
) AS "hasIncompleteReviews",
364+
(
365+
SELECT cp_incomplete.name
366+
FROM reviews.review rv_incomplete2
367+
JOIN challenges."ChallengePhase" cp_incomplete
368+
ON cp_incomplete.id = rv_incomplete2."phaseId"
369+
WHERE rv_incomplete2."resourceId" = r.id
370+
AND (rv_incomplete2.status IS NULL OR rv_incomplete2.status <> 'COMPLETED')
371+
ORDER BY
372+
CASE WHEN cp_incomplete."isOpen" IS TRUE THEN 0 ELSE 1 END,
373+
cp_incomplete."scheduledEndDate" NULLS LAST,
374+
cp_incomplete."actualEndDate" NULLS LAST,
375+
cp_incomplete.name ASC
376+
LIMIT 1
377+
) AS "incompletePhaseName"
378+
) deliverable_reviews ON r.id IS NOT NULL
379+
`
380+
: Prisma.sql`
381+
LEFT JOIN incomplete_reviews deliverable_reviews
382+
ON deliverable_reviews."resourceId" = r.id
383+
`;
384+
metricJoins.push(incompleteReviewsJoin);
385+
386+
metricJoins.push(
324387
Prisma.sql`
325388
LEFT JOIN reviews.review_pending_summary pending_appeals
326389
ON pending_appeals."resourceId" = r.id
327390
`,
328-
];
391+
);
329392

330393
if (!adminUser) {
331394
metricJoins.push(
@@ -374,9 +437,6 @@ export class MyReviewService {
374437
);
375438
const countJoinClause = joinSqlFragments(countJoins, Prisma.sql``);
376439

377-
const rowWhereFragments = [...whereFragments, ...rowExtras];
378-
const countWhereFragments = [...whereFragments, ...countExtras];
379-
380440
if (challengeTypeId) {
381441
whereFragments.push(Prisma.sql`c."typeId" = ${challengeTypeId}`);
382442
}
@@ -397,6 +457,9 @@ export class MyReviewService {
397457
);
398458
}
399459

460+
const rowWhereFragments = [...whereFragments, ...rowExtras];
461+
const countWhereFragments = [...whereFragments, ...countExtras];
462+
400463
const rowWhereClause = joinSqlFragments(
401464
rowWhereFragments,
402465
Prisma.sql` AND `,
@@ -425,12 +488,12 @@ export class MyReviewService {
425488
'topgear iterative review'
426489
) THEN NULL
427490
ELSE CASE
428-
WHEN rp."totalReviews" IS NULL OR rp."totalReviews" = 0 THEN 0
491+
WHEN review_totals."totalReviews" IS NULL OR review_totals."totalReviews" = 0 THEN 0
429492
ELSE LEAST(
430493
1,
431494
GREATEST(
432495
0,
433-
rp."completedReviews"::numeric / rp."totalReviews"::numeric
496+
review_totals."completedReviews"::numeric / review_totals."totalReviews"::numeric
434497
)
435498
)
436499
END
@@ -529,8 +592,8 @@ export class MyReviewService {
529592
cp."actualEndDate" AS "currentPhaseActualEnd",
530593
rr.name AS "resourceRoleName",
531594
c."endDate" AS "challengeEndDate",
532-
rp."totalReviews" AS "totalReviews",
533-
rp."completedReviews" AS "completedReviews",
595+
review_totals."totalReviews" AS "totalReviews",
596+
review_totals."completedReviews" AS "completedReviews",
534597
cw.winners AS "winners",
535598
deliverable_reviews."hasIncompleteReviews" AS "hasIncompleteReviews",
536599
deliverable_reviews."incompletePhaseName" AS "incompletePhaseName",

0 commit comments

Comments
 (0)