Example #1
0
 /**
  * @param QueryBuilder $qb
  * @param string       $dqlAlias
  *
  * @return string
  */
 public function getFilter(QueryBuilder $qb, $dqlAlias)
 {
     if ($this->child instanceof Filter) {
         $qb->having($this->child->getFilter($qb, $dqlAlias));
     } else {
         $qb->having($this->child);
     }
 }
Example #2
0
 /**
  * @param QueryBuilder $qb
  * @param Search $search
  * @return QueryBuilder
  */
 public function map(QueryBuilder $qb, Search $search)
 {
     $qb->select('c, s')->from('EtuModuleCovoitBundle:Covoit', 'c')->leftJoin('c.subscriptions', 's');
     if (!$search->olds) {
         $qb->andWhere('c.date > CURRENT_DATE()');
     }
     if ($search->startCity) {
         $qb->andWhere('c.startCity = :startCity')->setParameter('startCity', $search->startCity->getId());
     }
     if ($search->endCity) {
         $qb->andWhere('c.endCity = :endCity')->setParameter('endCity', $search->endCity->getId());
     }
     if ($search->date) {
         if ($search->dateBeforeAfter) {
             $before = clone $search->date;
             $before->add(\DateInterval::createFromDateString('-1 day'));
             $after = clone $search->date;
             $after->add(\DateInterval::createFromDateString('1 day'));
             $qb->andWhere('c.date BETWEEN :before AND :after')->setParameter('before', $before->format('Y-m-d') . ' 00:00:00')->setParameter('after', $after->format('Y-m-d') . ' 00:00:00');
         } else {
             $qb->andWhere('c.date = :date')->setParameter('date', $search->date->format('Y-m-d') . ' 00:00:00');
         }
     }
     if ($search->priceMax) {
         $qb->andWhere('c.price <= :priceMax')->setParameter('priceMax', $search->priceMax);
     }
     if ($search->hourMin) {
         $qb->andWhere('c.startHour >= :hourMin')->setParameter('hourMin', $search->hourMin->format('H:i:s'));
     }
     if ($search->hourMax) {
         $qb->andWhere('c.startHour <= :hourMax')->setParameter('hourMax', $search->hourMax->format('H:i:s'));
     }
     if ($search->keywords) {
         $qb->andWhere('c.notes LIKE :keywords')->setParameter('keywords', '%' . implode('%', explode(' ', $search->keywords)) . '%');
     }
     if ($search->placesLeft) {
         $qb->having('(c.capacity - COUNT(s)) >= :placesLeft')->setParameter('placesLeft', $search->placesLeft);
     }
     return $qb;
 }
Example #3
0
 /**
  * @param \APY\DataGridBundle\Grid\Column\Column[] $columns
  * @param int $page Page Number
  * @param int $limit Rows Per Page
  * @param int $gridDataJunction  Grid data junction
  * @return \APY\DataGridBundle\Grid\Rows
  */
 public function execute($columns, $page = 0, $limit = 0, $maxResults = null, $gridDataJunction = Column::DATA_CONJUNCTION)
 {
     $this->query = $this->manager->createQueryBuilder($this->class);
     $this->query->from($this->class, self::TABLE_ALIAS);
     $this->querySelectfromSource = clone $this->query;
     $bindIndex = 123;
     $serializeColumns = array();
     $where = $gridDataJunction === Column::DATA_CONJUNCTION ? $this->query->expr()->andx() : $this->query->expr()->orx();
     foreach ($columns as $column) {
         $fieldName = $this->getFieldName($column, true);
         $this->query->addSelect($fieldName);
         $this->querySelectfromSource->addSelect($fieldName);
         if ($column->isSorted()) {
             $this->query->orderBy($this->getFieldName($column), $column->getOrder());
         }
         if ($column->isFiltered()) {
             // Some attributes of the column can be changed in this function
             $filters = $column->getFilters('entity');
             $isDisjunction = $column->getDataJunction() === Column::DATA_DISJUNCTION;
             $hasHavingClause = $column->hasDQLFunction();
             $sub = $isDisjunction ? $this->query->expr()->orx() : ($hasHavingClause ? $this->query->expr()->andx() : $where);
             foreach ($filters as $filter) {
                 $operator = $this->normalizeOperator($filter->getOperator());
                 $q = $this->query->expr()->{$operator}($this->getFieldName($column, false, $hasHavingClause), "?{$bindIndex}");
                 if ($filter->getOperator() == Column::OPERATOR_NLIKE) {
                     $q = $this->query->expr()->not($q);
                 }
                 $sub->add($q);
                 if ($filter->getValue() !== null) {
                     $this->query->setParameter($bindIndex++, $this->normalizeValue($filter->getOperator(), $filter->getValue()));
                 }
             }
             if ($hasHavingClause) {
                 $this->query->having($sub);
             } elseif ($isDisjunction) {
                 $where->add($sub);
             }
         }
         if ($column->getType() === 'array') {
             $serializeColumns[] = $column->getId();
         }
     }
     if ($where->count() > 0) {
         $this->query->where($where);
     }
     foreach ($this->joins as $alias => $field) {
         $this->query->leftJoin($field, $alias);
         $this->querySelectfromSource->leftJoin($field, $alias);
     }
     if ($page > 0) {
         $this->query->setFirstResult($page * $limit);
     }
     if ($limit > 0) {
         if ($maxResults !== null && $maxResults - $page * $limit < $limit) {
             $limit = $maxResults - $page * $limit;
         }
         $this->query->setMaxResults($limit);
     } elseif ($maxResults !== null) {
         $this->query->setMaxResults($maxResults);
     }
     if (!empty($this->groupBy)) {
         $this->query->resetDQLPart('groupBy');
         $this->querySelectfromSource->resetDQLPart('groupBy');
         foreach ($this->groupBy as $field) {
             $this->query->addGroupBy($this->getGroupByFieldName($field));
             $this->querySelectfromSource->addGroupBy($this->getGroupByFieldName($field));
         }
     }
     //call overridden prepareQuery or associated closure
     $this->prepareQuery($this->query);
     $query = $this->query->getQuery();
     foreach ($this->hints as $hintKey => $hintValue) {
         $query->setHint($hintKey, $hintValue);
     }
     $items = $query->getResult();
     // hydrate result
     $result = new Rows();
     foreach ($items as $item) {
         $row = new Row();
         foreach ($item as $key => $value) {
             $key = str_replace('::', '.', $key);
             if (in_array($key, $serializeColumns) && is_string($value)) {
                 $value = unserialize($value);
             }
             $row->setField($key, $value);
         }
         //call overridden prepareRow or associated closure
         if (($modifiedRow = $this->prepareRow($row)) != null) {
             $result->addRow($modifiedRow);
         }
     }
     return $result;
 }
 /**
  * @param \Doctrine\ORM\QueryBuilder $queryBuilder
  * @param $filter
  *
  * @return QueryBuilder
  */
 private function processFilter(QueryBuilder $queryBuilder, $filter)
 {
     if (isset($filter['searchString']) && '' !== $filter['searchString']) {
         $locationExpr = $queryBuilder->expr()->orX();
         foreach (explode(' ', $filter['searchString']) as $keywordIndex => $keyword) {
             $queryParameter = 'searchString' . $keywordIndex;
             $queryBuilder->andWhere('event.title LIKE :' . $queryParameter);
             $queryBuilder->setParameter($queryParameter, '%' . trim($keyword) . '%');
             $locationExpr->add($queryBuilder->expr()->like('event.city', ':' . $queryParameter));
         }
         if (!isset($filter['lat']) && !isset($filter['long'])) {
             $queryBuilder->orWhere($locationExpr);
         }
     }
     if (isset($filter['eventIds'])) {
         $queryBuilder->andWhere('event.id IN (:eventIds)');
         $queryBuilder->setParameter('eventIds', $filter['eventIds']);
     }
     if (isset($filter['isTopEvent'])) {
         $queryBuilder->andWhere('event.isTopEvent = :isTopEvent');
         $queryBuilder->setParameter('isTopEvent', $filter['isTopEvent']);
     }
     if (isset($filter['categories']) && '' !== $filter['categories']) {
         $queryBuilder->leftJoin('event.categories', 'eventCategories');
         $queryBuilder->andWhere('eventCategories.id IN (:categories)');
         $queryBuilder->setParameter('categories', $filter['categories']);
     }
     if (isset($filter['dateFrom']) && '' !== $filter['dateFrom']) {
         /** @var DateTime $dateFrom */
         $dateFrom = $filter['dateFrom'];
         $queryBuilder->andWhere('event.startDate >= :startDate');
         $queryBuilder->setParameter('startDate', $dateFrom->format('Y-m-d'));
     }
     if (isset($filter['dateFrom']) && '' !== $filter['dateFrom'] && (isset($filter['dateTo']) && '' !== $filter['dateTo'])) {
         /** @var DateTime $dateTo */
         $dateTo = $filter['dateTo'];
         $queryBuilder->andWhere('event.startDate <= :startEnd');
         $queryBuilder->setParameter('startEnd', $dateTo->format('Y-m-d'));
     } elseif (isset($filter['dateTo']) && '' !== $filter['dateTo']) {
         /** @var DateTime $dateTo */
         $dateTo = $filter['dateTo'];
         $queryBuilder->andWhere('event.startDate <= :startEnd');
         $queryBuilder->setParameter('startEnd', $dateTo->format('Y-m-d'));
     }
     if (isset($filter['lat']) && isset($filter['long'])) {
         $queryBuilder->addSelect('( 3959 * acos(cos(radians(:latitude)) ' . '* cos(radians(event.latitude)) ' . '* cos(radians(event.longitude) ' . '- radians(:longitude)) ' . '+ sin(radians(:latitude)) ' . '* sin(radians(event.latitude)))) AS distance');
         $queryBuilder->setParameter('latitude', $filter['lat']);
         $queryBuilder->setParameter('longitude', $filter['long']);
         $queryBuilder->having('distance <= :area');
         $queryBuilder->setParameter('area', $filter['area']);
         $queryBuilder->orderBy('distance', 'ASC');
     } else {
         $queryBuilder->orderBy('event.startDate', 'ASC');
     }
     if (isset($filter['country'])) {
         $queryBuilder->andWhere('event.country = :country');
         $queryBuilder->setParameter('country', $filter['country']);
     }
     return $queryBuilder;
 }
 /**
  * {@inheritdoc}
  */
 public function parse($value, QueryBuilder $qb)
 {
     if (!is_array($value)) {
         $value = Yaml::parse($value);
     }
     $processor = new Processor();
     $value = $processor->processConfiguration(new QueryConfiguration(), $value);
     if (!isset($value['from'])) {
         throw new \RuntimeException('Missing mandatory "from" section');
     }
     foreach ((array) $value['from'] as $from) {
         $qb->from($from['table'], $from['alias']);
     }
     if (isset($value['select'])) {
         foreach ($value['select'] as $select) {
             $qb->add('select', new Expr\Select($select), true);
         }
     }
     if (isset($value['distinct'])) {
         $qb->distinct((bool) $value['distinct']);
     }
     if (isset($value['groupBy'])) {
         $qb->groupBy($value['groupBy']);
     }
     if (isset($value['having'])) {
         $qb->having($value['having']);
     }
     $this->addJoin($qb, $value);
     $this->addWhere($qb, $value);
     $this->addOrder($qb, $value);
     return $qb;
 }