project_search_results.rb 1.1 KB
Newer Older
1 2 3 4
module Gitlab
  class ProjectSearchResults < SearchResults
    attr_reader :project, :repository_ref

5
    def initialize(project_id, query, repository_ref = nil)
6 7 8 9 10
      @project = Project.find(project_id)
      @repository_ref = repository_ref
      @query = Shellwords.shellescape(query) if query.present?
    end

11
    def objects(scope, page)
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
      case scope
      when 'notes'
        notes.page(page).per(per_page)
      when 'blobs'
        Kaminari.paginate_array(blobs).page(page).per(per_page)
      else
        super
      end
    end

    def total_count
      @total_count ||= issues_count + merge_requests_count + blobs_count + notes_count
    end

    def blobs_count
      @blobs_count ||= blobs.count
    end

    def notes_count
      @notes_count ||= notes.count
    end

    private

    def blobs
      if project.empty_repo?
        []
      else
        project.repository.search_files(query, repository_ref)
      end
    end

    def notes
      Note.where(project_id: limit_project_ids).search(query).order('updated_at DESC')
    end

    def limit_project_ids
      [project.id]
    end
  end
end