Faster snippet search

This commit is contained in:
Valery Sizov 2016-02-05 18:20:29 +02:00
parent 569c467203
commit 94af78ac4a
4 changed files with 30 additions and 29 deletions

View file

@ -34,6 +34,7 @@ v 8.5.0 (unreleased)
- Add sort dropdown to dashboard projects page - 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) - 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 - In seach autocomplete show only groups and projects you are member of
- Faster snippet search
v 8.4.3 v 8.4.3
- Increase lfs_objects size column to 8-byte integer to allow files larger - Increase lfs_objects size column to 8-byte integer to allow files larger

View file

@ -33,7 +33,7 @@ module SnippetsHelper
# surrounding code. # surrounding code.
# #
# @returns Array, unique and sorted. # @returns Array, unique and sorted.
def matching_lines(lined_content, surrounding_lines) def matching_lines(lined_content, surrounding_lines, query)
used_lines = [] used_lines = []
lined_content.each_with_index do |line, line_number| lined_content.each_with_index do |line, line_number|
used_lines.concat bounded_line_numbers( used_lines.concat bounded_line_numbers(
@ -51,9 +51,9 @@ module SnippetsHelper
# surrounding_lines() worth of unmatching lines. # surrounding_lines() worth of unmatching lines.
# #
# @returns a hash with {snippet_object, snippet_chunks:{data,start_line}} # @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") 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_chunk = []
snippet_chunks = [] snippet_chunks = []

View file

@ -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 .search-result-row
%span %span
= snippet_blob[:snippet_object].title = snippet.title
by by
= link_to user_snippets_path(snippet_blob[:snippet_object].author) do = link_to user_snippets_path(snippet.author) do
= image_tag avatar_icon(snippet_blob[:snippet_object].author_email), class: "avatar avatar-inline s16", alt: '' = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: ''
= snippet_blob[:snippet_object].author_name = snippet.author_name
%span.light #{time_ago_with_tooltip(snippet_blob[:snippet_object].created_at)} %span.light #{time_ago_with_tooltip(snippet.created_at)}
%h4.snippet-title %h4.snippet-title
- snippet_path = reliable_snippet_path(snippet_blob[:snippet_object]) - snippet_path = reliable_snippet_path(snippet)
= link_to snippet_path do = link_to snippet_path do
.file-holder .file-holder
.file-title .file-title
%i.fa.fa-file %i.fa.fa-file
%strong= snippet_blob[:snippet_object].file_name %strong= snippet.file_name
- if markup?(snippet_blob[:snippet_object].file_name) - if markup?(snippet.file_name)
.file-content.wiki .file-content.wiki
- snippet_blob[:snippet_chunks].each do |snippet| - snippet_chunks.each do |chunk|
- unless snippet[:data].empty? - unless chunk[:data].empty?
= render_markup(snippet_blob[:snippet_object].file_name, snippet[:data]) = render_markup(snippet.file_name, chunk[:data])
- else - else
.file-content.code .file-content.code
.nothing-here-block Empty file .nothing-here-block Empty file
- else - else
.file-content.code.js-syntax-highlight .file-content.code.js-syntax-highlight
.line-numbers .line-numbers
- snippet_blob[:snippet_chunks].each do |snippet| - snippet_chunks.each do |chunk|
- unless snippet[:data].empty? - unless chunk[:data].empty?
- snippet[:data].lines.to_a.size.times do |index| - chunk[:data].lines.to_a.size.times do |index|
- offset = defined?(snippet[:start_line]) ? snippet[:start_line] : 1 - offset = defined?(chunk[:start_line]) ? chunk[:start_line] : 1
- i = index + offset - i = index + offset
= link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}", class: "diff-line-num" do = link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}", class: "diff-line-num" do
%i.fa.fa-link %i.fa.fa-link
= i = i
- unless snippet == snippet_blob[:snippet_chunks].last - unless snippet == snippet_chunks.last
%a.diff-line-num %a.diff-line-num
= "." = "."
%pre.code %pre.code
%code %code
- snippet_blob[:snippet_chunks].each do |snippet| - snippet_chunks.each do |chunk|
- unless snippet[:data].empty? - unless chunk[:data].empty?
= snippet[:data] = chunk[:data]
- unless snippet == snippet_blob[:snippet_chunks].last - unless chunk == snippet_chunks.last
%a %a
= "..." = "..."
- else - else

View file

@ -14,7 +14,7 @@ module Gitlab
when 'snippet_titles' when 'snippet_titles'
Kaminari.paginate_array(snippet_titles).page(page).per(per_page) Kaminari.paginate_array(snippet_titles).page(page).per(per_page)
when 'snippet_blobs' when 'snippet_blobs'
Kaminari.paginate_array(snippet_blobs).page(page).per(per_page) snippet_blobs.page(page).per(per_page)
else else
super super
end end
@ -39,11 +39,7 @@ module Gitlab
end end
def snippet_blobs def snippet_blobs
search = Snippet.where(id: limit_snippet_ids).search_code(query) Snippet.where(id: limit_snippet_ids).search_code(query).order('updated_at DESC')
search = search.order('updated_at DESC').to_a
snippets = []
search.each { |e| snippets << chunk_snippet(e) }
snippets
end end
def default_scope def default_scope