Project

General

Profile

Defect #33110 » 0001-Fix-sort-does-not-work-with-group-by-datetime-column.patch

Marius BĂLTEANU, 2020-03-29 14:43

View differences:

app/models/query.rb
850 850
  def group_by_sort_order
851 851
    if column = group_by_column
852 852
      order = (sort_criteria.order_for(column.name) || column.default_order || 'asc').try(:upcase)
853
      Array(column.sortable).map {|s| Arel.sql("#{s} #{order}")}
853

  
854
      column_sortable = column.sortable
855
      if column.is_a?(TimestampQueryColumn)
856
        column_sortable = Redmine::Database.timestamp_to_date(column.sortable, User.current.time_zone)
857
      end
858
      Array(column_sortable).map {|s| Arel.sql("#{s} #{order}")}
854 859
    end
855 860
  end
856 861

  
test/unit/query_test.rb
1705 1705
    assert_equal values.sort, values
1706 1706
  end
1707 1707

  
1708
  def test_sort_with_group_by_timestamp_query_column_should_sort_after_date_value
1709
    User.current = User.find(1)
1710

  
1711
    # Touch Issue#10 in order to be the last updated issue
1712
    Issue.find(10).update_attribute(:updated_on, Issue.find(10).updated_on + 1)
1713

  
1714
    q = IssueQuery.new(
1715
      :name => '_',
1716
      :filters => { 'updated_on' => {:operator => 't', :values => ['']} },
1717
      :group_by => 'updated_on',
1718
      :sort_criteria => [['subject', 'asc']]
1719
    )
1720

  
1721
    # The following 3 issues are updated today (ordered by updated_on):
1722
    #   Issue#10: Issue Doing the Blocking
1723
    #   Issue#9: Blocked Issue
1724
    #   Issue#6: Issue of a private subproject
1725

  
1726
    # When we group by a timestamp query column, all the issues in the group have the same date value (today)
1727
    # and the time of the value should not be taken into consideration when sorting
1728
    #
1729
    # For the same issues after subject ascending should return the following:
1730
    # Issue#9: Blocked Issue
1731
    # Issue#10: Issue Doing the Blocking
1732
    # Issue#6: Issue of a private subproject
1733
    assert_equal [9, 10, 6], q.issues.map(&:id)
1734
  end
1735

  
1708 1736
  def test_sort_by_total_for_estimated_hours
1709 1737
    # Prepare issues
1710 1738
    parent = issues(:issues_001)
    (1-1/1)