Skip to content

Commit 66fa28f

Browse files
author
Michael Nomitch
committed
outcomes speed improvements
refs CNVS-12716 test plan: - make course with many assessed outcomes - load the mastery gradebook - it should load relatively fast Change-Id: I81a91d58d37e5ae3d5399d59f6e3626af53496ea Reviewed-on: https://gerrit.instructure.com/53493 Reviewed-by: Simon Williams <simon@instructure.com> QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com> Tested-by: Jenkins Product-Review: Hilary Scharton <hilary@instructure.com>
1 parent 08886f6 commit 66fa28f

5 files changed

Lines changed: 32 additions & 3 deletions

File tree

app/models/learning_outcome.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,11 @@ def destroy
295295
end
296296

297297
def assessed?
298-
learning_outcome_results.exists?
298+
if learning_outcome_results.loaded?
299+
learning_outcome_results.any?
300+
else
301+
learning_outcome_results.exists?
302+
end
299303
end
300304

301305
def tie_to(context)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class AddLearningOutcomeIndexToOutcomeResults < ActiveRecord::Migration
2+
tag :postdeploy
3+
disable_ddl_transaction!
4+
5+
def up
6+
add_index :learning_outcome_results, :learning_outcome_id, algorithm: :concurrently, where: "learning_outcome_id IS NOT NULL"
7+
end
8+
9+
def down
10+
remove_index :learning_outcome_results, :learning_outcome_id
11+
end
12+
end

lib/api/v1/outcome_results.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ def outcome_results_rollups_json(rollups)
6060
#
6161
# Returns a Hash containing serialized outcomes.
6262
def outcome_results_include_outcomes_json(outcomes)
63+
ActiveRecord::Associations::Preloader.new(outcomes, [:context, :alignments]).run
64+
assessed_outcomes = LearningOutcomeResult.uniq
65+
.where(learning_outcome_id: outcomes.map(&:id))
66+
.pluck(:learning_outcome_id)
6367
outcomes.map do |o|
64-
hash = outcome_json(o, @current_user, session)
68+
hash = outcome_json(o, @current_user, session, assessed_outcomes: assessed_outcomes)
6569
hash.merge!(alignments: o.alignments.map(&:content_asset_string))
6670
Api.recursively_stringify_json_ids(hash)
6771
end

lib/outcomes/result_analytics.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def order_results_for_rollup(relation)
6262
#
6363
# Returns an Array of Rollup objects.
6464
def outcome_results_rollups(results, users=[])
65+
ActiveRecord::Associations::Preloader.new(results, :learning_outcome).run
6566
rollups = results.chunk(&:user_id).map do |_, user_results|
6667
Rollup.new(user_results.first.user, rollup_user_results(user_results))
6768
end
@@ -82,7 +83,9 @@ def aggregate_outcome_results_rollup(results, context)
8283
aggregate_results = outcome_results.map do |scores|
8384
scores.map{|score| Result.new(score.outcome, score.score, score.count)}
8485
end
85-
aggregate_rollups = aggregate_results.map{|result| RollupScore.new(result,{aggregate_score: true})}
86+
aggregate_rollups = aggregate_results.map do |result|
87+
RollupScore.new(result,{aggregate_score: true})
88+
end
8689
Rollup.new(context, aggregate_rollups)
8790
end
8891

spec/lib/outcomes/result_analytics_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ def user_id
167167
end
168168

169169
describe '#outcome_results_rollups' do
170+
before do
171+
ActiveRecord::Associations::Preloader.any_instance.stubs(:run)
172+
end
170173
it 'returns a rollup for each distinct user_id' do
171174
results = [
172175
MockOutcomeResult[MockUser[10, 'a'], MockOutcome[80], 4.0],
@@ -183,6 +186,9 @@ def user_id
183186
end
184187

185188
describe '#aggregate_outcome_results_rollup' do
189+
before do
190+
ActiveRecord::Associations::Preloader.any_instance.stubs(:run)
191+
end
186192
it 'returns one rollup with the rollup averages' do
187193
fake_context = MockUser.new(42, 'fake')
188194
results = [

0 commit comments

Comments
 (0)