Simplify subquery
MAILPOET-4986
This commit is contained in:
committed by
Aschepikov
parent
d505bffcfd
commit
c747b71829
@ -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);
|
||||||
|
Reference in New Issue
Block a user