diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 9e1e1c432..aae125a90 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -659,9 +659,18 @@ class IssueQuery < Query "1=0" end when "~" - root_id, lft, rgt = Issue.where(:id => value.first.to_i).pick(:root_id, :lft, :rgt) - if root_id && lft && rgt - "#{Issue.table_name}.root_id = #{root_id} AND #{Issue.table_name}.lft > #{lft} AND #{Issue.table_name}.rgt < #{rgt}" + ids = value.first.to_s.scan(/\d+/).map(&:to_i).uniq + conditions = ids.filter_map do |id| + root_id, lft, rgt = Issue.where(id: id).pick(:root_id, :lft, :rgt) + if root_id && lft && rgt + "(#{Issue.table_name}.root_id = #{root_id} AND #{Issue.table_name}.lft > #{lft} AND #{Issue.table_name}.rgt < #{rgt})" + else + nil + end + end + + if conditions.any? + "(#{conditions.join(' OR ')})" else "1=0" end diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index f6db2aeea..83905126e 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -1819,6 +1819,31 @@ class QueryTest < ActiveSupport::TestCase assert_equal [], find_issues_with_query(query) end + def test_operator_contains_on_parent_id_should_accept_comma_separated_values + parent1 = Issue.generate! + children_of_parent1 = [ + Issue.generate!(parent_id: parent1.id), + Issue.generate!(parent_id: parent1.id) + ] + parent2 = Issue.generate! + children_of_parent2 = [ + Issue.generate!(parent_id: parent2.id), + Issue.generate!(parent_id: parent2.id) + ] + grandchild_of_parent2 = [ + Issue.generate!(parent_id: children_for_parent2.first.id) + ] + + query = IssueQuery.new(name: '_') + query.add_filter('parent_id', '~', ["#{parent1.id},#{parent2.id}"]) + issues = find_issues_with_query(query) + + expected = + children_of_parent1 + children_of_parent2 + grandchild_of_parent2 + assert_equal expected.size, issues.size + assert_equal expected.map(&:id).sort, issues.map(&:id).sort + end + def test_filter_on_child Issue.delete_all parent = Issue.generate_with_descendants!