Fixes "=" filter on float values.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@6256 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
06be9ebac4
commit
73236e5b41
@ -123,8 +123,8 @@ class Query < ActiveRecord::Base
|
|||||||
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w" ],
|
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w" ],
|
||||||
:string => [ "=", "~", "!", "!~" ],
|
:string => [ "=", "~", "!", "!~" ],
|
||||||
:text => [ "~", "!~" ],
|
:text => [ "~", "!~" ],
|
||||||
# TODO: should be :numeric
|
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
|
||||||
:integer => [ "=", ">=", "<=", "><", "!*", "*" ] }
|
:float => [ "=", ">=", "<=", "><", "!*", "*" ] }
|
||||||
|
|
||||||
cattr_reader :operators_by_filter_type
|
cattr_reader :operators_by_filter_type
|
||||||
|
|
||||||
@ -170,8 +170,13 @@ class Query < ActiveRecord::Base
|
|||||||
|
|
||||||
def validate
|
def validate
|
||||||
filters.each_key do |field|
|
filters.each_key do |field|
|
||||||
if type_for(field) == :integer && values_for(field)
|
if values_for(field)
|
||||||
errors.add label_for(field), :invalid if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d+)?$/) }
|
case type_for(field)
|
||||||
|
when :integer
|
||||||
|
errors.add(label_for(field), :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) }
|
||||||
|
when :float
|
||||||
|
errors.add(label_for(field), :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d*)?$/) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
errors.add label_for(field), :blank unless
|
errors.add label_for(field), :blank unless
|
||||||
@ -208,7 +213,7 @@ class Query < ActiveRecord::Base
|
|||||||
"updated_on" => { :type => :date_past, :order => 10 },
|
"updated_on" => { :type => :date_past, :order => 10 },
|
||||||
"start_date" => { :type => :date, :order => 11 },
|
"start_date" => { :type => :date, :order => 11 },
|
||||||
"due_date" => { :type => :date, :order => 12 },
|
"due_date" => { :type => :date, :order => 12 },
|
||||||
"estimated_hours" => { :type => :integer, :order => 13 },
|
"estimated_hours" => { :type => :float, :order => 13 },
|
||||||
"done_ratio" => { :type => :integer, :order => 14 }}
|
"done_ratio" => { :type => :integer, :order => 14 }}
|
||||||
|
|
||||||
user_values = []
|
user_values = []
|
||||||
@ -610,15 +615,20 @@ class Query < ActiveRecord::Base
|
|||||||
sql = ''
|
sql = ''
|
||||||
case operator
|
case operator
|
||||||
when "="
|
when "="
|
||||||
if [:date, :date_past].include?(type_for(field))
|
if value.any?
|
||||||
sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil))
|
case type_for(field)
|
||||||
else
|
when :date, :date_past
|
||||||
if value.any?
|
sql = date_clause(db_table, db_field, (Date.parse(value.first) rescue nil), (Date.parse(value.first) rescue nil))
|
||||||
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
when :integer
|
||||||
|
sql = "#{db_table}.#{db_field} = #{value.first.to_i}"
|
||||||
|
when :float
|
||||||
|
sql = "#{db_table}.#{db_field} BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5}"
|
||||||
else
|
else
|
||||||
# IN an empty set
|
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
||||||
sql = "1=0"
|
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
# IN an empty set
|
||||||
|
sql = "1=0"
|
||||||
end
|
end
|
||||||
when "!"
|
when "!"
|
||||||
if value.any?
|
if value.any?
|
||||||
@ -710,8 +720,10 @@ class Query < ActiveRecord::Base
|
|||||||
options = { :type => :date, :order => 20 }
|
options = { :type => :date, :order => 20 }
|
||||||
when "bool"
|
when "bool"
|
||||||
options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 }
|
options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 }
|
||||||
when "int", "float"
|
when "int"
|
||||||
options = { :type => :integer, :order => 20 }
|
options = { :type => :integer, :order => 20 }
|
||||||
|
when "float",
|
||||||
|
options = { :type => :float, :order => 20 }
|
||||||
when "user", "version"
|
when "user", "version"
|
||||||
next unless project
|
next unless project
|
||||||
options = { :type => :list_optional, :values => field.possible_values_options(project), :order => 20}
|
options = { :type => :list_optional, :values => field.possible_values_options(project), :order => 20}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user