Faster snippet search
This commit is contained in:
parent
569c467203
commit
94af78ac4a
4 changed files with 30 additions and 29 deletions
|
@ -34,6 +34,7 @@ v 8.5.0 (unreleased)
|
|||
- Add sort dropdown to dashboard projects page
|
||||
- Hide remove source branch button when the MR is merged but new commits are pushed (Zeger-Jan van de Weg)
|
||||
- In seach autocomplete show only groups and projects you are member of
|
||||
- Faster snippet search
|
||||
|
||||
v 8.4.3
|
||||
- Increase lfs_objects size column to 8-byte integer to allow files larger
|
||||
|
|
|
@ -33,7 +33,7 @@ module SnippetsHelper
|
|||
# surrounding code.
|
||||
#
|
||||
# @returns Array, unique and sorted.
|
||||
def matching_lines(lined_content, surrounding_lines)
|
||||
def matching_lines(lined_content, surrounding_lines, query)
|
||||
used_lines = []
|
||||
lined_content.each_with_index do |line, line_number|
|
||||
used_lines.concat bounded_line_numbers(
|
||||
|
@ -51,9 +51,9 @@ module SnippetsHelper
|
|||
# surrounding_lines() worth of unmatching lines.
|
||||
#
|
||||
# @returns a hash with {snippet_object, snippet_chunks:{data,start_line}}
|
||||
def chunk_snippet(snippet, surrounding_lines = 3)
|
||||
def chunk_snippet(snippet, query, surrounding_lines = 3)
|
||||
lined_content = snippet.content.split("\n")
|
||||
used_lines = matching_lines(lined_content, surrounding_lines)
|
||||
used_lines = matching_lines(lined_content, surrounding_lines, query)
|
||||
|
||||
snippet_chunk = []
|
||||
snippet_chunks = []
|
||||
|
|
|
@ -1,46 +1,50 @@
|
|||
- snippet_blob = chunk_snippet(snippet_blob, @search_term)
|
||||
- snippet = snippet_blob[:snippet_object]
|
||||
- snippet_chunks = snippet_blob[:snippet_chunks]
|
||||
|
||||
.search-result-row
|
||||
%span
|
||||
= snippet_blob[:snippet_object].title
|
||||
= snippet.title
|
||||
by
|
||||
= link_to user_snippets_path(snippet_blob[:snippet_object].author) do
|
||||
= image_tag avatar_icon(snippet_blob[:snippet_object].author_email), class: "avatar avatar-inline s16", alt: ''
|
||||
= snippet_blob[:snippet_object].author_name
|
||||
%span.light #{time_ago_with_tooltip(snippet_blob[:snippet_object].created_at)}
|
||||
= link_to user_snippets_path(snippet.author) do
|
||||
= image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: ''
|
||||
= snippet.author_name
|
||||
%span.light #{time_ago_with_tooltip(snippet.created_at)}
|
||||
%h4.snippet-title
|
||||
- snippet_path = reliable_snippet_path(snippet_blob[:snippet_object])
|
||||
- snippet_path = reliable_snippet_path(snippet)
|
||||
= link_to snippet_path do
|
||||
.file-holder
|
||||
.file-title
|
||||
%i.fa.fa-file
|
||||
%strong= snippet_blob[:snippet_object].file_name
|
||||
- if markup?(snippet_blob[:snippet_object].file_name)
|
||||
%strong= snippet.file_name
|
||||
- if markup?(snippet.file_name)
|
||||
.file-content.wiki
|
||||
- snippet_blob[:snippet_chunks].each do |snippet|
|
||||
- unless snippet[:data].empty?
|
||||
= render_markup(snippet_blob[:snippet_object].file_name, snippet[:data])
|
||||
- snippet_chunks.each do |chunk|
|
||||
- unless chunk[:data].empty?
|
||||
= render_markup(snippet.file_name, chunk[:data])
|
||||
- else
|
||||
.file-content.code
|
||||
.nothing-here-block Empty file
|
||||
- else
|
||||
.file-content.code.js-syntax-highlight
|
||||
.line-numbers
|
||||
- snippet_blob[:snippet_chunks].each do |snippet|
|
||||
- unless snippet[:data].empty?
|
||||
- snippet[:data].lines.to_a.size.times do |index|
|
||||
- offset = defined?(snippet[:start_line]) ? snippet[:start_line] : 1
|
||||
- snippet_chunks.each do |chunk|
|
||||
- unless chunk[:data].empty?
|
||||
- chunk[:data].lines.to_a.size.times do |index|
|
||||
- offset = defined?(chunk[:start_line]) ? chunk[:start_line] : 1
|
||||
- i = index + offset
|
||||
= link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}", class: "diff-line-num" do
|
||||
%i.fa.fa-link
|
||||
= i
|
||||
- unless snippet == snippet_blob[:snippet_chunks].last
|
||||
- unless snippet == snippet_chunks.last
|
||||
%a.diff-line-num
|
||||
= "."
|
||||
%pre.code
|
||||
%code
|
||||
- snippet_blob[:snippet_chunks].each do |snippet|
|
||||
- unless snippet[:data].empty?
|
||||
= snippet[:data]
|
||||
- unless snippet == snippet_blob[:snippet_chunks].last
|
||||
- snippet_chunks.each do |chunk|
|
||||
- unless chunk[:data].empty?
|
||||
= chunk[:data]
|
||||
- unless chunk == snippet_chunks.last
|
||||
%a
|
||||
= "..."
|
||||
- else
|
||||
|
|
|
@ -14,7 +14,7 @@ module Gitlab
|
|||
when 'snippet_titles'
|
||||
Kaminari.paginate_array(snippet_titles).page(page).per(per_page)
|
||||
when 'snippet_blobs'
|
||||
Kaminari.paginate_array(snippet_blobs).page(page).per(per_page)
|
||||
snippet_blobs.page(page).per(per_page)
|
||||
else
|
||||
super
|
||||
end
|
||||
|
@ -39,11 +39,7 @@ module Gitlab
|
|||
end
|
||||
|
||||
def snippet_blobs
|
||||
search = Snippet.where(id: limit_snippet_ids).search_code(query)
|
||||
search = search.order('updated_at DESC').to_a
|
||||
snippets = []
|
||||
search.each { |e| snippets << chunk_snippet(e) }
|
||||
snippets
|
||||
Snippet.where(id: limit_snippet_ids).search_code(query).order('updated_at DESC')
|
||||
end
|
||||
|
||||
def default_scope
|
||||
|
|
Loading…
Reference in a new issue