@@ -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_ |
|
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_ |
|
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_ |
|
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_ |
|
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_ |
|
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_ |
|
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