##// END OF EJS Templates
Fixed: error when filtering by numeric custom field with postgresql (#9719)....
Jean-Philippe Lang -
r7978:5ca558f19177
parent child
Show More
@@ -674,9 +674,17 class Query < ActiveRecord::Base
674 when :date, :date_past
674 when :date, :date_past
675 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil))
675 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil))
676 when :integer
676 when :integer
677 sql = "#{db_table}.#{db_field} = #{value.first.to_i}"
677 if is_custom_filter
678 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) = #{value.first.to_i})"
679 else
680 sql = "#{db_table}.#{db_field} = #{value.first.to_i}"
681 end
678 when :float
682 when :float
679 sql = "#{db_table}.#{db_field} BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5}"
683 if is_custom_filter
684 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5})"
685 else
686 sql = "#{db_table}.#{db_field} BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5}"
687 end
680 else
688 else
681 sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
689 sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
682 end
690 end
@@ -702,7 +710,7 class Query < ActiveRecord::Base
702 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
710 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
703 else
711 else
704 if is_custom_filter
712 if is_custom_filter
705 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) >= #{value.first.to_f}"
713 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) >= #{value.first.to_f})"
706 else
714 else
707 sql = "#{db_table}.#{db_field} >= #{value.first.to_f}"
715 sql = "#{db_table}.#{db_field} >= #{value.first.to_f}"
708 end
716 end
@@ -712,7 +720,7 class Query < ActiveRecord::Base
712 sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
720 sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
713 else
721 else
714 if is_custom_filter
722 if is_custom_filter
715 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) <= #{value.first.to_f}"
723 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) <= #{value.first.to_f})"
716 else
724 else
717 sql = "#{db_table}.#{db_field} <= #{value.first.to_f}"
725 sql = "#{db_table}.#{db_field} <= #{value.first.to_f}"
718 end
726 end
@@ -722,7 +730,7 class Query < ActiveRecord::Base
722 sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
730 sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
723 else
731 else
724 if is_custom_filter
732 if is_custom_filter
725 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
733 sql = "(#{db_table}.#{db_field} <> '' AND CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value[0].to_f} AND #{value[1].to_f})"
726 else
734 else
727 sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
735 sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
728 end
736 end
@@ -147,6 +147,32 class QueryTest < ActiveSupport::TestCase
147 assert_equal 2, issues.first.id
147 assert_equal 2, issues.first.id
148 end
148 end
149
149
150 def test_operator_is_on_integer_custom_field
151 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true)
152 CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7')
153 CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12')
154 CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '')
155
156 query = Query.new(:name => '_')
157 query.add_filter("cf_#{f.id}", '=', ['12'])
158 issues = find_issues_with_query(query)
159 assert_equal 1, issues.size
160 assert_equal 2, issues.first.id
161 end
162
163 def test_operator_is_on_float_custom_field
164 f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true)
165 CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3')
166 CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12.7')
167 CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '')
168
169 query = Query.new(:name => '_')
170 query.add_filter("cf_#{f.id}", '=', ['12.7'])
171 issues = find_issues_with_query(query)
172 assert_equal 1, issues.size
173 assert_equal 2, issues.first.id
174 end
175
150 def test_operator_greater_than
176 def test_operator_greater_than
151 query = Query.new(:project => Project.find(1), :name => '_')
177 query = Query.new(:project => Project.find(1), :name => '_')
152 query.add_filter('done_ratio', '>=', ['40'])
178 query.add_filter('done_ratio', '>=', ['40'])
@@ -161,12 +187,17 class QueryTest < ActiveSupport::TestCase
161 find_issues_with_query(query)
187 find_issues_with_query(query)
162 end
188 end
163
189
164 def test_operator_greater_than_on_custom_field
190 def test_operator_greater_than_on_int_custom_field
165 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
191 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
192 CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7')
193 CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12')
194 CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '')
195
166 query = Query.new(:project => Project.find(1), :name => '_')
196 query = Query.new(:project => Project.find(1), :name => '_')
167 query.add_filter("cf_#{f.id}", '>=', ['40'])
197 query.add_filter("cf_#{f.id}", '>=', ['8'])
168 assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) >= 40.0")
198 issues = find_issues_with_query(query)
169 find_issues_with_query(query)
199 assert_equal 1, issues.size
200 assert_equal 2, issues.first.id
170 end
201 end
171
202
172 def test_operator_lesser_than
203 def test_operator_lesser_than
General Comments 0
You need to be logged in to leave comments. Login now