Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-10-13 23:53:05 +0300
committerDouwe Maan <douwe@gitlab.com>2015-10-13 23:53:05 +0300
commit93fcddd7a7ce4ed259794a4511ae04035ae33be2 (patch)
treee866959ff93d0e473e993b4bd727f92aad0fac7c /lib/gitlab/markdown
parent251e13666d04a1c8427401962e3e171e569d9088 (diff)
Allow ReferenceExtractor to efficiently load references from multiple texts at once
Diffstat (limited to 'lib/gitlab/markdown')
-rw-r--r--lib/gitlab/markdown/reference_filter.rb9
-rw-r--r--lib/gitlab/markdown/reference_gatherer_filter.rb9
2 files changed, 11 insertions, 7 deletions
diff --git a/lib/gitlab/markdown/reference_filter.rb b/lib/gitlab/markdown/reference_filter.rb
index 0ae0d93f70d..ede9f8865ff 100644
--- a/lib/gitlab/markdown/reference_filter.rb
+++ b/lib/gitlab/markdown/reference_filter.rb
@@ -12,7 +12,14 @@ module Gitlab
# :project (required) - Current project, ignored if reference is cross-project.
# :only_path - Generate path-only links.
class ReferenceFilter < HTML::Pipeline::Filter
- LazyReference = Struct.new(:klass, :ids)
+ LazyReference = Struct.new(:klass, :ids) do
+ def self.load(refs)
+ refs.group_by(&:klass).flat_map do |klass, refs|
+ ids = refs.flat_map(&:ids)
+ klass.where(id: ids)
+ end
+ end
+ end
def self.user_can_reference?(user, node, context)
if node.has_attribute?('data-project')
diff --git a/lib/gitlab/markdown/reference_gatherer_filter.rb b/lib/gitlab/markdown/reference_gatherer_filter.rb
index cf9a2303db8..18df5db94d6 100644
--- a/lib/gitlab/markdown/reference_gatherer_filter.rb
+++ b/lib/gitlab/markdown/reference_gatherer_filter.rb
@@ -21,7 +21,7 @@ module Gitlab
gather_references(node)
end
- load_lazy_references
+ load_lazy_references unless context[:load_lazy_references] == false
doc
end
@@ -56,11 +56,8 @@ module Gitlab
# Will load all references of one type using one query.
def load_lazy_references
result[:lazy_references].each do |type, refs|
- refs.group_by(&:klass).each do |klass, refs|
- ids = refs.map(&:ids).flatten
- values = klass.find(ids)
- result[:references][type].push(*values)
- end
+ values = ReferenceFilter::LazyReference.load(refs)
+ result[:references][type].concat(values)
end
end