Always keep map literal in select_merge
if keys are distinct
#4477
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously we discussed if
insert_all
can supportselect_merge
with multiple map literals when one of the inner maps has interpolations. For example:Because the inner map has an interpolation, we don't know whether it will be wiped out and our query params will be incorrect. So we turn the select expression into
merge(%{...}, %{....})
. And this merge expression doesn't work withinsert_all
due to difficulty extracting fields frommerge
.There is one condition we can be certain the interpolation won't be wiped out: when all the merges have distinct keys. In this case we can keep the map literal and it will work with
insert_all
.This would give a lot more flexibility to user. If they have dynamic keys/values they want to turn into multiple merge statements, they can always remove duplication in Elixir before going to Ecto land.
For example this:
They can ensure no duplications in
conditions
beforehand.