Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
01d4c86a
Commit
01d4c86a
authored
Jan 18, 2016
by
Valery Sizov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ES: sneppets search refactoring
parent
f95c84ae
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
79 additions
and
160 deletions
+79
-160
app/helpers/snippets_helper.rb
app/helpers/snippets_helper.rb
+75
-0
lib/gitlab/elastic/snippet_search_results.rb
lib/gitlab/elastic/snippet_search_results.rb
+2
-80
lib/gitlab/snippet_search_results.rb
lib/gitlab/snippet_search_results.rb
+2
-80
No files found.
app/helpers/snippets_helper.rb
View file @
01d4c86a
...
...
@@ -17,4 +17,79 @@ module SnippetsHelper
snippet_path
(
snippet
)
end
end
# 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
,
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
# 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
,
surrounding_lines
)
used_lines
=
[]
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
.
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
,
surrounding_lines
=
3
)
lined_content
=
snippet
.
content
.
split
(
"
\n
"
)
used_lines
=
matching_lines
(
lined_content
,
surrounding_lines
)
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
end
lib/gitlab/elastic/snippet_search_results.rb
View file @
01d4c86a
module
Gitlab
module
Elastic
class
SnippetSearchResults
<
SearchResults
include
SnippetsHelper
attr_reader
:limit_snippet_ids
def
initialize
(
limit_snippet_ids
,
query
)
...
...
@@ -58,86 +60,6 @@ module Gitlab
def
default_scope
'snippet_blobs'
end
# 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
# 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
.
each_with_index
do
|
line
,
line_number
|
used_lines
.
concat
bounded_line_numbers
(
line_number
,
0
,
lined_content
.
size
)
if
line
.
include?
(
query
)
end
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
end
lib/gitlab/snippet_search_results.rb
View file @
01d4c86a
module
Gitlab
class
SnippetSearchResults
<
SearchResults
include
SnippetsHelper
attr_reader
:limit_snippet_ids
def
initialize
(
limit_snippet_ids
,
query
)
...
...
@@ -47,85 +49,5 @@ module Gitlab
def
default_scope
'snippet_blobs'
end
# 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
# 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
.
each_with_index
do
|
line
,
line_number
|
used_lines
.
concat
bounded_line_numbers
(
line_number
,
0
,
lined_content
.
size
)
if
line
.
include?
(
query
)
end
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment