summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-08-27 14:22:58 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-08-27 14:22:58 +0000
commitf12fdf16e3c1aee5203d0217f0b44b64bb80706c (patch)
treeb119031893c2a71c9e8679f804fae8f0e8c9b62e /lib
parent67d96b0f3641bda7311113a074090f61fe174850 (diff)
parentc5c906fe6472f953b379aca4c34fad23b3b7742e (diff)
downloadgitlab-ce-f12fdf16e3c1aee5203d0217f0b44b64bb80706c.tar.gz
Merge branch 'improve-search-page' into 'master'
Improve search page Fixes #1270 * added pagination support * filter results by type * when switch between context - search params stays * redesign comment search results * search Issues and MR by description too ## Screenshots: ![Screenshot 2014-08-27 09.56.18](https://dev.gitlab.org/uploads/gitlab/gitlabhq/2053220cd4/Screenshot_2014-08-27_09.56.18.png) ![Screenshot 2014-08-27 09.56.00](https://dev.gitlab.org/uploads/gitlab/gitlabhq/726c764da4/Screenshot_2014-08-27_09.56.00.png) See merge request !1043
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/project_search_results.rb52
-rw-r--r--lib/gitlab/search_results.rb69
2 files changed, 121 insertions, 0 deletions
diff --git a/lib/gitlab/project_search_results.rb b/lib/gitlab/project_search_results.rb
new file mode 100644
index 00000000000..90511662b20
--- /dev/null
+++ b/lib/gitlab/project_search_results.rb
@@ -0,0 +1,52 @@
+module Gitlab
+ class ProjectSearchResults < SearchResults
+ attr_reader :project, :repository_ref
+
+ def initialize(project_id, query, repository_ref = nil)
+ @project = Project.find(project_id)
+ @repository_ref = repository_ref
+ @query = Shellwords.shellescape(query) if query.present?
+ end
+
+ def objects(scope, page = nil)
+ 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
diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb
new file mode 100644
index 00000000000..75a3dfe37c3
--- /dev/null
+++ b/lib/gitlab/search_results.rb
@@ -0,0 +1,69 @@
+module Gitlab
+ class SearchResults
+ attr_reader :query
+
+ # Limit search results by passed project ids
+ # It allows us to search only for projects user has access to
+ attr_reader :limit_project_ids
+
+ def initialize(limit_project_ids, query)
+ @limit_project_ids = limit_project_ids || Project.all
+ @query = Shellwords.shellescape(query) if query.present?
+ end
+
+ def objects(scope, page = nil)
+ case scope
+ when 'projects'
+ projects.page(page).per(per_page)
+ when 'issues'
+ issues.page(page).per(per_page)
+ when 'merge_requests'
+ merge_requests.page(page).per(per_page)
+ else
+ Kaminari.paginate_array([]).page(page).per(per_page)
+ end
+ end
+
+ def total_count
+ @total_count ||= projects_count + issues_count + merge_requests_count
+ end
+
+ def projects_count
+ @projects_count ||= projects.count
+ end
+
+ def issues_count
+ @issues_count ||= issues.count
+ end
+
+ def merge_requests_count
+ @merge_requests_count ||= merge_requests.count
+ end
+
+ def empty?
+ total_count.zero?
+ end
+
+ private
+
+ def projects
+ Project.where(id: limit_project_ids).search(query)
+ end
+
+ def issues
+ Issue.where(project_id: limit_project_ids).full_search(query).order('updated_at DESC')
+ end
+
+ def merge_requests
+ MergeRequest.in_projects(limit_project_ids).full_search(query).order('updated_at DESC')
+ end
+
+ def default_scope
+ 'projects'
+ end
+
+ def per_page
+ 20
+ end
+ end
+end