Spaces:
No application file
No application file
| namespace Mautic\CampaignBundle\Entity; | |
| use Doctrine\DBAL\ArrayParameterType; | |
| use Doctrine\DBAL\Query\QueryBuilder as DbalQueryBuilder; | |
| use Doctrine\ORM\QueryBuilder as OrmQueryBuilder; | |
| use Mautic\CampaignBundle\Executioner\ContactFinder\Limiter\ContactLimiter; | |
| trait ContactLimiterTrait | |
| { | |
| /** | |
| * @param string $alias | |
| * @param bool $isCount | |
| */ | |
| private function updateQueryFromContactLimiter($alias, DbalQueryBuilder $qb, ContactLimiter $contactLimiter, $isCount = false): void | |
| { | |
| $minContactId = $contactLimiter->getMinContactId(); | |
| $maxContactId = $contactLimiter->getMaxContactId(); | |
| if ($contactId = $contactLimiter->getContactId()) { | |
| $qb->andWhere( | |
| $qb->expr()->eq("$alias.lead_id", ':contactId') | |
| ) | |
| ->setParameter('contactId', $contactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($contactIds = $contactLimiter->getContactIdList()) { | |
| $qb->andWhere( | |
| $qb->expr()->in("$alias.lead_id", ':contactIds') | |
| ) | |
| ->setParameter('contactIds', $contactIds, ArrayParameterType::INTEGER); | |
| } elseif ($minContactId && $maxContactId) { | |
| $qb->andWhere( | |
| "$alias.lead_id BETWEEN :minContactId AND :maxContactId" | |
| ) | |
| ->setParameter('minContactId', $minContactId, \Doctrine\DBAL\ParameterType::INTEGER) | |
| ->setParameter('maxContactId', $maxContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($minContactId) { | |
| $qb->andWhere( | |
| $qb->expr()->gte("$alias.lead_id", ':minContactId') | |
| ) | |
| ->setParameter('minContactId', $minContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($maxContactId) { | |
| $qb->andWhere( | |
| $qb->expr()->lte("$alias.lead_id", ':maxContactId') | |
| ) | |
| ->setParameter('maxContactId', $maxContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } | |
| if ($threadId = $contactLimiter->getThreadId()) { | |
| if ($maxThreads = $contactLimiter->getMaxThreads()) { | |
| if ($threadId <= $maxThreads) { | |
| $qb->andWhere("MOD(($alias.lead_id + :threadShift), :maxThreads) = 0") | |
| ->setParameter('threadShift', $threadId - 1, \Doctrine\DBAL\ParameterType::INTEGER) | |
| ->setParameter('maxThreads', $maxThreads, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } | |
| } | |
| } | |
| if (!$isCount && $limit = $contactLimiter->getBatchLimit()) { | |
| $qb->setMaxResults($limit); | |
| } | |
| } | |
| /** | |
| * @param string $alias | |
| * @param bool $isCount | |
| */ | |
| private function updateOrmQueryFromContactLimiter($alias, OrmQueryBuilder $qb, ContactLimiter $contactLimiter, $isCount = false): void | |
| { | |
| $minContactId = $contactLimiter->getMinContactId(); | |
| $maxContactId = $contactLimiter->getMaxContactId(); | |
| if ($contactId = $contactLimiter->getContactId()) { | |
| $qb->andWhere( | |
| $qb->expr()->eq("IDENTITY($alias.lead)", ':contact') | |
| ) | |
| ->setParameter('contact', $contactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($contactIds = $contactLimiter->getContactIdList()) { | |
| $qb->andWhere( | |
| $qb->expr()->in("IDENTITY($alias.lead)", ':contactIds') | |
| ) | |
| ->setParameter('contactIds', $contactIds, ArrayParameterType::INTEGER); | |
| } elseif ($minContactId && $maxContactId) { | |
| $qb->andWhere( | |
| "IDENTITY($alias.lead) BETWEEN :minContactId AND :maxContactId" | |
| ) | |
| ->setParameter('minContactId', $minContactId, \Doctrine\DBAL\ParameterType::INTEGER) | |
| ->setParameter('maxContactId', $maxContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($minContactId) { | |
| $qb->andWhere( | |
| $qb->expr()->gte("IDENTITY($alias.lead)", ':minContactId') | |
| ) | |
| ->setParameter('minContactId', $minContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } elseif ($maxContactId) { | |
| $qb->andWhere( | |
| $qb->expr()->lte("IDENTITY($alias.lead)", ':maxContactId') | |
| ) | |
| ->setParameter('maxContactId', $maxContactId, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } | |
| if ($threadId = $contactLimiter->getThreadId()) { | |
| if ($maxThreads = $contactLimiter->getMaxThreads()) { | |
| $qb->andWhere("MOD((IDENTITY($alias.lead) + :threadShift), :maxThreads) = 0") | |
| ->setParameter('threadShift', $threadId - 1, \Doctrine\DBAL\ParameterType::INTEGER) | |
| ->setParameter('maxThreads', $maxThreads, \Doctrine\DBAL\ParameterType::INTEGER); | |
| } | |
| } | |
| if (!$isCount && $limit = $contactLimiter->getBatchLimit()) { | |
| $qb->setMaxResults($limit); | |
| } | |
| } | |
| } | |