diff options
| author | Douwe Maan <douwe@gitlab.com> | 2016-07-12 00:29:12 +0000 |
|---|---|---|
| committer | Douwe Maan <douwe@gitlab.com> | 2016-07-12 00:29:12 +0000 |
| commit | 774ff17804c879c3445c350de510204676330be9 (patch) | |
| tree | f05fe6b3f1a73cc4eb4010653301307dc141e1c0 /lib/banzai | |
| parent | 8ef930c41a4c5ccb8b99a62a663c594fa0f0a726 (diff) | |
| parent | af3727b34a3e61668ffca8dc4db85e3c57ff2cc8 (diff) | |
| download | gitlab-ce-774ff17804c879c3445c350de510204676330be9.tar.gz | |
Merge branch 'optimize-cross-ref-system-notes-check' into 'master'
Optimize cross ref system notes check
## What does this MR do?
This MR optimizes system note visibility checking by memoizing the visible reference count, reducing the overhead of calling `Note#cross_reference_not_visible_for?`.
## Are there points in the code the reviewer needs to double check?
Note that since a cross reference message contains, "Mentioned in XYZ", we EXPECT that there is at least one reference. That's why using the ref count > 0 works.
## Why was this MR needed?
The previous implementation relied on `Note#cross_reference_not_visible_for?`, which essentially tries to render all the Markdown references in a system note
and only displays the note if the user can see the referring project. But this duplicated the work that Banzai::NotesRenderer was doing already. This shaves about 0.8 s
from the load time from https://gitlab.com/gitlab-com/operations/issues/42.
## What are the relevant issue numbers?
#19273
## Screenshots (if relevant)
## Does this MR meet the acceptance criteria?
- [x] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added
- [ ] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)
- [ ] API support added
- Tests
- [x] Added for this feature/bug
- [x] All builds are passing
- [x] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [x] Branch has no merge conflicts with `master` (if you do - rebase it please)
- [x] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)
See merge request !5070
Diffstat (limited to 'lib/banzai')
| -rw-r--r-- | lib/banzai/object_renderer.rb | 10 | ||||
| -rw-r--r-- | lib/banzai/redactor.rb | 37 |
2 files changed, 29 insertions, 18 deletions
diff --git a/lib/banzai/object_renderer.rb b/lib/banzai/object_renderer.rb index f0e4f28bf12..dc83b87a6c1 100644 --- a/lib/banzai/object_renderer.rb +++ b/lib/banzai/object_renderer.rb @@ -31,10 +31,10 @@ module Banzai redacted = redact_documents(documents) objects.each_with_index do |object, index| - object.__send__("#{attribute}_html=", redacted.fetch(index)) + redacted_data = redacted[index] + object.__send__("#{attribute}_html=", redacted_data[:document].to_html.html_safe) + object.user_visible_reference_count = redacted_data[:visible_reference_count] end - - objects end # Renders the attribute of every given object. @@ -50,9 +50,7 @@ module Banzai def redact_documents(documents) redactor = Redactor.new(project, user) - redactor.redact(documents).map do |document| - document.to_html.html_safe - end + redactor.redact(documents) end # Returns a Banzai context for the given object and attribute. diff --git a/lib/banzai/redactor.rb b/lib/banzai/redactor.rb index ffd267d5e9a..0df3a72d1c4 100644 --- a/lib/banzai/redactor.rb +++ b/lib/banzai/redactor.rb @@ -19,29 +19,36 @@ module Banzai # # Returns the documents passed as the first argument. def redact(documents) - nodes = documents.flat_map do |document| - Querying.css(document, 'a.gfm[data-reference-type]') - end - - redact_nodes(nodes) + all_document_nodes = document_nodes(documents) - documents + redact_document_nodes(all_document_nodes) end - # Redacts the given nodes + # Redacts the given node documents # - # nodes - An Array of HTML nodes to redact. - def redact_nodes(nodes) - visible = nodes_visible_to_user(nodes) + # data - An Array of a Hashes mapping an HTML document to nodes to redact. + def redact_document_nodes(all_document_nodes) + all_nodes = all_document_nodes.map { |x| x[:nodes] }.flatten + visible = nodes_visible_to_user(all_nodes) + metadata = [] - nodes.each do |node| - unless visible.include?(node) + all_document_nodes.each do |entry| + nodes_for_document = entry[:nodes] + doc_data = { document: entry[:document], visible_reference_count: nodes_for_document.count } + metadata << doc_data + + nodes_for_document.each do |node| + next if visible.include?(node) + + doc_data[:visible_reference_count] -= 1 # The reference should be replaced by the original text, # which is not always the same as the rendered text. text = node.attr('data-original') || node.text node.replace(text) end end + + metadata end # Returns the nodes visible to the current user. @@ -65,5 +72,11 @@ module Banzai visible end + + def document_nodes(documents) + documents.map do |document| + { document: document, nodes: Querying.css(document, 'a.gfm[data-reference-type]') } + end + end end end |
