debian-mirror-gitlab/lib/gitlab/project_search_results.rb

195 lines
5.6 KiB
Ruby
Raw Normal View History

2018-12-13 13:39:08 +05:30
# frozen_string_literal: true
2015-04-26 12:48:37 +05:30
module Gitlab
class ProjectSearchResults < SearchResults
2020-05-24 23:13:21 +05:30
attr_reader :project, :repository_ref
2015-04-26 12:48:37 +05:30
2020-05-24 23:13:21 +05:30
def initialize(current_user, project, query, repository_ref = nil)
2016-06-02 11:05:42 +05:30
@current_user = current_user
@project = project
2018-11-18 11:00:15 +05:30
@repository_ref = repository_ref.presence
2015-11-26 14:37:03 +05:30
@query = query
2015-04-26 12:48:37 +05:30
end
2020-06-23 00:09:42 +05:30
def objects(scope, page: nil, per_page: DEFAULT_PER_PAGE, preload_method: nil)
2015-04-26 12:48:37 +05:30
case scope
when 'notes'
notes.page(page).per(per_page)
when 'blobs'
2020-05-24 23:13:21 +05:30
paginated_blobs(blobs(limit: limit_up_to_page(page, per_page)), page, per_page)
2015-04-26 12:48:37 +05:30
when 'wiki_blobs'
2020-05-24 23:13:21 +05:30
paginated_wiki_blobs(wiki_blobs(limit: limit_up_to_page(page, per_page)), page, per_page)
2015-11-26 14:37:03 +05:30
when 'commits'
2020-06-23 00:09:42 +05:30
paginated_commits(page, per_page)
2019-07-07 11:18:12 +05:30
when 'users'
users.page(page).per(per_page)
2015-04-26 12:48:37 +05:30
else
2020-05-24 23:13:21 +05:30
super(scope, page: page, per_page: per_page, without_count: false)
2015-04-26 12:48:37 +05:30
end
end
2019-10-12 21:52:04 +05:30
def formatted_count(scope)
case scope
when 'blobs'
2020-03-13 15:44:24 +05:30
formatted_limited_count(limited_blobs_count)
2019-10-12 21:52:04 +05:30
when 'notes'
formatted_limited_count(limited_notes_count)
when 'wiki_blobs'
wiki_blobs_count.to_s
when 'commits'
2020-06-23 00:09:42 +05:30
formatted_limited_count(commits_count)
2019-10-12 21:52:04 +05:30
else
super
end
end
2019-07-07 11:18:12 +05:30
def users
super.where(id: @project.team.members) # rubocop:disable CodeReuse/ActiveRecord
end
2020-03-13 15:44:24 +05:30
def limited_blobs_count
2020-05-24 23:13:21 +05:30
@limited_blobs_count ||= blobs(limit: count_limit).count
2015-04-26 12:48:37 +05:30
end
2018-12-05 23:21:45 +05:30
# rubocop: disable CodeReuse/ActiveRecord
2018-03-27 19:54:05 +05:30
def limited_notes_count
return @limited_notes_count if defined?(@limited_notes_count)
types = %w(issue merge_request commit snippet)
@limited_notes_count = 0
types.each do |type|
@limited_notes_count += notes_finder(type).limit(count_limit).count
break if @limited_notes_count >= count_limit
end
@limited_notes_count
2015-04-26 12:48:37 +05:30
end
2018-12-05 23:21:45 +05:30
# rubocop: enable CodeReuse/ActiveRecord
2015-04-26 12:48:37 +05:30
def wiki_blobs_count
2020-05-24 23:13:21 +05:30
@wiki_blobs_count ||= wiki_blobs(limit: count_limit).count
2015-04-26 12:48:37 +05:30
end
2015-11-26 14:37:03 +05:30
def commits_count
2020-06-23 00:09:42 +05:30
@commits_count ||= commits(limit: count_limit).count
2015-11-26 14:37:03 +05:30
end
2017-08-17 22:00:37 +05:30
def single_commit_result?
2018-03-27 19:54:05 +05:30
return false if commits_count != 1
2017-08-17 22:00:37 +05:30
2018-03-27 19:54:05 +05:30
counts = %i(limited_milestones_count limited_notes_count
limited_merge_requests_count limited_issues_count
2020-03-13 15:44:24 +05:30
limited_blobs_count wiki_blobs_count)
2018-03-27 19:54:05 +05:30
counts.all? { |count_method| public_send(count_method).zero? } # rubocop:disable GitlabSecurity/PublicSend
2017-08-17 22:00:37 +05:30
end
2015-04-26 12:48:37 +05:30
private
2020-06-23 00:09:42 +05:30
def paginated_commits(page, per_page)
results = commits(limit: limit_up_to_page(page, per_page))
Kaminari.paginate_array(results).page(page).per(per_page)
end
2020-05-24 23:13:21 +05:30
def paginated_blobs(blobs, page, per_page)
2019-02-15 15:39:39 +05:30
results = Kaminari.paginate_array(blobs).page(page).per(per_page)
Gitlab::Search::FoundBlob.preload_blobs(results)
results
end
2020-05-24 23:13:21 +05:30
def paginated_wiki_blobs(blobs, page, per_page)
blob_array = paginated_blobs(blobs, page, per_page)
blob_array.map! do |blob|
Gitlab::Search::FoundWikiPage.new(blob)
end
end
def limit_up_to_page(page, per_page)
2020-03-13 15:44:24 +05:30
current_page = page&.to_i || 1
offset = per_page * (current_page - 1)
count_limit + offset
end
2020-05-24 23:13:21 +05:30
def blobs(limit: count_limit)
2017-08-17 22:00:37 +05:30
return [] unless Ability.allowed?(@current_user, :download_code, @project)
2020-05-24 23:13:21 +05:30
@blobs ||= Gitlab::FileFinder.new(project, repository_project_ref).find(query, content_match_cutoff: limit)
2015-04-26 12:48:37 +05:30
end
2020-05-24 23:13:21 +05:30
def wiki_blobs(limit: count_limit)
2017-08-17 22:00:37 +05:30
return [] unless Ability.allowed?(@current_user, :read_wiki, @project)
@wiki_blobs ||= begin
if project.wiki_enabled? && query.present?
2020-03-13 15:44:24 +05:30
if project.wiki.empty?
2017-08-17 22:00:37 +05:30
[]
2020-03-13 15:44:24 +05:30
else
2020-05-24 23:13:21 +05:30
Gitlab::WikiFileFinder.new(project, repository_wiki_ref).find(query, content_match_cutoff: limit)
2017-08-17 22:00:37 +05:30
end
2015-04-26 12:48:37 +05:30
else
[]
end
end
end
def notes
2018-03-27 19:54:05 +05:30
@notes ||= notes_finder(nil)
end
2018-12-05 23:21:45 +05:30
# rubocop: disable CodeReuse/ActiveRecord
2018-03-27 19:54:05 +05:30
def notes_finder(type)
2019-10-12 21:52:04 +05:30
NotesFinder.new(@current_user, search: query, target_type: type, project: project).execute.user.order('updated_at DESC')
2015-04-26 12:48:37 +05:30
end
2018-12-05 23:21:45 +05:30
# rubocop: enable CodeReuse/ActiveRecord
2015-04-26 12:48:37 +05:30
2020-06-23 00:09:42 +05:30
def commits(limit:)
@commits ||= find_commits(query, limit: limit)
2017-08-17 22:00:37 +05:30
end
2020-06-23 00:09:42 +05:30
def find_commits(query, limit:)
2017-08-17 22:00:37 +05:30
return [] unless Ability.allowed?(@current_user, :download_code, @project)
2020-06-23 00:09:42 +05:30
commits = find_commits_by_message(query, limit: limit)
2017-08-17 22:00:37 +05:30
commit_by_sha = find_commit_by_sha(query)
commits |= [commit_by_sha] if commit_by_sha
commits
end
2020-06-23 00:09:42 +05:30
def find_commits_by_message(query, limit:)
project.repository.find_commits_by_message(query, repository_project_ref, nil, limit)
2017-08-17 22:00:37 +05:30
end
def find_commit_by_sha(query)
key = query.strip
project.repository.commit(key) if Commit.valid_hash?(key)
2015-11-26 14:37:03 +05:30
end
2019-10-12 21:52:04 +05:30
# rubocop: disable CodeReuse/ActiveRecord
2016-06-02 11:05:42 +05:30
def project_ids_relation
2019-10-12 21:52:04 +05:30
Project.where(id: project).select(:id).reorder(nil)
2015-04-26 12:48:37 +05:30
end
2019-10-12 21:52:04 +05:30
# rubocop: enabled CodeReuse/ActiveRecord
2018-11-18 11:00:15 +05:30
2019-06-05 12:25:43 +05:30
def filter_milestones_by_project(milestones)
return Milestone.none unless Ability.allowed?(@current_user, :read_milestone, @project)
milestones.where(project_id: project.id) # rubocop: disable CodeReuse/ActiveRecord
end
2018-11-18 11:00:15 +05:30
def repository_project_ref
@repository_project_ref ||= repository_ref || project.default_branch
end
def repository_wiki_ref
@repository_wiki_ref ||= repository_ref || project.wiki.default_branch
end
2019-07-07 11:18:12 +05:30
def issuable_params
super.merge(project_id: project.id)
end
2015-04-26 12:48:37 +05:30
end
end