Simplify subquery

MAILPOET-4986
This commit is contained in:
John Oleksowicz
2023-02-27 14:58:10 -06:00
committed by Aschepikov
parent d505bffcfd
commit c747b71829

View File

@ -6,7 +6,6 @@ use MailPoet\Entities\DynamicSegmentFilterEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException; use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
use MailPoet\Util\DBCollationChecker; use MailPoet\Util\DBCollationChecker;
use MailPoet\Util\Security;
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
@ -31,40 +30,38 @@ class WooCommercePurchaseDate extends DateFilter {
$operator = $this->getOperatorFromFilter($filter); $operator = $this->getOperatorFromFilter($filter);
$dateValue = $this->getDateValueFromFilter($filter); $dateValue = $this->getDateValueFromFilter($filter);
$date = $this->getDateForOperator($operator, $dateValue); $date = $this->getDateForOperator($operator, $dateValue);
$parameterSuffix = $filter->getId() ?? Security::generateRandomString(); $subQuery = $this->getSubQuery($operator, $date);
$dateParameter = sprintf('date_%s', $parameterSuffix);
$subQuery = $this->getSubQuery($operator, $dateParameter); if (in_array($operator, [self::NOT_ON, self::NOT_IN_THE_LAST])) {
$queryBuilder->andWhere($queryBuilder->expr()->notIn("{$this->getSubscribersTable()}.id", $subQuery->getSQL()));
$isNegatedOperator = in_array($operator, [self::NOT_ON, self::NOT_IN_THE_LAST]); } else {
$subQueryOperator = $isNegatedOperator ? 'NOT IN' : 'IN'; $queryBuilder->andWhere($queryBuilder->expr()->in("{$this->getSubscribersTable()}.id", $subQuery->getSQL()));
}
$queryBuilder->andWhere("{$this->getSubscribersTable()}.id {$subQueryOperator} ({$subQuery->getSQL()})");
$queryBuilder->setParameter($dateParameter, $date);
return $queryBuilder; return $queryBuilder;
} }
private function getSubQuery(string $operator, string $dateParameter): QueryBuilder { private function getSubQuery(string $operator, string $date): QueryBuilder {
$queryBuilder = $this->getNewSubscribersQueryBuilder(); $queryBuilder = $this->getNewSubscribersQueryBuilder();
$this->applyCustomerLookupJoin($queryBuilder); $this->applyCustomerLookupJoin($queryBuilder);
$this->applyCustomerOrderJoin($queryBuilder); $this->applyCustomerOrderJoin($queryBuilder);
$this->applyOrderStatusFilter($queryBuilder, ['wc-processing', 'wc-completed']); $this->applyOrderStatusFilter($queryBuilder, ['wc-processing', 'wc-completed']);
$quotedDate = $queryBuilder->expr()->literal($date);
switch ($operator) { switch ($operator) {
case self::BEFORE: case self::BEFORE:
$queryBuilder->andWhere("DATE(orderStats.date_created) < :$dateParameter"); $queryBuilder->andWhere("DATE(orderStats.date_created) < $quotedDate");
break; break;
case self::AFTER: case self::AFTER:
$queryBuilder->andWhere("DATE(orderStats.date_created) > :$dateParameter"); $queryBuilder->andWhere("DATE(orderStats.date_created) > $quotedDate");
break; break;
case self::IN_THE_LAST: case self::IN_THE_LAST:
case self::NOT_IN_THE_LAST: case self::NOT_IN_THE_LAST:
$queryBuilder->andWhere("DATE(orderStats.date_created) >= :$dateParameter"); $queryBuilder->andWhere("DATE(orderStats.date_created) >= $quotedDate");
break; break;
case self::ON: case self::ON:
case self::NOT_ON: case self::NOT_ON:
$queryBuilder->andWhere("DATE(orderStats.date_created) = :$dateParameter"); $queryBuilder->andWhere("DATE(orderStats.date_created) = $quotedDate");
break; break;
default: default:
throw new InvalidFilterException('Incorrect value for operator', InvalidFilterException::MISSING_VALUE); throw new InvalidFilterException('Incorrect value for operator', InvalidFilterException::MISSING_VALUE);