Browse Source

Issues in paginated views may be lost because sorting criteria are not unique (#29581).

Patch by Mizuki ISHIKAWA.

git-svn-id: http://svn.redmine.org/redmine/trunk@18263 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/4.1.0
Jean-Philippe Lang 5 years ago
parent
commit
87e82b4894

+ 8
- 0
app/models/issue_query.rb View File

@@ -297,6 +297,10 @@ class IssueQuery < Query
# Valid options are :order, :offset, :limit, :include, :conditions
def issues(options={})
order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?)
# The default order of IssueQuery is issues.id DESC(by IssueQuery#default_sort_criteria)
unless ["#{Issue.table_name}.id ASC", "#{Issue.table_name}.id DESC"].any?{|i| order_option.include?(i)}
order_option << "#{Issue.table_name}.id DESC"
end

scope = Issue.visible.
joins(:status, :project).
@@ -339,6 +343,10 @@ class IssueQuery < Query
# Returns the issues ids
def issue_ids(options={})
order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?)
# The default order of IssueQuery is issues.id DESC(by IssueQuery#default_sort_criteria)
unless ["#{Issue.table_name}.id ASC", "#{Issue.table_name}.id DESC"].any?{|i| order_option.include?(i)}
order_option << "#{Issue.table_name}.id DESC"
end

Issue.visible.
joins(:status, :project).

+ 1
- 0
app/models/time_entry_query.rb View File

@@ -148,6 +148,7 @@ class TimeEntryQuery < Query
def results_scope(options={})
order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?)

order_option << "#{TimeEntry.table_name}.id ASC"
base_scope.
order(order_option).
joins(joins_for_order_statement(order_option.join(',')))

+ 14
- 0
test/unit/query_test.rb View File

@@ -2329,4 +2329,18 @@ class QueryTest < ActiveSupport::TestCase
query.filters = {'spent_time' => {:operator => '><', :values => ['1', '2']}}
assert_equal [3], query.issues.pluck(:id)
end

def test_issues_should_be_in_the_same_order_when_paginating
q = IssueQuery.new
q.sort_criteria = {'0' => ['priority', 'desc']}
issue_ids = q.issues.pluck(:id)
paginated_issue_ids = []
# Test with a maximum of 2 records per page.
((q.issue_count / 2) + 1).times do |i|
paginated_issue_ids += q.issues(:offset => (i * 2), :limit => 2).pluck(:id)
end

# Non-paginated issue ids and paginated issue ids should be in the same order.
assert_equal issue_ids, paginated_issue_ids
end
end

+ 15
- 0
test/unit/time_entry_query_test.rb View File

@@ -129,4 +129,19 @@ class TimeEntryQueryTest < ActiveSupport::TestCase
query = TimeEntryQuery.new(:project => Project.find(2), :name => '_')
assert !query.available_filters.has_key?('project.status')
end

def test_results_scope_should_be_in_the_same_order_when_paginating
4.times { TimeEntry.generate! }
q = TimeEntryQuery.new
q.sort_criteria = {'0' => ['user', 'asc']}
time_entry_ids = q.results_scope.pluck(:id)
paginated_time_entry_ids = []
# Test with a maximum of 2 records per page.
((q.results_scope.count / 2) + 1).times do |i|
paginated_time_entry_ids += q.results_scope.offset((i * 2)).limit(2).pluck(:id)
end

# Non-paginated time entry ids and paginated time entry ids should be in the same order.
assert_equal time_entry_ids, paginated_time_entry_ids
end
end

Loading…
Cancel
Save