-
-
Notifications
You must be signed in to change notification settings - Fork 448
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
Allow queries to be "explained" in WebProfilerBundle #7
Comments
I really like the idea. This will require some refactoring of the data collector (and of course the displaying in the webprofiler). I will work on it this weekend. |
Related to symfony/symfony#2930 |
@Tobion It is a totally different thing. When explaining the query, I will never replace the parameters by hand. I will simply let PDO bind them when running the EXPLAIN query. |
I see, so you also want to provide a UI for the EXPLAIN result. |
This cannot be implemented currently. Btw, the feature request linked by @Tobion cannot be implemented either for the same reason |
I think it should be changed in that the DBAL logger only logs the database values. The PHP values are not usefull in this case. |
@beberlei what do you think about it ? |
@stof I'm ok with this change, specially because this currently means Logger is unusable to log, so against its concept. Even though, this change may be considered as a BC break, it sounds like a bug to me (because what is logged is not actually the query executed neither the parameters are the correct ones) |
@guilhermeblanco anyway, to be able to use such change in the DBAL logger for Symfony 2.1, we need to have this change in Doctrine 2.2. Is it too late already ? |
@stof I am +1, but i cant yet see how it works in the code. Happily awaiting a PR. Will merge this into 2.2 |
Commits ------- e37783f [DoctrineBridge] Refactored the query sanitization in the collector 3b260d2 Refactored the collector to separate the loggers per connection Discussion ---------- Doctrine collector Bug fix: no Feature addition: yes Backwards compatibility break: yes (for the end user, it will require deleting old profiler data) Symfony2 tests pass: yes ![Build Status](https://secure.travis-ci.org/stof/symfony.png?branch=doctrine_collector) This refactors the Doctrine collector to allow implementing doctrine/DoctrineBundle#7 The first commit splits the logging of queries per connection to be able to know which connection was used instead of using a shared stack. The second commit refactors the sanitation of the parameters to apply the DBAL conversion and then keep the param whenever possible (i.e. when we are sure it is serializable). Such queries will then be explainable in the profiler as we will be able to use the parameters again. Due to the way PDO works, the only cases where we would get an unexplainable queries due to the parameters are queries using a LOB parameter (as it is a resource) or broken queries (passing an object to PDO for instance). And this second case does not make sense to explain the query of course. --------------------------------------------------------------------------- by stof at 2012-01-23T12:32:16Z Merging this PR should be synchronized with the DoctrineBundle PR due to the BC break in the collector
Implemented by #12 |
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Hi,
Currently it's possible to view the queries execute and parameters used.
It would be awesome if we also add a link close the query allowing to execute the EXPLAIN command, so people could also optimize Indexes if necessary.
Cheers,
Guilherme Blanco
The text was updated successfully, but these errors were encountered: