Index: app/models/query.rb =================================================================== --- app/models/query.rb (revision 1694) +++ app/models/query.rb (working copy) @@ -88,7 +88,7 @@ :date_past => [ ">t-", " [ "=", "~", "!", "!~" ], :text => [ "~", "!~" ], - :integer => [ "=", ">=", "<=" ] } + :integer => [ "=", ">=", "<=", "!*" ] } cattr_reader :operators_by_filter_type @@ -152,7 +152,8 @@ "updated_on" => { :type => :date_past, :order => 10 }, "start_date" => { :type => :date, :order => 11 }, "due_date" => { :type => :date, :order => 12 }, - "done_ratio" => { :type => :integer, :order => 13 }} + "estimated_hours" => { :type => :date, :order => 13 }, + "done_ratio" => { :type => :integer, :order => 14 }} user_values = [] user_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? Index: test/unit/query_test.rb =================================================================== --- test/unit/query_test.rb (revision 1694) +++ test/unit/query_test.rb (working copy) @@ -26,11 +26,17 @@ assert !query.available_filters.has_key?('cf_3') end + def find_issues_with_query(query) + Issue.find :all, + :include => [ :assigned_to, :status, :tracker, :project, :priority ], + :conditions => query.statement + end + def test_query_with_multiple_custom_fields query = Query.find(1) assert query.valid? assert query.statement.include?("#{CustomValue.table_name}.value IN ('MySQL')") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + issues = find_issues_with_query(query) assert_equal 1, issues.length assert_equal Issue.find(3), issues.first end @@ -41,72 +47,80 @@ query.add_filter('cf_1', '!*', ['']) assert query.statement.include?("#{Issue.table_name}.fixed_version_id IS NULL") assert query.statement.include?("#{CustomValue.table_name}.value IS NULL OR #{CustomValue.table_name}.value = ''") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end + def test_operator_none_for_integer + query = Query.new(:project => Project.find(1), :name => '_') + query.add_filter('estimated_hours', '!*', ['']) + issues = find_issues_with_query(query) + assert !issues.empty? + assert issues.all? {|i| !i.estimated_hours} + end + def test_operator_all query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('fixed_version_id', '*', ['']) query.add_filter('cf_1', '*', ['']) assert query.statement.include?("#{Issue.table_name}.fixed_version_id IS NOT NULL") assert query.statement.include?("#{CustomValue.table_name}.value IS NOT NULL AND #{CustomValue.table_name}.value <> ''") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_greater_than query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('done_ratio', '>=', ['40']) assert query.statement.include?("#{Issue.table_name}.done_ratio >= 40") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_in_more_than query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('due_date', '>t+', ['15']) assert query.statement.include?("#{Issue.table_name}.due_date >=") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_in_less_than query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('due_date', ' [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_today query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('due_date', 't', ['']) assert query.statement.include?("#{Issue.table_name}.due_date BETWEEN") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_this_week_on_date query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('due_date', 'w', ['']) assert query.statement.include?("#{Issue.table_name}.due_date BETWEEN") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_this_week_on_datetime query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('created_on', 'w', ['']) assert query.statement.include?("#{Issue.table_name}.created_on BETWEEN") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_contains query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('subject', '~', ['string']) assert query.statement.include?("#{Issue.table_name}.subject LIKE '%string%'") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_operator_does_not_contains query = Query.new(:project => Project.find(1), :name => '_') query.add_filter('subject', '!~', ['string']) assert query.statement.include?("#{Issue.table_name}.subject NOT LIKE '%string%'") - issues = Issue.find :all,:include => [ :assigned_to, :status, :tracker, :project, :priority ], :conditions => query.statement + find_issues_with_query(query) end def test_default_columns