From 4d5900d90203cfd1de5bf03a263042cb0173d43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 20 Mar 2019 12:28:28 +0100 Subject: [PATCH] Fix bug in accompanying period export element --- CHANGELOG.md | 5 +++ ...bstractAccompanyingPeriodExportElement.php | 32 +++++++++++++------ .../Filter/AccompanyingPeriodFilterTest.php | 8 ++++- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7691f4393..dfac72bd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,3 +25,8 @@ Version 1.5.3 - add filtering on accompanying period - fix problems in gender filter +Version 1.5.4 +============= + +- Fix bug in accompanying period filter + diff --git a/Export/AbstractAccompanyingPeriodExportElement.php b/Export/AbstractAccompanyingPeriodExportElement.php index 9025b6aa2..c21d5733a 100644 --- a/Export/AbstractAccompanyingPeriodExportElement.php +++ b/Export/AbstractAccompanyingPeriodExportElement.php @@ -25,22 +25,34 @@ use Doctrine\ORM\QueryBuilder; */ class AbstractAccompanyingPeriodExportElement { - protected function havingAccompanyingPeriodInJoin(QueryBuilder $query) + /** + * Return true if "accompanying_period" alias is present in the query alises. + * + * @param QueryBuilder $query + * @return bool + */ + protected function havingAccompanyingPeriodInJoin(QueryBuilder $query): bool { - $joins = $query->getDQLPart('join'); + $joins = $query->getDQLPart('join') ?? []; - foreach ($joins['person'] as $join) { - if ($join->getAlias() === 'accompanying_period') { - return true; - } - } - - return false; + return (\in_array('accompanying_period', $query->getAllAliases())); } - protected function addJoinAccompanyingPeriod(QueryBuilder $query) + /** + * Add the accompanying period alias to the query + * + * @param QueryBuilder $query + * @return void + * @throws \LogicException if the "person" alias is not present and attaching accompanying period is not possible + */ + protected function addJoinAccompanyingPeriod(QueryBuilder $query): void { if (FALSE === $this->havingAccompanyingPeriodInJoin($query)) { + if (FALSE === \in_array('person', $query->getAllAliases())) { + throw new \LogicException("the alias 'person' does not exists in " + . "query builder"); + } + $query->join('person.accompanyingPeriods', 'accompanying_period'); } } diff --git a/Tests/Export/Filter/AccompanyingPeriodFilterTest.php b/Tests/Export/Filter/AccompanyingPeriodFilterTest.php index c6c0fe4de..a0f4ed1be 100644 --- a/Tests/Export/Filter/AccompanyingPeriodFilterTest.php +++ b/Tests/Export/Filter/AccompanyingPeriodFilterTest.php @@ -89,7 +89,13 @@ class AccompanyingPeriodFilterTest extends AbstractFilterTest ->from('ChillPersonBundle:Person', 'person') ->join('person.accompanyingPeriods', 'accompanying_period') // add a dummy where clause - ->where('person.firstname IS NOT NULL') + ->where('person.firstname IS NOT NULL'), + $em->createQueryBuilder() + ->select('activity.date AS date') + ->select('activity.attendee as attendee') + ->from("ChillActivityBundle:Activity", 'activity') + ->join('activity.person', 'person') + ->join('person.center', 'center') ); } }