@@ -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