提交 844106ef 编写于 作者: R Ryuta Kamizono

`merge` doesn't allow to overwrite partially matching nodes

This makes `merge rewhere: true` follow the original `merge`'s behavior.
上级 817389d1
......@@ -101,13 +101,12 @@ def contradiction?
end
def extract_attributes
attrs = []
predicates.each do |node|
Arel.fetch_attribute(node) { |attr| attrs << attr } || begin
attrs << node.left if node.equality? && node.left.is_a?(Arel::Predications)
predicates.each_with_object([]) do |node, attrs|
attr = extract_attribute(node) || begin
node.left if node.equality? && node.left.is_a?(Arel::Predications)
end
attrs << attr if attr
end
attrs
end
protected
......@@ -121,6 +120,15 @@ def referenced_columns
end
private
def extract_attribute(node)
attr_node = nil
Arel.fetch_attribute(node) do |attr|
return if attr_node&.!= attr # all attr nodes should be the same
attr_node = attr
end
attr_node
end
def equalities(predicates)
equalities = []
......
......@@ -36,6 +36,11 @@ def test_merge_in_clause
assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
assert_equal [david], david_and_mary.merge(david_and_bob)
assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
end
def test_merge_between_clause
......@@ -61,6 +66,11 @@ def test_merge_between_clause
assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
assert_equal [david], david_and_mary.merge(david_and_bob)
assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
end
def test_merge_or_clause
......@@ -86,6 +96,11 @@ def test_merge_or_clause
assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
assert_equal [david], david_and_mary.merge(david_and_bob)
assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
end
def test_merge_not_in_clause
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册