Improve performance of financial ACL where clause #31976
+15
−18
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.
Overview
This replaces the
NOT IN
check with aNOT EXISTS
check in the financial ACL where clause. This massively improves the performance. Before it was more or less unusable with many records.Technical Details
The implementation results in a clause like this:
The first
`a`.`id`
is obviously superfluous, but doesn't really hurt. With$clauses[''][] = 'AND NOT EXISTS ...
the result would be an invalid clause:`a`.`` AND NOT EXISTS ...
Edit: The call of
in
\CRM_Utils_SQL::mergeSubquery()
always resulted in$fieldClause === $formattedClause
because$fieldClause
is passed as reference. Thus, this had to be fixed, too, because of this calls:civicrm-core/CRM/Contribute/BAO/ContributionSoft.php
Line 684 in 9b4e2a6
civicrm-core/CRM/Price/BAO/LineItem.php
Line 1219 in 9b4e2a6