diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index c342dc4561..089beb00e5 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -273,6 +273,7 @@ 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?) + order_option += ['issues.id ASC'] unless order_option.include?("issues.id DESC") || order_option.include?("issues.id ASC") scope = Issue.visible. joins(:status, :project). @@ -315,6 +316,7 @@ class IssueQuery < Query # Returns the issues ids def issue_ids(options={}) order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + order_option += ['issues.id ASC'] unless order_option.include?("issues.id DESC") || order_option.include?("issues.id ASC") Issue.visible. joins(:status, :project). diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb index 1a938c5bfa..b90f71d2bf 100644 --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -136,6 +136,7 @@ class TimeEntryQuery < Query def results_scope(options={}) order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + order_option += ['time_entries.id ASC'] base_scope. order(order_option). joins(joins_for_order_statement(order_option.join(','))) diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 924a8f4f38..01bde34406 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -2184,4 +2184,18 @@ class QueryTest < ActiveSupport::TestCase assert_equal ['1','2','3','4','5','6'], query.available_filters['status_id'][:values].map(&:second) 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 diff --git a/test/unit/time_entry_query_test.rb b/test/unit/time_entry_query_test.rb index 637f884f4b..5947462043 100644 --- a/test/unit/time_entry_query_test.rb +++ b/test/unit/time_entry_query_test.rb @@ -107,4 +107,19 @@ class TimeEntryQueryTest < ActiveSupport::TestCase query = TimeEntryQuery.new(:project => nil, :name => '_') assert !query.available_filters.has_key?('issue.category_id') 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