/** * Builds filtering expression by tags ids and entity class name * * @param OrmFilterDatasourceAdapter $ds * @param array $data * * @param string $entityClassParam * * @return bool|Func */ protected function buildFilterExpr(OrmFilterDatasourceAdapter $ds, array $data, $entityClassParam) { $expr = false; $qb = $ds->getQueryBuilder(); $entityIdAlias = $this->get(FilterUtility::DATA_NAME_KEY); $taggingAlias = $ds->generateParameterName('tagging'); $tagAlias = $ds->generateParameterName('tag'); $subQueryDQL = $qb->getEntityManager()->getRepository('OroTagBundle:Tagging')->createQueryBuilder($taggingAlias)->select($taggingAlias . '.recordId')->join($taggingAlias . '.tag', $tagAlias)->where(sprintf('%s.entityName = :%s', $taggingAlias, $entityClassParam))->andWhere($qb->expr()->in($tagAlias . '.id', $data['value']))->getDQL(); switch ($data['type']) { case DictionaryFilterType::TYPE_IN: $expr = $ds->expr()->in($entityIdAlias, $subQueryDQL); break; case DictionaryFilterType::TYPE_NOT_IN: $expr = $ds->expr()->notIn($entityIdAlias, $subQueryDQL); break; default: break; } return $expr; }
/** * @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; }