]> source.dussan.org Git - redmine.git/commitdiff
Pass the order option as an array to satisfy sqlserver adapter (#12713).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 4 Jan 2013 10:04:25 +0000 (10:04 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 4 Jan 2013 10:04:25 +0000 (10:04 +0000)
Unlike other adapters, the sqlserver adapter processes the order option and wipes it when using functions.
Here we can see a "ASC" inserted in the COALESCE call:

irb(main):001:0> Issue.order("coalesce(estimated_hours, 0), id").to_sql
=> "SELECT [issues].* FROM [issues] ORDER BY coalesce(estimated_hours ASC, 0) ASC, id ASC"

This does not happen when passing the order SQL fragments separately.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11115 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/sort_helper.rb
app/models/issue_query.rb
test/unit/helpers/sort_helper_test.rb

index fd797951a5957e70ab2f137215c624caab91ed63..13beed3c27597c84b4e265bb5911eaffba0675c9 100644 (file)
@@ -80,12 +80,13 @@ module SortHelper
       @criteria.collect {|k,o| k + (o ? '' : ':desc')}.join(',')
     end
 
+    # Returns an array of SQL fragments used to sort the list
     def to_sql
       sql = @criteria.collect do |k,o|
         if s = @available_criteria[k]
-          (o ? s.to_a : s.to_a.collect {|c| append_desc(c)}).join(', ')
+          (o ? s.to_a : s.to_a.collect {|c| append_desc(c)})
         end
-      end.compact.join(', ')
+      end.flatten.compact
       sql.blank? ? nil : sql
     end
 
index 8f7002ad00f772c404cda43b8239accf6dea77ca..b0e282f8941ad978ba1bdaca68bd909614b0a073 100644 (file)
@@ -270,14 +270,13 @@ class IssueQuery < Query
   # Returns the issues
   # Valid options are :order, :offset, :limit, :include, :conditions
   def issues(options={})
-    order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
-    order_option = nil if order_option.blank?
+    order_option = [group_by_sort_order, options[:order]].flatten.reject(&:blank?)
 
     issues = Issue.visible.where(options[:conditions]).all(
       :include => ([:status, :project] + (options[:include] || [])).uniq,
       :conditions => statement,
       :order => order_option,
-      :joins => joins_for_order_statement(order_option),
+      :joins => joins_for_order_statement(order_option.join(',')),
       :limit  => options[:limit],
       :offset => options[:offset]
     )
@@ -295,13 +294,12 @@ class IssueQuery < Query
 
   # Returns the issues ids
   def issue_ids(options={})
-    order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',')
-    order_option = nil if order_option.blank?
+    order_option = [group_by_sort_order, options[:order]].flatten.reject(&:blank?)
 
     Issue.visible.scoped(:conditions => options[:conditions]).scoped(:include => ([:status, :project] + (options[:include] || [])).uniq,
                      :conditions => statement,
                      :order => order_option,
-                     :joins => joins_for_order_statement(order_option),
+                     :joins => joins_for_order_statement(order_option.join(',')),
                      :limit  => options[:limit],
                      :offset => options[:offset]).find_ids
   rescue ::ActiveRecord::StatementInvalid => e
index 551de8762b9d21b4ab7b0e84b3eb30bf3fcbcc27..4ec2d451b707a5bec92f558e1fafe04b64d36c79 100644 (file)
@@ -30,21 +30,21 @@ class SortHelperTest < ActionView::TestCase
     sort_init 'attr1', 'desc'
     sort_update(['attr1', 'attr2'])
 
-    assert_equal 'attr1 DESC', sort_clause
+    assert_equal ['attr1 DESC'], sort_clause
   end
 
   def test_default_sort_clause_with_hash
     sort_init 'attr1', 'desc'
     sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
 
-    assert_equal 'table1.attr1 DESC', sort_clause
+    assert_equal ['table1.attr1 DESC'], sort_clause
   end
 
   def test_default_sort_clause_with_multiple_columns
     sort_init 'attr1', 'desc'
     sort_update({'attr1' => ['table1.attr1', 'table1.attr2'], 'attr2' => 'table2.attr2'})
 
-    assert_equal 'table1.attr1 DESC, table1.attr2 DESC', sort_clause
+    assert_equal ['table1.attr1 DESC', 'table1.attr2 DESC'], sort_clause
   end
 
   def test_params_sort
@@ -53,7 +53,7 @@ class SortHelperTest < ActionView::TestCase
     sort_init 'attr1', 'desc'
     sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
 
-    assert_equal 'table1.attr1, table2.attr2 DESC', sort_clause
+    assert_equal ['table1.attr1', 'table2.attr2 DESC'], sort_clause
     assert_equal 'attr1,attr2:desc', @session['foo_bar_sort']
   end
 
@@ -63,7 +63,7 @@ class SortHelperTest < ActionView::TestCase
     sort_init 'attr1', 'desc'
     sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
 
-    assert_equal 'table1.attr1 DESC', sort_clause
+    assert_equal ['table1.attr1 DESC'], sort_clause
     assert_equal 'attr1:desc', @session['foo_bar_sort']
   end
 
@@ -73,7 +73,7 @@ class SortHelperTest < ActionView::TestCase
     sort_init 'attr1', 'desc'
     sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
 
-    assert_equal 'table1.attr1, table2.attr2', sort_clause
+    assert_equal ['table1.attr1', 'table2.attr2'], sort_clause
     assert_equal 'attr1,attr2', @session['foo_bar_sort']
   end