diff --git a/Changelog.md b/Changelog.md index 7d9de8e1b2..8b00dac2da 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,7 @@ - Ensures row selection for peer reviewer unassigning has the same validation checks as individual selections (#7274) - Ensures mark levels on a rubric criterion are properly scaled when its max mark is updated (#7311) - Refactor contributors list in About section to read from markus-contributors.txt (#7374) +- Optimized the querying of submissions when assigning graders (#7381) ### 🔧 Internal changes diff --git a/app/controllers/graders_controller.rb b/app/controllers/graders_controller.rb index b23116c1df..2080faabce 100644 --- a/app/controllers/graders_controller.rb +++ b/app/controllers/graders_controller.rb @@ -253,10 +253,8 @@ def unassign_graders(grouping_ids, grader_ids) # Returns array of grouping ids with non empty submissions def filter_empty_submissions(grouping_ids) - grouping_ids.select do |grouping_id| - submission = Submission.find_by(grouping_id: grouping_id, submission_version_used: true) - submission && !submission.is_empty - end + Submission.where(grouping_id: grouping_ids, is_empty: false, submission_version_used: true) + .pluck(:grouping_id) end def filter_grouping_by_section(section_assignments, assignment) diff --git a/spec/controllers/graders_controller_spec.rb b/spec/controllers/graders_controller_spec.rb index 1075ce7151..4557ae2760 100644 --- a/spec/controllers/graders_controller_spec.rb +++ b/spec/controllers/graders_controller_spec.rb @@ -561,6 +561,7 @@ @grouping1 = create(:grouping, assignment: @assignment) @grouping2 = create(:grouping, assignment: @assignment) @grouping3 = create(:grouping, assignment: @assignment) + @grouping4 = create(:grouping, assignment: @assignment) @ta1 = create(:ta) @ta2 = create(:ta) @ta3 = create(:ta) @@ -762,6 +763,38 @@ end end end + + context 'and when assigning to multiple groupings and skip_empty_submissions is true' do + before do + # defining submissions for use in the 'asisgn' post + submission + submission2 + submission3 + submission4 + post_as @instructor, + :global_actions, + params: { course_id: course.id, assignment_id: @assignment.id, global_actions: 'assign', + groupings: [@grouping1.id, @grouping2.id, @grouping3.id, @grouping4.id], + graders: [@ta1.id], current_table: 'groups_table', skip_empty_submissions: 'true' } + end + + context 'and some groups have empty submissions while some do not' do + let(:submission) { create(:version_used_submission, grouping: @grouping1, is_empty: true) } + let(:submission2) { create(:version_used_submission, grouping: @grouping2, is_empty: false) } + let(:submission3) { create(:version_used_submission, grouping: @grouping3, is_empty: true) } + let(:submission4) { create(:version_used_submission, grouping: @grouping4, is_empty: false) } + + it 'should not assign graders to groups with empty submissions' do + expect(@grouping1.tas).to be_empty + expect(@grouping3.tas).to be_empty + end + + it 'should assign graders to groups with non-empty submissions' do + expect(@grouping2.tas).to include(@ta1) + expect(@grouping4.tas).to include(@ta1) + end + end + end end context 'POST on :global_actions on assign_sections' do