/**
  * filterDateTimeTextRange
  * 
  * @param GetFilterConditionEvent $event
  */
 public function filterDateTimeTextRange(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpressionBuilder();
     $values = $event->getValues();
     $value = $values['value'];
     if (isset($value['left_datetime']) || $value['right_datetime']) {
         $event->setCondition($expr->datetimeInRange($event->getField(), $value['left_datetime'], $value['right_datetime']));
     }
 }
 public function filterTextEntity(GetFilterConditionEvent $event)
 {
     $qb = $event->getQueryBuilder();
     $values = $event->getValues();
     $alias = $values["alias"];
     $select = $qb->getDQLPart("select")[0]->getParts();
     if (!empty($values['value'])) {
         $qb->select($select)->where($alias . '.id = :id')->setParameter('id', $values['value']->getId())->orderBy($alias . '.id', 'DESC')->getQuery();
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  * @throws \Exception
  */
 public function filterEntity(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpr();
     $values = $event->getValues();
     if (is_object($values['value'])) {
         $paramName = $this->generateParameterName($event->getField());
         if ($values['value'] instanceof Collection) {
             $ids = array();
             foreach ($values['value'] as $value) {
                 if (!is_callable(array($value, 'getId'))) {
                     throw new \RuntimeException(sprintf('Can\'t call method "getId()" on an instance of "%s"', get_class($value)));
                 }
                 $ids[] = $value->getId();
             }
             if (count($ids) > 0) {
                 $event->setCondition($expr->in($event->getField(), ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY)));
             }
         } else {
             if (!is_callable(array($values['value'], 'getId'))) {
                 throw new \RuntimeException(sprintf('Can\'t call method "getId()" on an instance of "%s"', get_class($values['value'])));
             }
             $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => array($values['value']->getId(), Type::INTEGER)));
         }
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  */
 public function filterDateRange(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpressionBuilder();
     $values = $event->getValues();
     $value = $values['value'];
     // left date should start at midnight
     if (isset($value['left_date'][0]) && $value['left_date'][0] instanceof \DateTime) {
         $value['left_date'][0]->setTime(0, 0, 0);
     }
     // right adte should end one second before midnight
     if (isset($value['right_date'][0]) && $value['right_date'][0] instanceof \DateTime) {
         $value['right_date'][0]->setTime(23, 59, 59);
     }
     if (isset($value['left_date'][0]) || isset($value['right_date'][0])) {
         $event->setCondition($expr->dateTimeInRange($event->getField(), $value['left_date'][0], $value['right_date'][0]));
     }
 }
 /**
  * Apply a filter for a filter_autcomplete type.
  * This method should work whih both ORM and DBAL query builder.
  *
  * @param GetFilterConditionEvent $event
  */
 public function filterAutocomplete(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpr();
     $values = $event->getValues();
     if ('' !== $values['value'] && null !== $values['value']) {
         $paramName = str_replace('.', '_', $event->getField());
         $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => $values['value']));
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  * @throws \Exception
  */
 public function filterEntity(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpr();
     $values = $event->getValues();
     if (is_object($values['value'])) {
         $paramName = $this->generateParameterName($event->getField());
         if ($values['value'] instanceof Collection) {
             $ids = array();
             foreach ($values['value'] as $value) {
                 $ids[] = $this->getValueIdentifier($value);
             }
             if (count($ids) > 0) {
                 $event->setCondition($expr->in($event->getField(), ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY)));
             }
         } else {
             $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => array($this->getValueIdentifier($values['value']), Type::INTEGER)));
         }
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  */
 public function filterDocument(GetFilterConditionEvent $event)
 {
     /** @var Expr $expr */
     $expr = $event->getFilterQuery()->getExpr();
     $values = $event->getValues();
     if (is_object($values['value'])) {
         $field = $event->getField();
         $multipleLevels = false !== strpos($field, '.');
         if ($multipleLevels) {
             // replace the form field name by the referenced document name
             $parts = explode('.', $field);
             $parts[count($parts) - 1] = $values['reference_name'];
             $field = implode('.', $parts);
         }
         if ($values['value'] instanceof Collection) {
             $ids = array();
             foreach ($values['value'] as $object) {
                 $ids[] = new \MongoId($object->getId());
             }
             if (count($ids) > 0) {
                 $event->setCondition($expr->field($field . '.$id')->in($ids));
             }
         } elseif ($multipleLevels) {
             $id = new \MongoId($values['value']->getId());
             $event->setCondition($expr->field($field . '.$id')->equals($id));
         } else {
             if ('one' === $values['reference_type']) {
                 $condition = $expr->field($field)->references($values['value']);
             } else {
                 $condition = $expr->field($field)->includesReferenceTo($values['value']);
             }
             $event->setCondition($condition);
         }
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  */
 public function filterText(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpressionBuilder();
     $values = $event->getValues();
     if ('' !== $values['value'] && null !== $values['value']) {
         if (isset($values['condition_pattern'])) {
             $event->setCondition($expr->stringLike($event->getField(), $values['value'], $values['condition_pattern']));
         } else {
             $event->setCondition($expr->stringLike($event->getField(), $values['value']));
         }
     }
 }
 /**
  * @param GetFilterConditionEvent $event
  * @throws \Exception
  */
 public function filterEntity(GetFilterConditionEvent $event)
 {
     $expr = $event->getFilterQuery()->getExpr();
     $values = $event->getValues();
     if (is_object($values['value'])) {
         $paramName = $this->generateParameterName($event->getField());
         $filterField = $event->getField();
         /**
          * @var QueryBuilder $queryBuilder
          */
         $queryBuilder = $event->getQueryBuilder();
         if ($dqlFrom = $event->getQueryBuilder()->getDQLPart('from')) {
             $rootPart = reset($dqlFrom);
             $fieldName = ltrim($event->getField(), $rootPart->getAlias() . '.');
             $metadata = $queryBuilder->getEntityManager()->getClassMetadata($rootPart->getFrom());
             if (isset($metadata->associationMappings[$fieldName]) and (!$metadata->associationMappings[$fieldName]['isOwningSide'] or $metadata->associationMappings[$fieldName]['type'] == ClassMetadataInfo::MANY_TO_MANY)) {
                 $queryBuilder->leftJoin($event->getField(), $fieldName);
                 $filterField = $fieldName;
             }
         }
         if ($values['value'] instanceof Collection) {
             $ids = array();
             foreach ($values['value'] as $value) {
                 $ids[] = $this->getValueIdentifier($value);
             }
             if (count($ids) > 0) {
                 $event->setCondition($expr->in($filterField, ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY)));
             }
         } else {
             $event->setCondition($expr->eq($filterField, ':' . $paramName), array($paramName => array($this->getValueIdentifier($values['value']), Type::INTEGER)));
         }
     }
 }