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; }