public function testAddFiltersToQuery()
 {
     $dateTimeFilter = $this->getMockBuilder('Oro\\Bundle\\FilterBundle\\Filter\\DateTimeRangeFilter')->disableOriginalConstructor()->getMock();
     $choiceFilter = $this->getMockBuilder('Oro\\Bundle\\FilterBundle\\Filter\\ChoiceFilter')->disableOriginalConstructor()->getMock();
     $routingHelper = $this->getMockBuilder('Oro\\Bundle\\EntityBundle\\Tools\\EntityRoutingHelper')->disableOriginalConstructor()->getMock();
     $chainProvider = $this->getMockBuilder('Oro\\Bundle\\ActivityListBundle\\Provider\\ActivityListChainProvider')->disableOriginalConstructor()->getMock();
     $filterData = ['dateRange' => ['value' => 'dateRangeFilter'], 'activityType' => ['value' => ['Acme\\TestBundle\\Entity\\TestEntity']]];
     $filter = new ActivityListFilterHelper($dateTimeFilter, $choiceFilter, $routingHelper, $chainProvider);
     $qb = $this->getMockBuilder('Doctrine\\ORM\\QueryBuilder')->disableOriginalConstructor()->getMock();
     $dateTimeFilter->expects($this->once())->method('init')->with('updatedAt', ['data_name' => 'activity.updatedAt']);
     $dateTimeForm = $this->getMockBuilder('Symfony\\Component\\Form\\Form')->disableOriginalConstructor()->getMock();
     $dateTimeFilter->expects($this->once())->method('getForm')->will($this->returnValue($dateTimeForm));
     $dateTimeForm->expects($this->once())->method('isSubmitted')->willReturn(false);
     $dateTimeForm->expects($this->once())->method('submit')->with(['value' => 'dateRangeFilter']);
     $dateTimeFilter->expects($this->once())->method('apply');
     $routingHelper->expects($this->once())->method('resolveEntityClass')->with('Acme\\TestBundle\\Entity\\TestEntity')->will($this->returnValue('Acme\\TestBundle\\Entity\\TestEntity'));
     $chainProvider->expects($this->once())->method('getSupportedActivities')->will($this->returnValue(['Acme\\TestBundle\\Entity\\TestEntity']));
     $choiceFilter->expects($this->once())->method('init')->with('relatedActivityClass', ['data_name' => 'activity.relatedActivityClass', 'options' => ['field_options' => ['multiple' => true, 'choices' => ['Acme\\TestBundle\\Entity\\TestEntity' => 0]]]]);
     $choiceForm = $this->getMockBuilder('Symfony\\Component\\Form\\Form')->disableOriginalConstructor()->getMock();
     $choiceFilter->expects($this->once())->method('getForm')->will($this->returnValue($choiceForm));
     $choiceForm->expects($this->once())->method('isSubmitted')->willReturn(false);
     $choiceForm->expects($this->once())->method('submit')->with(['value' => ['Acme\\TestBundle\\Entity\\TestEntity']]);
     $choiceFilter->expects($this->once())->method('apply');
     $filter->addFiltersToQuery($qb, $filterData);
 }
 /**
  * @param EntityManager $em
  * @param array $data
  * @param string $entityIdField
  *
  * @return QueryBuilder
  */
 protected function createActivityQueryBuilder(EntityManager $em, array $data, $entityIdField)
 {
     $joinField = sprintf('%s.%s', $this->activityListAlias, ExtendHelper::buildAssociationName($data['entityClassName'], ActivityListEntityConfigDumperExtension::ASSOCIATION_KIND));
     $activityListRepository = $em->getRepository('OroActivityListBundle:ActivityList');
     $activityQb = $activityListRepository->createQueryBuilder($this->activityListAlias)->select('1')->setMaxResults(1);
     $availableActivityAssociations = $this->activityManager->getActivityAssociations($data['entityClassName']);
     if (!$availableActivityAssociations && !$activityListRepository->getRecordsCountForTargetClass($data['entityClassName'])) {
         $activityQb->andWhere('1 = 0');
         return $activityQb;
     }
     $activityQb->join($joinField, $this->activityAlias)->andWhere(sprintf('%s.id = %s.%s', $this->activityAlias, $this->getEntityAlias(), $entityIdField));
     $entityField = $this->getField();
     $dateRangeField = strpos($entityField, '$') === 0 ? substr($entityField, 1) : null;
     if ($dateRangeField) {
         $data['dateRange'] = $data['filter']['data'];
         unset($data['filter']);
     }
     $this->activityListFilterHelper->addFiltersToQuery($activityQb, $data, $dateRangeField, $this->activityListAlias);
     if (isset($data['filter'])) {
         $activityDs = new OrmFilterDatasourceAdapter($activityQb);
         $expr = $activityDs->expr()->exists($this->createRelatedActivityDql($activityDs, $data));
         $this->applyFilterToClause($activityDs, $expr);
     }
     return $activityQb;
 }
 /**
  * @param EntityManager $em
  * @param array $data
  * @param string $entityIdField
  *
  * @return QueryBuilder
  */
 protected function createActivityQueryBuilder(EntityManager $em, array $data, $entityIdField)
 {
     $joinField = sprintf('%s.%s', $this->activityListAlias, ExtendHelper::buildAssociationName($data['entityClassName'], ActivityListEntityConfigDumperExtension::ASSOCIATION_KIND));
     $activityQb = $em->getRepository('OroActivityListBundle:ActivityList')->createQueryBuilder($this->activityListAlias)->select('1')->setMaxResults(1);
     $availableActivityAssociations = $this->activityManager->getActivityAssociations($data['entityClassName']);
     $availableClasses = array_map(function ($assoc) {
         return $assoc['className'];
     }, $availableActivityAssociations);
     $chosenActivities = $data['activityType']['value'];
     if (count($chosenActivities) === 1 && empty($chosenActivities[0])) {
         $chosenActivities = $this->activityListChainProvider->getSupportedActivities();
     }
     $chosenClasses = array_map(function ($className) {
         return $this->entityRoutingHelper->decodeClassName($className);
     }, $chosenActivities);
     $unavailableChoices = array_diff($chosenClasses, $availableClasses);
     if ($unavailableChoices) {
         $activityQb->andWhere('1 = 0');
         return $activityQb;
     }
     $activityQb->join($joinField, $this->activityAlias)->andWhere(sprintf('%s.id = %s.%s', $this->activityAlias, $this->getEntityAlias(), $entityIdField));
     $entityField = $this->getField();
     $dateRangeField = strpos($entityField, '$') === 0 ? substr($entityField, 1) : null;
     if ($dateRangeField) {
         $data['dateRange'] = $data['filter']['data'];
         unset($data['filter']);
     }
     $this->activityListFilterHelper->addFiltersToQuery($activityQb, $data, $dateRangeField, $this->activityListAlias);
     if (isset($data['filter'])) {
         $activityDs = new OrmFilterDatasourceAdapter($activityQb);
         $expr = $activityDs->expr()->exists($this->createRelatedActivityDql($activityDs, $data));
         $this->applyFilterToClause($activityDs, $expr);
     }
     return $activityQb;
 }
 /**
  * @param string  $entityClass
  * @param integer $entityId
  * @param array   $filter
  *
  * @return ActivityList[]
  */
 public function getListCount($entityClass, $entityId, $filter)
 {
     $qb = $this->getBaseQB($entityClass, $entityId);
     $qb->select('COUNT(activity.id)');
     $qb->resetDQLPart('orderBy');
     $this->activityListFilterHelper->addFiltersToQuery($qb, $filter);
     return $qb->getQuery()->getSingleScalarResult();
 }
 /**
  * @param string $entityClass
  * @param int $entityId
  * @param array $filter
  *
  * @return QueryBuilder
  */
 protected function prepareQB($entityClass, $entityId, $filter)
 {
     $qb = $this->getBaseQB($entityClass, $entityId);
     $this->activityInheritanceTargetsHelper->applyInheritanceActivity($qb, $entityClass, $entityId);
     if ($this->config->get('oro_activity_list.grouping')) {
         $qb->andWhere($qb->expr()->andX('activity.head = true'));
     }
     $this->activityListFilterHelper->addFiltersToQuery($qb, $filter);
     $this->activityListAclHelper->applyAclCriteria($qb, $this->chainProvider->getProviders());
     return $qb;
 }
 /**
  * @param string  $entityClass
  * @param integer $entityId
  * @param array   $filter
  *
  * @return ActivityList[]
  */
 public function getListCount($entityClass, $entityId, $filter)
 {
     $qb = $this->getBaseQB($entityClass, $entityId);
     $this->activityListFilterHelper->addFiltersToQuery($qb, $filter);
     $this->activityListAclHelper->applyAclCriteria($qb, $this->chainProvider->getProviders());
     $qb->resetDQLPart('orderBy');
     $query = $qb->getQuery();
     $parserResult = QueryUtils::parseQuery($query);
     $parameterMappings = $parserResult->getParameterMappings();
     list($params, $types) = QueryUtils::processParameterMappings($query, $parameterMappings);
     $statement = $query->getEntityManager()->getConnection()->executeQuery('SELECT COUNT(*) FROM (' . $query->getSQL() . ') AS e', $params, $types);
     $result = $statement->fetchColumn();
     return $result;
 }