-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Draft][Please review] Make Paginator use simpler queries when there are no sql joins used (#8278) #11595
base: 3.3.x
Are you sure you want to change the base?
[Draft][Please review] Make Paginator use simpler queries when there are no sql joins used (#8278) #11595
Conversation
…octrine#8278) This is work in progress.
…octrine#8278) This is work in progress.
Triggering a new build to address 4. , #11596 should fix it. |
…octrine#8278) This is work in progress.
Hi, While I wait for some final answers from stof to my (regrettably) wall of text, may I know your initial thoughts on my proposition to rename some instance variables in the Paginator class, please? I explained it in more details in the discussion above, but the bottom line is:
Would you say that you would initially allow for the changes described above to be made to the Paginator by me? Thanks. |
|
Co-authored-by: Christophe Coevoet <[email protected]>
…ck-of-sql-joins' into feature/paginator-auto-detect-lack-of-sql-joins
…octrine#8278) This is work in progress.
…octrine#8278) This is work in progress.
…octrine#8278) This is work in progress.
Hi all, I pushed another iteration of this PR, taking into account the feedback so far. Could you re-evaluate, please? Major points:
Thank you. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll defer to @stof regarding your question about whether this is going in the right direction.
public function __construct( | ||
Query|QueryBuilder $query, | ||
private readonly bool $fetchJoinCollection = true, | ||
private readonly bool $queryCouldProduceDuplicates = true, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The docs need to be updated at the very least because of this. Can you also read it and see if anything else needs to be modified, and whether any new behavior you are adding is worth documenting?
try { | ||
$rootClassMetadata = $entityManager->getClassMetadata($fromRoot->rangeVariableDeclaration->abstractSchemaName); | ||
$queryFeatures['rootEntityHasSingleIdentifierFieldName'] = (bool) $rootClassMetadata->getSingleIdentifierFieldName(); | ||
} catch (MappingException) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this necessary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You mean the catching of the MappingException
?
It's primarily needed because this is how ClassMetadata::getSingleIdentifierFieldName()
communicates that "the identifier is not single column". One way to avoid the try..catch
is to duplicate the if-conditions from ClassMetadata::getSingleIdentifierFieldName()
in here, but having a code duplication here would introduce a maintenance cost, which I personally consider a bigger nuisance than having a try..catch
block.
Also, EntityManager::getClassMetadata()
throws that exception class when the $className
is unrecognised. Instead of making an assumption that "there must be metadata for every class detected at this point of the code", I wanted to be more graceful and defensive, and chose to just catch the exception and assume that the "auto-detection" cannot be carried out.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We usually avoid using exception for flow control, and I think that's because they are costly.
I think I would add a dedicated method, so as to remove the need of casting the result to a boolean as well, even if it means a little duplication.
Also, EntityManager::getClassMetadata() throws that exception class when the $className is unrecognised. Instead of making an assumption that "there must be metadata for every class detected at this point of the code", I wanted to be more graceful and defensive, and chose to just catch the exception and assume that the "auto-detection" cannot be carried out.
In what case will $className
not be recognized and we wouldn't want to let the user know about that?
@@ -60,31 +268,80 @@ public function getQuery(): Query | |||
} | |||
|
|||
/** | |||
* Returns whether the query joins a collection. | |||
* @deprecated Use ::getQueryCouldProduceDuplicates() instead. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The UPGRADE.md
needs to document the deprecations.
…octrine#8278) This is work in progress.
May I ask for an initial review of the code in this PR before I move forward with it, please?
This PR implements the scope of work discussed in #8278 (comment). It only implements the "no joins used" case. It doesn't implement the "only ToOne joins used" case. I plan do implement that other case in a future PR, after this one gets reviewed and hopefully merged.
A few comments:
$fetchJoinCollection = null
). This means that there could be a long period of time before the "auto-detection of better defaults" gets enabled by default (if ever).Thank you.