--- query.rb 2009-07-05 02:03:34.000000000 +0200 +++ app/models/query.rb 2009-07-05 03:12:46.000000000 +0200 @@ -163,6 +163,7 @@ class Query < ActiveRecord::Base user_values += User.current.projects.collect(&:users).flatten.uniq.sort.collect{|s| [s.name, s.id.to_s] } end @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty? + @available_filters["ever_assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty? @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty? if project @@ -297,12 +298,20 @@ class Query < ActiveRecord::Base sql = '' is_custom_filter = false + has_double_field = false if field =~ /^cf_(\d+)$/ # custom field db_table = CustomValue.table_name db_field = 'value' is_custom_filter = true sql << "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} WHERE " + elsif field == "ever_assigned_to_id" + db_table = JournalDetail.table_name + db_field = 'old_value' + db_field2 = 'value' + is_custom_filter = true + has_double_field = true + sql << "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{Journal.table_name} ON #{Journal.table_name}.journalized_type='Issue' AND #{Journal.table_name}.journalized_id=#{Issue.table_name}.id LEFT OUTER JOIN #{JournalDetail.table_name} ON #{JournalDetail.table_name}.journal_id=#{Journal.table_name}.id AND #{JournalDetail.table_name}.prop_key='assigned_to_id' WHERE " else # regular field db_table = Issue.table_name @@ -311,13 +320,15 @@ class Query < ActiveRecord::Base end # "me" value subsitution - if %w(assigned_to_id author_id).include?(field) + if %w(assigned_to_id author_id).include?(field) or %w(ever_assigned_to_id author_id).include?(field) v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me") end case operator_for field when "=" + sql << "(" if has_double_field sql = sql + "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" + sql << " OR #{db_table}.#{db_field2} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))" if has_double_field 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 "!*"