From d75e865d08e204b1d241fcac70af0175cc8d5348 Mon Sep 17 00:00:00 2001 From: Ko Nagase Date: Sat, 25 Feb 2023 06:13:29 +0000 Subject: Patch for 2023-02-25-issue-relation-filter --- app/models/issue_query.rb | 3 ++- test/unit/query_test.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index eb7684cc2..9f541cc54 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -723,6 +723,7 @@ class IssueQuery < Query relation_type = relation_options[:reverse] || relation_type join_column, target_join_column = target_join_column, join_column end + ids = value.first.to_s.scan(/\d+/).map(&:to_i).uniq sql = case operator when "*", "!*" @@ -739,7 +740,7 @@ class IssueQuery < Query " FROM #{IssueRelation.table_name}" \ " WHERE #{IssueRelation.table_name}.relation_type =" \ " '#{self.class.connection.quote_string(relation_type)}'" \ - " AND #{IssueRelation.table_name}.#{target_join_column} = #{value.first.to_i})" + " AND #{IssueRelation.table_name}.#{target_join_column} IN (#{ids.join(",")}))" when "=p", "=!p", "!p" op = (operator == "!p" ? 'NOT IN' : 'IN') comp = (operator == "=!p" ? '<>' : '=') diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index c2cbf6fee..b41aa507c 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -1337,9 +1337,17 @@ class QueryTest < ActiveSupport::TestCase query.filters = {"relates" => {:operator => '=', :values => ['2']}} assert_equal [1], find_issues_with_query(query).map(&:id).sort + query = IssueQuery.new(:name => '_') + query.filters = {"relates" => {:operator => '=', :values => ['1,2']}} + assert_equal [1, 2, 3], find_issues_with_query(query).map(&:id).sort + query = IssueQuery.new(:name => '_') query.filters = {"relates" => {:operator => '!', :values => ['1']}} assert_equal Issue.where.not(:id => [2, 3]).order(:id).ids, find_issues_with_query(query).map(&:id).sort + + query = IssueQuery.new(:name => '_') + query.filters = {"relates" => {:operator => '!', :values => ['1,2']}} + assert_equal Issue.where.not(:id => [1, 2, 3]).order(:id).ids, find_issues_with_query(query).map(&:id).sort end def test_filter_on_relations_with_any_issues_in_a_project -- 2.39.2