summaryrefslogtreecommitdiff
path: root/lib/gitlab/search_results.rb
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-08-26 23:32:41 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-08-26 23:32:41 +0300
commit9a4ef7e7eb1fe73938578d82c2662913e3d51ad6 (patch)
tree77cddbb48950c62e4548911c46ae674f1845b0ed /lib/gitlab/search_results.rb
parentb3b50bb86ea89c54d790516552e65eb8b4149fe1 (diff)
downloadgitlab-ce-9a4ef7e7eb1fe73938578d82c2662913e3d51ad6.tar.gz
Search results libraries added
Gitlab::SearchResults and Gitlab::ProjectSearchResults are libraries we are going to use to get search results based on query, enitity type and pagination. It will allow us to get only issues from project #23 where title or description includes 'foo'. Ex: search_results = Gitlab::ProjectSearchResults.new(project.id, 'foo', 'issues') search_results.objects => # [<Issues #23>, <Issues #34>] search_results.issues_count => 2 search_results.total_count => 12 (it includes results from comments and merge requests too) Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'lib/gitlab/search_results.rb')
-rw-r--r--lib/gitlab/search_results.rb75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb
new file mode 100644
index 00000000000..1325d542a0f
--- /dev/null
+++ b/lib/gitlab/search_results.rb
@@ -0,0 +1,75 @@
+module Gitlab
+ class SearchResults
+ attr_reader :scope, :objects, :query, :page
+
+ # 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, scope = nil, page = nil)
+ @limit_project_ids = limit_project_ids || Project.all
+ @page = page
+ @query = Shellwords.shellescape(query) if query.present?
+ @scope = scope
+
+ unless %w(projects issues merge_requests).include?(@scope)
+ @scope = default_scope
+ end
+ end
+
+ def objects
+ 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).search(query).order('updated_at DESC')
+ end
+
+ def merge_requests
+ MergeRequest.in_projects(limit_project_ids).search(query).order('updated_at DESC')
+ end
+
+ def default_scope
+ 'projects'
+ end
+
+ def per_page
+ 20
+ end
+ end
+end