git-svn-id: http://svn.redmine.org/redmine/trunk@15264 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/3.3.0
@@ -27,6 +27,15 @@ class SearchController < ApplicationController | |||
@search_attachments = params[:attachments].presence || '0' | |||
@open_issues = params[:open_issues] ? params[:open_issues].present? : false | |||
case params[:format] | |||
when 'xml', 'json' | |||
@offset, @limit = api_offset_and_limit | |||
else | |||
@offset = nil | |||
@limit = Setting.search_results_per_page.to_i | |||
@limit = 10 if @limit == 0 | |||
end | |||
# quick jump to an issue | |||
if (m = @question.match(/^#?(\d+)$/)) && (issue = Issue.visible.find_by_id(m[1].to_i)) | |||
redirect_to issue_path(issue) | |||
@@ -67,10 +76,9 @@ class SearchController < ApplicationController | |||
@result_count_by_type = fetcher.result_count_by_type | |||
@tokens = fetcher.tokens | |||
per_page = Setting.search_results_per_page.to_i | |||
per_page = 10 if per_page == 0 | |||
@result_pages = Paginator.new @result_count, per_page, params['page'] | |||
@results = fetcher.results(@result_pages.offset, @result_pages.per_page) | |||
@result_pages = Paginator.new @result_count, @limit, params['page'] | |||
@offset ||= @result_pages.offset | |||
@results = fetcher.results(@offset, @result_pages.per_page) | |||
else | |||
@question = "" | |||
end |
@@ -1,4 +1,4 @@ | |||
api.array :results do | |||
api.array :results, api_meta(:total_count => @result_count, :offset => @offset, :limit => @limit) do | |||
@results.each do |result| | |||
api.result do | |||
api.id result.id |
@@ -71,4 +71,22 @@ class Redmine::ApiTest::SearchTest < Redmine::ApiTest::Base | |||
end | |||
end | |||
end | |||
test "GET /search.xml should paginate" do | |||
issue = (0..10).map {Issue.generate! :subject => 'search_with_limited_results'}.reverse.map(&:id) | |||
get '/search.json', :q => 'search_with_limited_results', :limit => 4 | |||
json = ActiveSupport::JSON.decode(response.body) | |||
assert_equal 11, json['total_count'] | |||
assert_equal 0, json['offset'] | |||
assert_equal 4, json['limit'] | |||
assert_equal issue[0..3], json['results'].map {|r| r['id']} | |||
get '/search.json', :q => 'search_with_limited_results', :offset => 8, :limit => 4 | |||
json = ActiveSupport::JSON.decode(response.body) | |||
assert_equal 11, json['total_count'] | |||
assert_equal 8, json['offset'] | |||
assert_equal 4, json['limit'] | |||
assert_equal issue[8..10], json['results'].map {|r| r['id']} | |||
end | |||
end |