##// END OF EJS Templates
Fixes filters on float values....
Jean-Philippe Lang -
r6107:bf15b06d98a8
parent child
Show More
@@ -123,6 +123,7 class Query < ActiveRecord::Base
123 123 :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w" ],
124 124 :string => [ "=", "~", "!", "!~" ],
125 125 :text => [ "~", "!~" ],
126 # TODO: should be :numeric
126 127 :integer => [ "=", ">=", "<=", "><", "!*", "*" ] }
127 128
128 129 cattr_reader :operators_by_filter_type
@@ -633,9 +634,9 class Query < ActiveRecord::Base
633 634 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
634 635 else
635 636 if is_custom_filter
636 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) >= #{value.first.to_i}"
637 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) >= #{value.first.to_f}"
637 638 else
638 sql = "#{db_table}.#{db_field} >= #{value.first.to_i}"
639 sql = "#{db_table}.#{db_field} >= #{value.first.to_f}"
639 640 end
640 641 end
641 642 when "<="
@@ -643,9 +644,9 class Query < ActiveRecord::Base
643 644 sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
644 645 else
645 646 if is_custom_filter
646 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) <= #{value.first.to_i}"
647 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) <= #{value.first.to_f}"
647 648 else
648 sql = "#{db_table}.#{db_field} <= #{value.first.to_i}"
649 sql = "#{db_table}.#{db_field} <= #{value.first.to_f}"
649 650 end
650 651 end
651 652 when "><"
@@ -653,9 +654,9 class Query < ActiveRecord::Base
653 654 sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
654 655 else
655 656 if is_custom_filter
656 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value[0].to_i} AND #{value[1].to_i}"
657 sql = "CAST(#{db_table}.#{db_field} AS decimal(60,3)) BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
657 658 else
658 sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_i} AND #{value[1].to_i}"
659 sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}"
659 660 end
660 661 end
661 662 when "o"
@@ -101,10 +101,27 class QueryTest < ActiveSupport::TestCase
101 101 find_issues_with_query(query)
102 102 end
103 103
104 def test_operator_is_on_float
105 Issue.update_all("estimated_hours = 171.2", "id=2")
106
107 query = Query.new(:name => '_')
108 query.add_filter('estimated_hours', '=', ['171.20'])
109 issues = find_issues_with_query(query)
110 assert_equal 1, issues.size
111 assert_equal 2, issues.first.id
112 end
113
104 114 def test_operator_greater_than
105 115 query = Query.new(:project => Project.find(1), :name => '_')
106 116 query.add_filter('done_ratio', '>=', ['40'])
107 assert query.statement.include?("#{Issue.table_name}.done_ratio >= 40")
117 assert query.statement.include?("#{Issue.table_name}.done_ratio >= 40.0")
118 find_issues_with_query(query)
119 end
120
121 def test_operator_greater_than_a_float
122 query = Query.new(:project => Project.find(1), :name => '_')
123 query.add_filter('estimated_hours', '>=', ['40.5'])
124 assert query.statement.include?("#{Issue.table_name}.estimated_hours >= 40.5")
108 125 find_issues_with_query(query)
109 126 end
110 127
@@ -112,14 +129,14 class QueryTest < ActiveSupport::TestCase
112 129 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
113 130 query = Query.new(:project => Project.find(1), :name => '_')
114 131 query.add_filter("cf_#{f.id}", '>=', ['40'])
115 assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) >= 40")
132 assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) >= 40.0")
116 133 find_issues_with_query(query)
117 134 end
118 135
119 136 def test_operator_lesser_than
120 137 query = Query.new(:project => Project.find(1), :name => '_')
121 138 query.add_filter('done_ratio', '<=', ['30'])
122 assert query.statement.include?("#{Issue.table_name}.done_ratio <= 30")
139 assert query.statement.include?("#{Issue.table_name}.done_ratio <= 30.0")
123 140 find_issues_with_query(query)
124 141 end
125 142
@@ -127,14 +144,14 class QueryTest < ActiveSupport::TestCase
127 144 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
128 145 query = Query.new(:project => Project.find(1), :name => '_')
129 146 query.add_filter("cf_#{f.id}", '<=', ['30'])
130 assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) <= 30")
147 assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) <= 30.0")
131 148 find_issues_with_query(query)
132 149 end
133 150
134 151 def test_operator_between
135 152 query = Query.new(:project => Project.find(1), :name => '_')
136 153 query.add_filter('done_ratio', '><', ['30', '40'])
137 assert_include "#{Issue.table_name}.done_ratio BETWEEN 30 AND 40", query.statement
154 assert_include "#{Issue.table_name}.done_ratio BETWEEN 30.0 AND 40.0", query.statement
138 155 find_issues_with_query(query)
139 156 end
140 157
@@ -142,7 +159,7 class QueryTest < ActiveSupport::TestCase
142 159 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
143 160 query = Query.new(:project => Project.find(1), :name => '_')
144 161 query.add_filter("cf_#{f.id}", '><', ['30', '40'])
145 assert_include "CAST(custom_values.value AS decimal(60,3)) BETWEEN 30 AND 40", query.statement
162 assert_include "CAST(custom_values.value AS decimal(60,3)) BETWEEN 30.0 AND 40.0", query.statement
146 163 find_issues_with_query(query)
147 164 end
148 165
General Comments 0
You need to be logged in to leave comments. Login now