Refactor: Extracted new method Query#sql_for_field from Query#statement in
order to clean up Query#statement. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2090 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
996b2a5c1d
commit
ea77929d62
|
@ -309,51 +309,8 @@ class Query < ActiveRecord::Base
|
|||
v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
|
||||
end
|
||||
|
||||
case operator_for field
|
||||
when "="
|
||||
sql = sql + "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
||||
when "!"
|
||||
sql = sql + "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
|
||||
when "!*"
|
||||
sql = sql + "#{db_table}.#{db_field} IS NULL"
|
||||
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
|
||||
when "*"
|
||||
sql = sql + "#{db_table}.#{db_field} IS NOT NULL"
|
||||
sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
|
||||
when ">="
|
||||
sql = sql + "#{db_table}.#{db_field} >= #{v.first.to_i}"
|
||||
when "<="
|
||||
sql = sql + "#{db_table}.#{db_field} <= #{v.first.to_i}"
|
||||
when "o"
|
||||
sql = sql + "#{IssueStatus.table_name}.is_closed=#{connection.quoted_false}" if field == "status_id"
|
||||
when "c"
|
||||
sql = sql + "#{IssueStatus.table_name}.is_closed=#{connection.quoted_true}" if field == "status_id"
|
||||
when ">t-"
|
||||
sql = sql + date_range_clause(db_table, db_field, - v.first.to_i, 0)
|
||||
when "<t-"
|
||||
sql = sql + date_range_clause(db_table, db_field, nil, - v.first.to_i)
|
||||
when "t-"
|
||||
sql = sql + date_range_clause(db_table, db_field, - v.first.to_i, - v.first.to_i)
|
||||
when ">t+"
|
||||
sql = sql + date_range_clause(db_table, db_field, v.first.to_i, nil)
|
||||
when "<t+"
|
||||
sql = sql + date_range_clause(db_table, db_field, 0, v.first.to_i)
|
||||
when "t+"
|
||||
sql = sql + date_range_clause(db_table, db_field, v.first.to_i, v.first.to_i)
|
||||
when "t"
|
||||
sql = sql + date_range_clause(db_table, db_field, 0, 0)
|
||||
when "w"
|
||||
from = l(:general_first_day_of_week) == '7' ?
|
||||
# week starts on sunday
|
||||
((Date.today.cwday == 7) ? Time.now.at_beginning_of_day : Time.now.at_beginning_of_week - 1.day) :
|
||||
# week starts on monday (Rails default)
|
||||
Time.now.at_beginning_of_week
|
||||
sql = sql + "#{db_table}.#{db_field} BETWEEN '%s' AND '%s'" % [connection.quoted_date(from), connection.quoted_date(from + 7.days)]
|
||||
when "~"
|
||||
sql = sql + "#{db_table}.#{db_field} LIKE '%#{connection.quote_string(v.first)}%'"
|
||||
when "!~"
|
||||
sql = sql + "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(v.first)}%'"
|
||||
end
|
||||
sql = sql + sql_for_field(field, v, db_table, db_field, is_custom_filter)
|
||||
|
||||
sql << ')'
|
||||
filters_clauses << sql
|
||||
end if filters and valid?
|
||||
|
@ -363,6 +320,58 @@ class Query < ActiveRecord::Base
|
|||
|
||||
private
|
||||
|
||||
# Helper method to generate the WHERE sql for a +field+ with a value (+v+)
|
||||
def sql_for_field(field, v, db_table, db_field, is_custom_filter)
|
||||
sql = ''
|
||||
case operator_for field
|
||||
when "="
|
||||
return "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
|
||||
when "!"
|
||||
return "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
|
||||
when "!*"
|
||||
sql = "#{db_table}.#{db_field} IS NULL"
|
||||
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
|
||||
return sql
|
||||
when "*"
|
||||
sql = "#{db_table}.#{db_field} IS NOT NULL"
|
||||
sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter
|
||||
return sql
|
||||
when ">="
|
||||
return "#{db_table}.#{db_field} >= #{v.first.to_i}"
|
||||
when "<="
|
||||
return "#{db_table}.#{db_field} <= #{v.first.to_i}"
|
||||
when "o"
|
||||
return "#{IssueStatus.table_name}.is_closed=#{connection.quoted_false}" if field == "status_id"
|
||||
when "c"
|
||||
return "#{IssueStatus.table_name}.is_closed=#{connection.quoted_true}" if field == "status_id"
|
||||
when ">t-"
|
||||
return date_range_clause(db_table, db_field, - v.first.to_i, 0)
|
||||
when "<t-"
|
||||
return date_range_clause(db_table, db_field, nil, - v.first.to_i)
|
||||
when "t-"
|
||||
return date_range_clause(db_table, db_field, - v.first.to_i, - v.first.to_i)
|
||||
when ">t+"
|
||||
return date_range_clause(db_table, db_field, v.first.to_i, nil)
|
||||
when "<t+"
|
||||
return date_range_clause(db_table, db_field, 0, v.first.to_i)
|
||||
when "t+"
|
||||
return date_range_clause(db_table, db_field, v.first.to_i, v.first.to_i)
|
||||
when "t"
|
||||
return date_range_clause(db_table, db_field, 0, 0)
|
||||
when "w"
|
||||
from = l(:general_first_day_of_week) == '7' ?
|
||||
# week starts on sunday
|
||||
((Date.today.cwday == 7) ? Time.now.at_beginning_of_day : Time.now.at_beginning_of_week - 1.day) :
|
||||
# week starts on monday (Rails default)
|
||||
Time.now.at_beginning_of_week
|
||||
return "#{db_table}.#{db_field} BETWEEN '%s' AND '%s'" % [connection.quoted_date(from), connection.quoted_date(from + 7.days)]
|
||||
when "~"
|
||||
return "#{db_table}.#{db_field} LIKE '%#{connection.quote_string(v.first)}%'"
|
||||
when "!~"
|
||||
return "#{db_table}.#{db_field} NOT LIKE '%#{connection.quote_string(v.first)}%'"
|
||||
end
|
||||
end
|
||||
|
||||
def add_custom_fields_filters(custom_fields)
|
||||
@available_filters ||= {}
|
||||
|
||||
|
|
Loading…
Reference in New Issue