Remove RHS cache of child groups ids
closes OUT-4774 flag=improved_outcomes_management Test plan: - As this PS doesn't add feature, but remove a cache, Assert the RHS works properly in all scenarios. You may take screen shots of the results in master and compare with this PS. * In the management screen * Selecting a group in LHS * Search for a group in RHS * Infinite scroll works properly * In Find Outcomes Modal * Assert the same as previous one * Repeat test for account and course Change-Id: I073ebbf02ea7c2f75342a72ad700f1ef10a67dcc Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/273513 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Martin Yosifov <martin.yosifov@instructure.com> Reviewed-by: Pat Renner <prenner@instructure.com> Reviewed-by: Marcus Pompeu <marcus.pompeu@instructure.com> QA-Review: Brian Watson <bwatson@instructure.com> Product-Review: Pat Renner <prenner@instructure.com>
This commit is contained in:
parent
283ec7846e
commit
fb67a476f8
|
@ -34,8 +34,6 @@ class LearningOutcomeGroup < ActiveRecord::Base
|
||||||
belongs_to :context, polymorphic: [:account, :course]
|
belongs_to :context, polymorphic: [:account, :course]
|
||||||
|
|
||||||
before_save :infer_defaults
|
before_save :infer_defaults
|
||||||
after_create :clear_descendants_cache
|
|
||||||
after_update :clear_descendants_cache, if: -> { clear_descendants_cache? }
|
|
||||||
resolves_root_account through: -> (group) { group.context_id ? group.context.resolved_root_account_id : 0 }
|
resolves_root_account through: -> (group) { group.context_id ? group.context.resolved_root_account_id : 0 }
|
||||||
validates :vendor_guid, length: { maximum: maximum_string_length, allow_nil: true }
|
validates :vendor_guid, length: { maximum: maximum_string_length, allow_nil: true }
|
||||||
validates_length_of :description, :maximum => maximum_text_length, :allow_nil => true, :allow_blank => true
|
validates_length_of :description, :maximum => maximum_text_length, :allow_nil => true, :allow_blank => true
|
||||||
|
@ -288,14 +286,6 @@ class LearningOutcomeGroup < ActiveRecord::Base
|
||||||
ancestor_ids.member?(id)
|
ancestor_ids.member?(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_descendants_cache
|
|
||||||
Outcomes::LearningOutcomeGroupChildren.new(context).clear_descendants_cache
|
|
||||||
end
|
|
||||||
|
|
||||||
def clear_descendants_cache?
|
|
||||||
(previous_changes.keys & %w[learning_outcome_group_id workflow_state]).any?
|
|
||||||
end
|
|
||||||
|
|
||||||
private_class_method def self.title_order_by_clause(table = nil)
|
private_class_method def self.title_order_by_clause(table = nil)
|
||||||
col = table ? "#{table}.title" : "title"
|
col = table ? "#{table}.title" : "title"
|
||||||
best_unicode_collation_key(col)
|
best_unicode_collation_key(col)
|
||||||
|
|
|
@ -73,7 +73,7 @@ module Outcomes
|
||||||
end
|
end
|
||||||
|
|
||||||
def suboutcomes_by_group_id(learning_outcome_group_id, args={})
|
def suboutcomes_by_group_id(learning_outcome_group_id, args={})
|
||||||
learning_outcome_groups_ids = children_ids(learning_outcome_group_id) << learning_outcome_group_id
|
learning_outcome_groups_ids = children_ids_with_self(learning_outcome_group_id)
|
||||||
relation = ContentTag.active.learning_outcome_links
|
relation = ContentTag.active.learning_outcome_links
|
||||||
.where(associated_asset_id: learning_outcome_groups_ids)
|
.where(associated_asset_id: learning_outcome_groups_ids)
|
||||||
.joins(:learning_outcome_content)
|
.joins(:learning_outcome_content)
|
||||||
|
@ -91,13 +91,6 @@ module Outcomes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_descendants_cache
|
|
||||||
return unless improved_outcomes_management?
|
|
||||||
|
|
||||||
Rails.cache.delete(descendants_cache_key)
|
|
||||||
clear_total_outcomes_cache
|
|
||||||
end
|
|
||||||
|
|
||||||
def clear_total_outcomes_cache
|
def clear_total_outcomes_cache
|
||||||
Rails.cache.delete(context_timestamp_cache_key) if improved_outcomes_management?
|
Rails.cache.delete(context_timestamp_cache_key) if improved_outcomes_management?
|
||||||
end
|
end
|
||||||
|
@ -112,7 +105,7 @@ module Outcomes
|
||||||
private
|
private
|
||||||
|
|
||||||
def total_outcomes_for(learning_outcome_group_id, args={})
|
def total_outcomes_for(learning_outcome_group_id, args={})
|
||||||
learning_outcome_groups_ids = children_ids(learning_outcome_group_id) << learning_outcome_group_id
|
learning_outcome_groups_ids = children_ids_with_self(learning_outcome_group_id)
|
||||||
|
|
||||||
relation = ContentTag.active.learning_outcome_links
|
relation = ContentTag.active.learning_outcome_links
|
||||||
.where(associated_asset_id: learning_outcome_groups_ids)
|
.where(associated_asset_id: learning_outcome_groups_ids)
|
||||||
|
@ -162,34 +155,21 @@ module Outcomes
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def children_ids(learning_outcome_group_id)
|
def children_ids_with_self(learning_outcome_group_id)
|
||||||
parent = data.find { |d| d['parent_id'] == learning_outcome_group_id }
|
sql = <<-SQL.squish
|
||||||
parent&.dig('descendant_ids')&.tr('{}', '')&.split(',') || []
|
|
||||||
end
|
|
||||||
|
|
||||||
def data
|
|
||||||
if improved_outcomes_management?
|
|
||||||
Rails.cache.fetch(descendants_cache_key) do
|
|
||||||
LearningOutcomeGroup.connection.execute(learning_outcome_group_descendants_query).as_json
|
|
||||||
end
|
|
||||||
else
|
|
||||||
LearningOutcomeGroup.connection.execute(learning_outcome_group_descendants_query).as_json
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def learning_outcome_group_descendants_query
|
|
||||||
<<-SQL.squish
|
|
||||||
WITH RECURSIVE levels AS (
|
WITH RECURSIVE levels AS (
|
||||||
SELECT id, learning_outcome_group_id AS parent_id
|
SELECT id, id AS parent_id
|
||||||
FROM (#{LearningOutcomeGroup.active.where(context: context).to_sql}) AS data
|
FROM (#{LearningOutcomeGroup.active.where(id: learning_outcome_group_id).to_sql}) AS data
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT child.id AS id, parent.parent_id AS parent_id
|
SELECT child.id AS id, parent.parent_id AS parent_id
|
||||||
FROM #{LearningOutcomeGroup.quoted_table_name} child
|
FROM #{LearningOutcomeGroup.quoted_table_name} child
|
||||||
INNER JOIN levels parent ON parent.id = child.learning_outcome_group_id
|
INNER JOIN levels parent ON parent.id = child.learning_outcome_group_id
|
||||||
WHERE child.workflow_state <> 'deleted'
|
WHERE child.workflow_state <> 'deleted'
|
||||||
)
|
)
|
||||||
SELECT parent_id, array_agg(id) AS descendant_ids FROM levels WHERE parent_id IS NOT NULL GROUP BY parent_id
|
SELECT id FROM levels
|
||||||
SQL
|
SQL
|
||||||
|
|
||||||
|
LearningOutcomeGroup.connection.execute(sql).as_json.map {|r| r["id"]}
|
||||||
end
|
end
|
||||||
|
|
||||||
def context_timestamp_cache
|
def context_timestamp_cache
|
||||||
|
@ -198,10 +178,6 @@ module Outcomes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def descendants_cache_key
|
|
||||||
['learning_outcome_group_descendants', context_asset_string].cache_key
|
|
||||||
end
|
|
||||||
|
|
||||||
def total_outcomes_cache_key(learning_outcome_group_id = nil)
|
def total_outcomes_cache_key(learning_outcome_group_id = nil)
|
||||||
['learning_outcome_group_total_outcomes',
|
['learning_outcome_group_total_outcomes',
|
||||||
context_asset_string,
|
context_asset_string,
|
||||||
|
|
|
@ -417,21 +417,6 @@ describe Outcomes::LearningOutcomeGroupChildren do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#clear_descendants_cache' do
|
|
||||||
it 'clears the cache' do
|
|
||||||
enable_cache do
|
|
||||||
expect(LearningOutcomeGroup.connection).to receive(:execute).and_call_original.twice
|
|
||||||
expect(ContentTag).to receive(:active).and_call_original.exactly(4).times
|
|
||||||
expect(subject.total_outcomes(g0.id)).to eq 12
|
|
||||||
expect(subject.total_outcomes(g1.id)).to eq 9
|
|
||||||
subject.clear_descendants_cache
|
|
||||||
instance = described_class.new(context)
|
|
||||||
expect(instance.total_outcomes(g0.id)).to eq 12
|
|
||||||
expect(instance.total_outcomes(g1.id)).to eq 9
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#clear_total_outcomes_cache' do
|
describe '#clear_total_outcomes_cache' do
|
||||||
it 'clears the cache' do
|
it 'clears the cache' do
|
||||||
enable_cache do
|
enable_cache do
|
||||||
|
|
Loading…
Reference in New Issue