]> source.dussan.org Git - redmine.git/commitdiff
Extend "contains" operator in "Parent task" filter to support multiple issue IDs...
authorGo MAEDA <maeda@farend.jp>
Fri, 29 Dec 2023 08:24:43 +0000 (08:24 +0000)
committerGo MAEDA <maeda@farend.jp>
Fri, 29 Dec 2023 08:24:43 +0000 (08:24 +0000)
Patch by Go MAEDA (@maeda).

git-svn-id: https://svn.redmine.org/redmine/trunk@22577 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue_query.rb
test/unit/query_test.rb

index b18117cc92385ae5a9a4478aad9bc1ab678dd40d..21552dfd6c73233a5a9b2cead3f922f102810ec2 100644 (file)
@@ -662,9 +662,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
index a630f75d89c2d8719939f8cb8df488dffdfc561d..a1c528e26f1c0c344caa40bddfb7da2d1ddb398c 100644 (file)
@@ -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_of_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!