src/Aqarmap/Bundle/ListingBundle/Repository/ListingImpressionRepository.php line 12

Open in your IDE?
  1. <?php
  2. namespace Aqarmap\Bundle\ListingBundle\Repository;
  3. use Aqarmap\Bundle\ListingBundle\Document\ListingImpression;
  4. use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
  5. use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository;
  6. use Doctrine\ODM\MongoDB\Aggregation\Builder;
  7. class ListingImpressionRepository extends ServiceDocumentRepository
  8. {
  9.     public function __construct(ManagerRegistry $registry)
  10.     {
  11.         parent::__construct($registryListingImpression::class);
  12.     }
  13.     public function countListingsTotalImpressions($criteria)
  14.     {
  15.         $qb $this->createQueryBuilder();
  16.         $qb->count()
  17.             ->addAnd($qb->expr()->field('listingId')->in($criteria['listingIds']));
  18.         if (isset($criteria['start_date'])) {
  19.             $startDate = new \DateTime($criteria['start_date']);
  20.             $qb->addAnd($qb->expr()->field('createdAt')->gte($startDate));
  21.         }
  22.         if (isset($criteria['end_date'])) {
  23.             $endDate = new \DateTime($criteria['end_date']);
  24.             $qb->addAnd($qb->expr()->field('createdAt')->lte($endDate->modify('+1 day')));
  25.         }
  26.         if (!empty($criteria['start_date']) && !empty($criteria['end_date'])) {
  27.             $startDate = new \DateTime($criteria['start_date']);
  28.             $qb->addAnd($qb->expr()->field('createdAt')->gte($startDate))
  29.                 ->addAnd($qb->expr()->field('createdAt')->lte($endDate->modify('+1 day')));
  30.         }
  31.         return $qb->getQuery()->execute();
  32.     }
  33.     /**
  34.      * @return object|null
  35.      */
  36.     public function getLastImpression()
  37.     {
  38.         return $this->createQueryBuilder()
  39.             ->sort('id''desc')
  40.             ->limit(1)
  41.             ->getQuery()
  42.             ->getSingleResult();
  43.     }
  44.     /**
  45.      * Get listings with total impressions between two ids.
  46.      *
  47.      * @return Builder
  48.      *
  49.      * @throws \Exception
  50.      */
  51.     public function search(array $criteria)
  52.     {
  53.         $builder $this->createAggregationBuilder();
  54.         if ($criteria['listingsIds'] ?? false) {
  55.             $builder->match()->field('listingId')->in($criteria['listingsIds']);
  56.         }
  57.         if ($criteria['startId'] ?? false) {
  58.             $builder->match()->field('_id')->gt($criteria['startId']);
  59.         }
  60.         if ($criteria['endId'] ?? false) {
  61.             $builder->match()->field('_id')->lte($criteria['endId']);
  62.         }
  63.         if (!empty($criteria['startDate'])) {
  64.             $startDate $criteria['startDate'];
  65.             if (!$startDate instanceof \DateTime) {
  66.                 $startDate = new \DateTime($startDate);
  67.             }
  68.             $builder->match()->field('createdAt')->gte($startDate);
  69.         }
  70.         if (!empty($criteria['endDate'])) {
  71.             $endDate $criteria['endDate'];
  72.             if (!$endDate instanceof \DateTime) {
  73.                 $endDate = new \DateTime($endDate);
  74.             }
  75.             $builder->match()->field('createdAt')->lte($endDate->modify('+1 day'));
  76.         }
  77.         if (!empty($criteria['groupByWithCount'])) {
  78.             $builder->group()
  79.                 ->field('_id')
  80.                 ->expression($criteria['groupByWithCount'])
  81.                 ->field('count')
  82.                 ->expression($builder->expr()->sum(1));
  83.         }
  84.         if ($criteria['limit'] ?? false) {
  85.             $builder->limit($criteria['limit']);
  86.         }
  87.         return $builder;
  88.     }
  89. }