"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
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!