##// 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 :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w" ],
123 :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w" ],
124 :string => [ "=", "~", "!", "!~" ],
124 :string => [ "=", "~", "!", "!~" ],
125 :text => [ "~", "!~" ],
125 :text => [ "~", "!~" ],
126 # TODO: should be :numeric
126 :integer => [ "=", ">=", "<=", "><", "!*", "*" ] }
127 :integer => [ "=", ">=", "<=", "><", "!*", "*" ] }
127
128
128 cattr_reader :operators_by_filter_type
129 cattr_reader :operators_by_filter_type
@@ -633,9 +634,9 class Query < ActiveRecord::Base
633 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
634 sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil)
634 else
635 else
635 if is_custom_filter
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 else
638 else
638 sql = "#{db_table}.#{db_field} >= #{value.first.to_i}"
639 sql = "#{db_table}.#{db_field} >= #{value.first.to_f}"
639 end
640 end
640 end
641 end
641 when "<="
642 when "<="
@@ -643,9 +644,9 class Query < ActiveRecord::Base
643 sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
644 sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil))
644 else
645 else
645 if is_custom_filter
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 else
648 else
648 sql = "#{db_table}.#{db_field} <= #{value.first.to_i}"
649 sql = "#{db_table}.#{db_field} <= #{value.first.to_f}"
649 end
650 end
650 end
651 end
651 when "><"
652 when "><"
@@ -653,9 +654,9 class Query < ActiveRecord::Base
653 sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
654 sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil))
654 else
655 else
655 if is_custom_filter
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 else
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 end
660 end
660 end
661 end
661 when "o"
662 when "o"
@@ -101,10 +101,27 class QueryTest < ActiveSupport::TestCase
101 find_issues_with_query(query)
101 find_issues_with_query(query)
102 end
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 def test_operator_greater_than
114 def test_operator_greater_than
105 query = Query.new(:project => Project.find(1), :name => '_')
115 query = Query.new(:project => Project.find(1), :name => '_')
106 query.add_filter('done_ratio', '>=', ['40'])
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 find_issues_with_query(query)
125 find_issues_with_query(query)
109 end
126 end
110
127
@@ -112,14 +129,14 class QueryTest < ActiveSupport::TestCase
112 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
129 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
113 query = Query.new(:project => Project.find(1), :name => '_')
130 query = Query.new(:project => Project.find(1), :name => '_')
114 query.add_filter("cf_#{f.id}", '>=', ['40'])
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 find_issues_with_query(query)
133 find_issues_with_query(query)
117 end
134 end
118
135
119 def test_operator_lesser_than
136 def test_operator_lesser_than
120 query = Query.new(:project => Project.find(1), :name => '_')
137 query = Query.new(:project => Project.find(1), :name => '_')
121 query.add_filter('done_ratio', '<=', ['30'])
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 find_issues_with_query(query)
140 find_issues_with_query(query)
124 end
141 end
125
142
@@ -127,14 +144,14 class QueryTest < ActiveSupport::TestCase
127 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
144 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
128 query = Query.new(:project => Project.find(1), :name => '_')
145 query = Query.new(:project => Project.find(1), :name => '_')
129 query.add_filter("cf_#{f.id}", '<=', ['30'])
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 find_issues_with_query(query)
148 find_issues_with_query(query)
132 end
149 end
133
150
134 def test_operator_between
151 def test_operator_between
135 query = Query.new(:project => Project.find(1), :name => '_')
152 query = Query.new(:project => Project.find(1), :name => '_')
136 query.add_filter('done_ratio', '><', ['30', '40'])
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 find_issues_with_query(query)
155 find_issues_with_query(query)
139 end
156 end
140
157
@@ -142,7 +159,7 class QueryTest < ActiveSupport::TestCase
142 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
159 f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true)
143 query = Query.new(:project => Project.find(1), :name => '_')
160 query = Query.new(:project => Project.find(1), :name => '_')
144 query.add_filter("cf_#{f.id}", '><', ['30', '40'])
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 find_issues_with_query(query)
163 find_issues_with_query(query)
147 end
164 end
148
165
General Comments 0
You need to be logged in to leave comments. Login now