diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 07eac0aadc..589089bada 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -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). diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb index 9c767266bb..5ca95ea916 100644 --- a/app/models/time_entry_query.rb +++ b/app/models/time_entry_query.rb @@ -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(','))) diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index f0a67ee6f7..4e590b7592 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -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 diff --git a/test/unit/time_entry_query_test.rb b/test/unit/time_entry_query_test.rb index 0d824bc3db..1f8301f8f1 100644 --- a/test/unit/time_entry_query_test.rb +++ b/test/unit/time_entry_query_test.rb @@ -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