|
|
@@ -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 ||= {} |
|
|
|
|