From 4cca1b050a0e80e4ce6bb67f530549a2f28af630 Mon Sep 17 00:00:00 2001 From: Charles Bushong Date: Fri, 29 Aug 2014 15:22:45 -0400 Subject: Adding in snippet search functionality http://feedback.gitlab.com/forums/176466-general/suggestions/5529795-search-though-snippets --- lib/gitlab/snippet_search_results.rb | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 lib/gitlab/snippet_search_results.rb (limited to 'lib') diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb new file mode 100644 index 00000000000..4b406c30f47 --- /dev/null +++ b/lib/gitlab/snippet_search_results.rb @@ -0,0 +1,100 @@ +module Gitlab + class SnippetSearchResults < SearchResults + attr_reader :limit_snippet_ids + + def initialize(limit_snippet_ids, query) + @limit_snippet_ids = limit_snippet_ids + @query = query + end + + def objects(scope, page = nil) + case scope + 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) + else + super + end + end + + def total_count + @total_count ||= snippet_titles_count + snippet_blobs_count + end + + def snippet_titles_count + @snippet_titles_count ||= snippet_titles.count + end + + def snippet_blobs_count + @snippet_blobs_count ||= snippet_blobs.count + end + + private + + def snippet_titles + Snippet.where(id: limit_snippet_ids).search(query).order('updated_at DESC') + end + + def snippet_blobs + matching_snippets = Snippet.where(id: limit_snippet_ids).search_code(query).order('updated_at DESC') + matching_snippets = matching_snippets.to_a + snippets = [] + matching_snippets.each { |e| snippets << chunk_snippet(e) } + snippets + end + + def default_scope + 'snippet_blobs' + end + + def bounded_line_numbers(line, min, max, surrounding_lines) + lower = line - surrounding_lines > min ? line - surrounding_lines : min + upper = line + surrounding_lines < max ? line + surrounding_lines : max + (lower..upper).to_a + end + + def chunk_snippet(snippet) + surrounding_lines = 3 + used_lines = [] + lined_content = snippet.content.split("\n") + lined_content.each_with_index { |line, line_number| + used_lines.concat bounded_line_numbers( + line_number, + 0, + lined_content.size, + surrounding_lines + ) if line.include?(query) + } + + used_lines = used_lines.uniq.sort + + snippet_chunk = [] + snippet_chunks = [] + snippet_start_line = 0 + last_line = -1 + used_lines.each { |line_number| + if last_line < 0 + snippet_start_line = line_number + snippet_chunk << lined_content[line_number] + elsif last_line == line_number - 1 + snippet_chunk << lined_content[line_number] + else + snippet_chunks << { + data: snippet_chunk.join("\n"), + start_line: snippet_start_line + 1 + } + snippet_chunk = [lined_content[line_number]] + snippet_start_line = line_number + end + last_line = line_number + } + snippet_chunks << { + data: snippet_chunk.join("\n"), + start_line: snippet_start_line + 1 + } + + { snippet_object: snippet, snippet_chunks: snippet_chunks } + end + end +end -- cgit v1.2.1 From b1411e90f81ea87ad45dee324b13881095e031ea Mon Sep 17 00:00:00 2001 From: Charles Bushong Date: Tue, 2 Sep 2014 08:33:23 -0400 Subject: Changing some formatting for the Hound, modifying some UI text --- lib/gitlab/snippet_search_results.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb index 4b406c30f47..04217aab49f 100644 --- a/lib/gitlab/snippet_search_results.rb +++ b/lib/gitlab/snippet_search_results.rb @@ -37,10 +37,10 @@ module Gitlab end def snippet_blobs - matching_snippets = Snippet.where(id: limit_snippet_ids).search_code(query).order('updated_at DESC') - matching_snippets = matching_snippets.to_a + search = Snippet.where(id: limit_snippet_ids).search_code(query) + search = search.order('updated_at DESC').to_a snippets = [] - matching_snippets.each { |e| snippets << chunk_snippet(e) } + search.each { |e| snippets << chunk_snippet(e) } snippets end @@ -58,14 +58,14 @@ module Gitlab surrounding_lines = 3 used_lines = [] lined_content = snippet.content.split("\n") - lined_content.each_with_index { |line, line_number| + lined_content.each_with_index do |line, line_number| used_lines.concat bounded_line_numbers( line_number, 0, lined_content.size, surrounding_lines ) if line.include?(query) - } + end used_lines = used_lines.uniq.sort @@ -73,7 +73,7 @@ module Gitlab snippet_chunks = [] snippet_start_line = 0 last_line = -1 - used_lines.each { |line_number| + used_lines.each do |line_number| if last_line < 0 snippet_start_line = line_number snippet_chunk << lined_content[line_number] @@ -88,7 +88,7 @@ module Gitlab snippet_start_line = line_number end last_line = line_number - } + end snippet_chunks << { data: snippet_chunk.join("\n"), start_line: snippet_start_line + 1 -- cgit v1.2.1 From 858dbd084253d2920d7007babe0471469eb459e7 Mon Sep 17 00:00:00 2001 From: Charles Bushong Date: Fri, 5 Sep 2014 13:30:55 -0400 Subject: Updating to persist a params snippets variable --- lib/gitlab/snippet_search_results.rb | 45 ++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb index 04217aab49f..938219efdb2 100644 --- a/lib/gitlab/snippet_search_results.rb +++ b/lib/gitlab/snippet_search_results.rb @@ -48,53 +48,84 @@ module Gitlab 'snippet_blobs' end - def bounded_line_numbers(line, min, max, surrounding_lines) + # Get an array of line numbers surrounding a matching + # line, bounded by min/max. + # + # @returns Array of line numbers + def bounded_line_numbers(line, min, max) lower = line - surrounding_lines > min ? line - surrounding_lines : min upper = line + surrounding_lines < max ? line + surrounding_lines : max (lower..upper).to_a end - def chunk_snippet(snippet) - surrounding_lines = 3 + # Returns a sorted set of lines to be included in a snippet preview. + # This ensures matching adjacent lines do not display duplicated + # surrounding code. + # + # @returns Array, unique and sorted. + def matching_lines(lined_content) used_lines = [] - lined_content = snippet.content.split("\n") lined_content.each_with_index do |line, line_number| used_lines.concat bounded_line_numbers( line_number, 0, - lined_content.size, - surrounding_lines + lined_content.size ) if line.include?(query) end - used_lines = used_lines.uniq.sort + used_lines.uniq.sort + end + + # 'Chunkify' entire snippet. Splits the snippet data into matching lines + + # surrounding_lines() worth of unmatching lines. + # + # @returns a hash with {snippet_object, snippet_chunks:{data,start_line}} + def chunk_snippet(snippet) + lined_content = snippet.content.split("\n") + used_lines = matching_lines(lined_content) snippet_chunk = [] snippet_chunks = [] snippet_start_line = 0 last_line = -1 + + # Go through each used line, and add consecutive lines as a single chunk + # to the snippet chunk array. used_lines.each do |line_number| if last_line < 0 + # Start a new chunk. snippet_start_line = line_number snippet_chunk << lined_content[line_number] elsif last_line == line_number - 1 + # Consecutive line, continue chunk. snippet_chunk << lined_content[line_number] else + # Non-consecutive line, add chunk to chunk array. snippet_chunks << { data: snippet_chunk.join("\n"), start_line: snippet_start_line + 1 } + + # Start a new chunk. snippet_chunk = [lined_content[line_number]] snippet_start_line = line_number end last_line = line_number end + # Add final chunk to chunk array snippet_chunks << { data: snippet_chunk.join("\n"), start_line: snippet_start_line + 1 } + # Return snippet with chunk array { snippet_object: snippet, snippet_chunks: snippet_chunks } end + + # Defines how many unmatching lines should be + # included around the matching lines in a snippet + def surrounding_lines + 3 + end end end -- cgit v1.2.1