@@ -674,9 +674,17 class Query < ActiveRecord::Base | |||
|
674 | 674 | when :date, :date_past |
|
675 | 675 | sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil)) |
|
676 | 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 | 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 | 688 | else |
|
681 | 689 | sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" |
|
682 | 690 | end |
@@ -702,7 +710,7 class Query < ActiveRecord::Base | |||
|
702 | 710 | sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), nil) |
|
703 | 711 | else |
|
704 | 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 | 714 | else |
|
707 | 715 | sql = "#{db_table}.#{db_field} >= #{value.first.to_f}" |
|
708 | 716 | end |
@@ -712,7 +720,7 class Query < ActiveRecord::Base | |||
|
712 | 720 | sql = date_clause(db_table, db_field, nil, (Date.parse(value.first) rescue nil)) |
|
713 | 721 | else |
|
714 | 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 | 724 | else |
|
717 | 725 | sql = "#{db_table}.#{db_field} <= #{value.first.to_f}" |
|
718 | 726 | end |
@@ -722,7 +730,7 class Query < ActiveRecord::Base | |||
|
722 | 730 | sql = date_clause(db_table, db_field, (Date.parse(value[0]) rescue nil), (Date.parse(value[1]) rescue nil)) |
|
723 | 731 | else |
|
724 | 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 | 734 | else |
|
727 | 735 | sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}" |
|
728 | 736 | end |
@@ -147,6 +147,32 class QueryTest < ActiveSupport::TestCase | |||
|
147 | 147 | assert_equal 2, issues.first.id |
|
148 | 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 | 176 | def test_operator_greater_than |
|
151 | 177 | query = Query.new(:project => Project.find(1), :name => '_') |
|
152 | 178 | query.add_filter('done_ratio', '>=', ['40']) |
@@ -161,12 +187,17 class QueryTest < ActiveSupport::TestCase | |||
|
161 | 187 | find_issues_with_query(query) |
|
162 | 188 | end |
|
163 | 189 | |
|
164 | def test_operator_greater_than_on_custom_field | |
|
190 | def test_operator_greater_than_on_int_custom_field | |
|
165 | 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 | 196 | query = Query.new(:project => Project.find(1), :name => '_') |
|
167 |
query.add_filter("cf_#{f.id}", '>=', [' |
|
|
168 | assert query.statement.include?("CAST(custom_values.value AS decimal(60,3)) >= 40.0") | |
|
169 | find_issues_with_query(query) | |
|
197 | query.add_filter("cf_#{f.id}", '>=', ['8']) | |
|
198 | issues = find_issues_with_query(query) | |
|
199 | assert_equal 1, issues.size | |
|
200 | assert_equal 2, issues.first.id | |
|
170 | 201 | end |
|
171 | 202 | |
|
172 | 203 | def test_operator_lesser_than |
General Comments 0
You need to be logged in to leave comments.
Login now