Skip to content

pkp/pkp-lib#11252 Calculate latest round withing latest stage #11316

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: stable-3_5_0
Choose a base branch
from
Open
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
27 changes: 21 additions & 6 deletions classes/submission/reviewAssignment/Collector.php
Original file line number Diff line number Diff line change
Expand Up @@ -452,14 +452,29 @@ public function getQueryBuilder(): Builder
fn (Builder $q) => $q
// Aggregate the latest review round number for the given assignment and reviewer
->leftJoinSub(
DB::table('review_assignments as ramax')
->select(['ramax.submission_id', 'ramax.reviewer_id'])
->selectRaw('MAX(ramax.round) as latest_round')
->selectRaw('MAX(ramax.stage_id) as latest_stage')
->whereIn('ramax.reviewer_id', $this->reviewerIds)
->groupBy(['ramax.submission_id', 'ramax.reviewer_id']),
DB::table(
DB::table('review_assignments')
->select([
'ramax_stage_inner.reviewer_id',
'ramax_stage_inner.submission_id',
])
->selectRaw('MAX(ramax_stage_inner.stage_id) as latest_stage')
->from('review_assignments as ramax_stage_inner')
->whereIn('ramax_stage_inner.reviewer_id', $this->reviewerIds)
->groupBy('ramax_stage_inner.submission_id', 'ramax_stage_inner.reviewer_id'),
'ramax_stage'
)
->select(['ramax_stage.submission_id', 'ramax_stage.reviewer_id', 'ramax_stage.latest_stage'])
->selectRaw('MAX(ramax_round.round) as latest_round')
->join('review_assignments as ramax_round', function ($join) {
$join->on('ramax_stage.submission_id', '=', 'ramax_round.submission_id')
->on('ramax_stage.reviewer_id', '=', 'ramax_round.reviewer_id')
->on('ramax_stage.latest_stage', '=', 'ramax_round.stage_id');
})
->groupBy(['ramax_stage.submission_id', 'ramax_stage.latest_stage', 'ramax_stage.reviewer_id']),
Copy link
Contributor Author

@jardakotesovec jardakotesovec Apr 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is the query for argmax.. as it might be easier to read:

LEFT JOIN (
    SELECT ramax_stage.submission_id,
           ramax_stage.reviewer_id,
           ramax_stage.latest_stage,
           MAX(ramax_round.round) AS latest_round
    FROM (
        SELECT ramax_stage_inner.reviewer_id,
               ramax_stage_inner.submission_id,
               MAX(ramax_stage_inner.stage_id) AS latest_stage
        FROM review_assignments AS ramax_stage_inner
        WHERE ramax_stage_inner.reviewer_id IN (9)
        GROUP BY ramax_stage_inner.submission_id,
                 ramax_stage_inner.reviewer_id
    ) AS ramax_stage
    INNER JOIN review_assignments AS ramax_round
        ON ramax_stage.submission_id = ramax_round.submission_id
        AND ramax_stage.reviewer_id = ramax_round.reviewer_id
        AND ramax_stage.latest_stage = ramax_round.stage_id
    GROUP BY ramax_stage.submission_id,
             ramax_stage.latest_stage,
             ramax_stage.reviewer_id
) AS agrmax

'agrmax',
fn (JoinClause $join) => $join->on('ra.submission_id', '=', 'agrmax.submission_id')
->on('ra.reviewer_id', '=', 'agrmax.reviewer_id')
)
->whereColumn('ra.round', 'agrmax.latest_round') // assignments from the last review round per reviewer only
->whereColumn('ra.stage_id', 'agrmax.latest_stage') // assignments for the current review stage only (for OMP)
Expand Down