/**
  * Add completeness joins to query builder
  *
  * @param string $completenessAlias the join alias
  * @param string $locale            the locale
  * @param sting  $scope             the scope
  *
  * @return CompletenessJoin
  */
 public function addJoins($completenessAlias, $locale, $scope)
 {
     $rootAlias = $this->qb->getRootAlias();
     $localeAlias = $completenessAlias . 'Locale';
     $channelAlias = $completenessAlias . 'Channel';
     $rootEntity = current($this->qb->getRootEntities());
     $completenessMapping = $this->qb->getEntityManager()->getClassMetadata($rootEntity)->getAssociationMapping('completenesses');
     $completenessClass = $completenessMapping['targetEntity'];
     $this->qb->leftJoin('PimCatalogBundle:Locale', $localeAlias, 'WITH', $localeAlias . '.code = :cLocaleCode')->leftJoin('PimCatalogBundle:Channel', $channelAlias, 'WITH', $channelAlias . '.code = :cScopeCode')->leftJoin($completenessClass, $completenessAlias, 'WITH', $completenessAlias . '.locale = ' . $localeAlias . '.id AND ' . $completenessAlias . '.channel = ' . $channelAlias . '.id AND ' . $completenessAlias . '.product = ' . $rootAlias . '.id')->setParameter('cLocaleCode', $locale)->setParameter('cScopeCode', $scope);
     return $this;
 }
 protected function resetBuilder()
 {
     $rootEntities = $this->qb->getRootEntities();
     $this->qb = $this->qb->getEntityManager()->getRepository($rootEntities[0])->createQueryBuilder('x');
     $this->joinAliases = [];
     $this->parametersMap = [];
     $this->orderBy = [];
 }
 /**
  * Add completeness joins to query builder
  *
  * @param string $completenessAlias the join alias
  * @param string $locale            the locale
  * @param string $scope             the scope
  *
  * @return CompletenessJoin
  */
 public function addJoins($completenessAlias, $locale, $scope)
 {
     $rootAlias = $this->qb->getRootAliases()[0];
     $localeAlias = $completenessAlias . 'Locale';
     $channelAlias = $completenessAlias . 'Channel';
     $rootEntity = $this->qb->getRootEntities()[0];
     $completenessMapping = $this->qb->getEntityManager()->getClassMetadata($rootEntity)->getAssociationMapping('completenesses');
     $completenessClass = $completenessMapping['targetEntity'];
     $joinCondition = sprintf('%s.product = %s.id', $completenessAlias, $rootAlias);
     $this->qb->leftJoin('PimCatalogBundle:Channel', $channelAlias, 'WITH', $channelAlias . '.code = :cScopeCode')->setParameter('cScopeCode', $scope);
     $joinCondition .= sprintf(' AND %s.channel = %s.id', $completenessAlias, $channelAlias);
     if (null !== $locale) {
         $this->qb->leftJoin('PimCatalogBundle:Locale', $localeAlias, 'WITH', sprintf('%s.code = :%scLocaleCode', $localeAlias, $localeAlias))->setParameter($localeAlias . 'cLocaleCode', $locale);
         $joinCondition .= sprintf(' AND %s.locale = %s.id', $completenessAlias, $localeAlias);
     }
     $this->qb->leftJoin($completenessClass, $completenessAlias, 'WITH', $joinCondition);
     return $this;
 }
 /**
  * @param QueryBuilder      $queryBuilder
  * @param QueryBuilderTools $qbTools
  */
 public function __construct(QueryBuilder $queryBuilder, QueryBuilderTools $qbTools)
 {
     // make sure 'from' DQL part is initialized for both original and optimized query builders
     $queryBuilder->getRootEntities();
     $this->originalQueryBuilder = $queryBuilder;
     $this->qbTools = $qbTools;
     // initialize the query builder helper
     $this->qbTools->prepareFieldAliases($this->originalQueryBuilder->getDQLPart('select'));
     $this->qbTools->prepareJoinTablePaths($this->originalQueryBuilder->getDQLPart('join'));
 }
Example #5
0
 /**
  * Detects if the root entity has the given identifier.
  *
  * @param QueryBuilder    $queryBuilder
  * @param ManagerRegistry $managerRegistry
  * @param bool            $isForeign
  *
  * @return bool
  */
 private static function hasRootEntityWithIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry, bool $isForeign) : bool
 {
     foreach ($queryBuilder->getRootEntities() as $rootEntity) {
         $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity);
         if ($isForeign ? $rootMetadata->isIdentifierComposite : $rootMetadata->containsForeignIdentifier) {
             return true;
         }
     }
     return false;
 }
Example #6
0
 /**
  * Determines whether the query builder has any root entity with foreign key identifier.
  *
  * @param QueryBuilder    $queryBuilder
  * @param ManagerRegistry $managerRegistry
  *
  * @return bool
  */
 public static function hasRootEntityWithForeignKeyIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry)
 {
     foreach ($queryBuilder->getRootEntities() as $rootEntity) {
         $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity);
         if ($rootMetadata->containsForeignIdentifier) {
             return true;
         }
     }
     return false;
 }
 public function getAllClassesForQueryBuilder(QueryBuilder $queryBuilder) : array
 {
     $classes = [];
     $rootEntities = $queryBuilder->getRootEntities();
     foreach ($rootEntities as $rootEntity) {
         $classes[$rootEntity] = $rootEntity;
         $metadata = $this->getClassMetadata($rootEntity);
         $this->addAssociationsTargetClasses($metadata, $classes);
     }
     return $classes;
 }
Example #8
0
 /**
  * Ensure that filtering applied and query builder wrapped in buffered iterator
  * if data source is query builder or just an entity name
  *
  * @param ContextInterface $context
  */
 protected function ensureInitialized(ContextInterface $context)
 {
     if (null !== $this->qb) {
         if ($context->hasOption(self::ID_FILTER)) {
             $optionValue = $context->getOption(self::ID_FILTER);
             $em = $this->qb->getEntityManager();
             $entityNames = $this->qb->getRootEntities();
             $classMetadata = $em->getClassMetadata(reset($entityNames));
             $identifier = $classMetadata->getSingleIdentifierFieldName();
             if (is_array($optionValue)) {
                 $this->qb->andWhere($this->qb->expr()->in('o.' . $identifier, ':id'));
                 $this->qb->setParameter('id', $optionValue);
             } else {
                 $this->qb->andWhere('o.' . $identifier . ' = :id');
             }
             $this->qb->setParameter('id', $optionValue);
         }
         $this->setSourceIterator(new BufferedQueryResultIterator($this->qb));
     }
 }
 private function addJoinsToQueryBuilder($alias, QueryBuilder $qb, $className, $recursive = true)
 {
     foreach ($this->getEntityManager()->getClassMetadata($className)->getAssociationMappings() as $assoc) {
         if (in_array($assoc['targetEntity'], $qb->getRootEntities()) || $className === $assoc['targetEntity']) {
             continue;
         }
         $uniqueJoinAlias = $this->getUniqueAlias($assoc['targetEntity'], $qb);
         $qb->addSelect($uniqueJoinAlias)->leftJoin(sprintf('%s.%s', $alias, $assoc['fieldName']), $uniqueJoinAlias);
         if ($recursive) {
             $this->addJoinsToQueryBuilder($uniqueJoinAlias, $qb, $assoc['targetEntity']);
         }
     }
 }
Example #10
0
 /**
  * Defines default identifiers from query builder in order to optimize count queries.
  *
  * @return $this
  *
  * @throws \Doctrine\Common\Persistence\Mapping\MappingException
  */
 public function setDefaultIdentifierFieldNames()
 {
     //Default identifier for table rows
     $rootEntity = $this->queryBuilder->getRootEntities()[0];
     $metadata = $this->queryBuilder->getEntityManager()->getMetadataFactory()->getMetadataFor($rootEntity);
     $identifiers = array();
     foreach ($metadata->getIdentifierFieldNames() as $identifierFieldName) {
         $identifiers[] = $this->getAlias() . '.' . $identifierFieldName;
     }
     $rootEntityIdentifier = implode(',', $identifiers);
     $this->setIdentifierFieldNames($rootEntityIdentifier ?: null);
     return $this;
 }
 function it_adds_a_filter_on_a_field_in_the_query(QueryBuilder $qb, Expr $expr, EntityManager $em, ClassMetadata $cm, Expr\Comparison $comparison)
 {
     $qb->expr()->willReturn($expr);
     $qb->getRootAlias()->willReturn('p');
     $qb->getRootEntities()->willReturn([]);
     $qb->getEntityManager()->willReturn($em);
     $em->getClassMetadata(false)->willReturn($cm);
     $comparison->__toString()->willReturn('filterCompleteness.ratio < 100');
     $cm->getAssociationMapping('completenesses')->willReturn(['targetEntity' => 'test']);
     $expr->literal('100')->willReturn('100');
     $expr->lt(Argument::any(), '100')->willReturn($comparison);
     $this->setQueryBuilder($qb);
     $qb->leftJoin('PimCatalogBundle:Locale', Argument::any(), 'WITH', Argument::any())->willReturn($qb);
     $qb->leftJoin('PimCatalogBundle:Channel', Argument::any(), 'WITH', Argument::any())->willReturn($qb);
     $qb->leftJoin('test', Argument::any(), 'WITH', Argument::any())->willReturn($qb);
     $qb->setParameter('cLocaleCode', Argument::any())->willReturn($qb);
     $qb->setParameter('cScopeCode', Argument::any())->willReturn($qb);
     $qb->andWhere('filterCompleteness.ratio < 100')->shouldBeCalled();
     $this->addFieldFilter('completeness', '<', 100, 'en_US', 'mobile');
 }
Example #12
0
 /**
  * Constructor.
  *
  * @param Query|QueryBuilder $query
  *        	A Doctrine ORM query or query builder.
  * @param boolean $fetchJoinCollection
  *        	Whether the query joins a collection (true by default).
  * @param boolean $cache
  *        	Use result cache (true by default).
  * @param boolean $count
  *        	Execute count query (true by default).
  */
 public function __construct($query, $fetchJoinCollection = true, $cached = true, $count = true)
 {
     if ($count) {
         $countQuery = clone $query;
         $countQuery = $countQuery->select('count(e) as c')->setFirstResult(0)->setMaxResults(1)->getQuery();
         $this->countQuery = $countQuery;
     }
     $q = $query;
     if ($cached) {
         $this->cache_prefix = '';
         if ($query instanceof QueryBuilder) {
             $q = $query->getQuery();
             $entities = $query->getRootEntities();
             if ($entities) {
                 $entity = $entities[0];
                 $this->cache_prefix = strtolower(substr(strrchr($entity, '\\'), 1) ?: $entity) . '-';
             }
         }
         $q->useQueryCache(true)->useResultCache(true, 3600, $this->cache_prefix . md5($q->getDQL()));
     }
     parent::__construct($q, $fetchJoinCollection);
 }
Example #13
0
 /**
  * Joins with the authorizations and filters the results to keep only those authorized.
  *
  * @param QueryBuilder              $qb
  * @param SecurityIdentityInterface $identity
  * @param string                    $action
  * @param string|null               $entityClass Class name of the entity that is the resource in the query.
  *                                               If omitted, it will be guessed from the SELECT.
  * @param string|null               $entityAlias Alias of the entity that is the resource in the query.
  *                                               If omitted, it will be guessed from the SELECT.
  *
  * @throws \RuntimeException The query builder has no "select" part
  */
 public static function joinACL(QueryBuilder $qb, SecurityIdentityInterface $identity, $action, $entityClass = null, $entityAlias = null)
 {
     if ($entityClass === null) {
         $rootEntities = $qb->getRootEntities();
         if (!isset($rootEntities[0])) {
             throw new \RuntimeException('The query builder has no "select" part');
         }
         $entityClass = $rootEntities[0];
     }
     if ($entityAlias === null) {
         $rootAliases = $qb->getRootAliases();
         if (!isset($rootAliases[0])) {
             throw new \RuntimeException('The query builder has no "select" part');
         }
         $entityAlias = $rootAliases[0];
     }
     $qb->innerJoin('MyCLabs\\ACL\\Model\\Authorization', 'authorization', 'WITH', $entityAlias . '.id = authorization.entityId');
     $qb->andWhere('authorization.entityClass = :acl_entity_class');
     $qb->andWhere('authorization.securityIdentity = :acl_identity');
     $qb->andWhere('authorization.actions.' . $action . ' = true');
     $qb->setParameter('acl_identity', $identity);
     $qb->setParameter('acl_entity_class', $entityClass);
 }
Example #14
0
 /**
  * Gets the class metadata from a given join alias.
  *
  * @param string          $alias
  * @param QueryBuilder    $queryBuilder
  * @param ManagerRegistry $managerRegistry
  *
  * @return ClassMetadata
  */
 public static function getClassMetadataFromJoinAlias(string $alias, QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : ClassMetadata
 {
     $rootEntities = $queryBuilder->getRootEntities();
     $rootAliases = $queryBuilder->getRootAliases();
     $joinParts = $queryBuilder->getDQLPart('join');
     $aliasMap = [];
     $targetAlias = $alias;
     foreach ($joinParts as $rootAlias => $joins) {
         $aliasMap[$rootAlias] = 'root';
         foreach ($joins as $join) {
             $alias = self::getJoinAlias($join);
             $relationship = self::getJoinRelationship($join);
             $pos = strpos($relationship, '.');
             $aliasMap[$alias] = ['parentAlias' => substr($relationship, 0, $pos), 'association' => substr($relationship, $pos + 1)];
         }
     }
     $associationStack = [];
     $rootAlias = null;
     while (null === $rootAlias) {
         $mapping = $aliasMap[$targetAlias];
         if ('root' === $mapping) {
             $rootAlias = $targetAlias;
         } else {
             $associationStack[] = $mapping['association'];
             $targetAlias = $mapping['parentAlias'];
         }
     }
     $rootEntity = $rootEntities[array_search($rootAlias, $rootAliases)];
     $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity);
     $metadata = $rootMetadata;
     while (null !== ($association = array_pop($associationStack))) {
         $associationClass = $metadata->getAssociationTargetClass($association);
         $metadata = $managerRegistry->getManagerForClass($associationClass)->getClassMetadata($associationClass);
     }
     return $metadata;
 }
Example #15
0
 /**
  * Get the results from the sql after adding the
  *
  * @param \Victoire\Bundle\BusinessEntityPageBundle\Entity\BusinessEntityPagePattern $containerEntity
  * @param QueryBuilder                                                               $itemsQueryBuilder
  *
  * @throws \Exception
  *
  * @return QueryBuilder The QB to list of objects
  */
 public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder)
 {
     //services
     $entityManager = $this->entityManager;
     //test the container entity
     if ($containerEntity === null) {
         throw new \Exception('The container entity parameter must not be null.');
     }
     //verify that the object has the query trait
     $this->checkObjectHasQueryTrait($containerEntity);
     //get the query of the container entity
     $query = $containerEntity->getQuery();
     if ($query !== '' && $query !== null) {
         $subQuery = $this->entityManager->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item');
         $itemsQueryBuilder->andWhere('main_item.id IN (' . $subQuery->getQuery()->getDql() . ' ' . $query . ')');
     }
     $currentView = $this->currentView;
     // If the current page is a BEP, we parse all its properties and inject them as query parameters
     if ($currentView() && $currentView() instanceof BusinessEntityPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) {
         // NEW
         $metadatas = $this->entityManager->getClassMetadata(get_class($currentEntity));
         foreach ($metadatas->fieldMappings as $fieldName => $field) {
             if (strpos($query, ":" . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName));
             }
         }
         foreach ($metadatas->associationMappings as $fieldName => $field) {
             if (strpos($query, ":" . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId());
             }
         }
         if (strpos($query, ":currentEntity") !== false) {
             $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId());
         }
     }
     return $itemsQueryBuilder;
 }
 /**
  * {@inheritdoc}
  */
 public function isFilterable(QueryBuilder $qb)
 {
     $entities = $qb->getRootEntities();
     if (empty($entities)) {
         return false;
     }
     foreach ($entities as $entity) {
         $extendedMeta = $this->extendedMetadataFactory->getExtendedMetadata($entity);
         if (!empty($extendedMeta['user'])) {
             return true;
         }
     }
     return false;
 }
Example #17
0
 /**
  * Get root entities config data
  *
  * @param QueryBuilder $query
  * @return array with root entities config
  */
 protected function getRootIds(QueryBuilder $query)
 {
     $groupParts = $this->getGroupParts();
     $rootIds = [];
     if (empty($groupParts)) {
         $rootIdentifiers = $query->getEntityManager()->getClassMetadata($query->getRootEntities()[0])->getIdentifier();
         $rootAlias = $query->getRootAliases()[0];
         foreach ($rootIdentifiers as $field) {
             $rootIds[] = ['fieldAlias' => $field, 'alias' => $field, 'entityAlias' => $rootAlias];
         }
     } else {
         foreach ($groupParts as $groupPart) {
             if (strpos($groupPart, '.')) {
                 list($rootAlias, $rootIdentifierPart) = explode('.', $groupPart);
                 $rootIds[] = ['fieldAlias' => $rootIdentifierPart, 'entityAlias' => $rootAlias, 'alias' => $rootIdentifierPart];
             } else {
                 $selectParts = $this->masterQB->getDQLPart('select');
                 /** @var Select $selectPart */
                 foreach ($selectParts as $selectPart) {
                     foreach ($selectPart->getParts() as $part) {
                         if (preg_match('/^(.*)\\sas\\s(.*)$/i', $part, $matches)) {
                             if (count($matches) == 3 && $groupPart == $matches[2]) {
                                 $rootIds[] = ['fieldAlias' => $matches[1], 'alias' => $matches[2]];
                             }
                         } else {
                             $rootIds[] = ['fieldAlias' => $groupPart, 'alias' => $groupPart];
                         }
                     }
                 }
             }
         }
     }
     return $rootIds;
 }
Example #18
0
 /**
  * Apply the ACL constraints to the specified query builder, using the permission definition
  *
  * @param QueryBuilder         $queryBuilder  The query builder
  * @param PermissionDefinition $permissionDef The permission definition
  *
  * @return Query
  */
 public function apply(QueryBuilder $queryBuilder, PermissionDefinition $permissionDef)
 {
     $whereQueryParts = $queryBuilder->getDQLPart('where');
     if (empty($whereQueryParts)) {
         $queryBuilder->where('1 = 1');
         // this will help in cases where no where query is specified
     }
     $query = $this->cloneQuery($queryBuilder->getQuery());
     $builder = new MaskBuilder();
     foreach ($permissionDef->getPermissions() as $permission) {
         $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission));
         $builder->add($mask);
     }
     $query->setHint('acl.mask', $builder->get());
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Kunstmaan\\AdminBundle\\Helper\\Security\\Acl\\AclWalker');
     $rootEntity = $permissionDef->getEntity();
     $rootAlias = $permissionDef->getAlias();
     // If either alias or entity was not specified - use default from QueryBuilder
     if (empty($rootEntity) || empty($rootAlias)) {
         $rootEntities = $queryBuilder->getRootEntities();
         $rootAliases = $queryBuilder->getRootAliases();
         $rootEntity = $rootEntities[0];
         $rootAlias = $rootAliases[0];
     }
     $query->setHint('acl.root.entity', $rootEntity);
     $query->setHint('acl.extra.query', $this->getPermittedAclIdsSQLForUser($query));
     $classMeta = $this->em->getClassMetadata($rootEntity);
     $entityRootTableName = $this->quoteStrategy->getTableName($classMeta, $this->em->getConnection()->getDatabasePlatform());
     $query->setHint('acl.entityRootTableName', $entityRootTableName);
     $query->setHint('acl.entityRootTableDqlAlias', $rootAlias);
     return $query;
 }
Example #19
0
 /**
  * Adds filter by $entity DQL to the given query builder
  *
  * @param QueryBuilder $qb                  The query builder that is used to get the list of activities
  * @param string       $entityClass         The target entity class
  * @param mixed        $entityId            The target entity id
  * @param string|null  $activityEntityClass This parameter should be specified
  *                                          if the query has more than one root entity
  *
  * @throws \RuntimeException
  */
 public function addFilterByTargetEntity(QueryBuilder $qb, $entityClass, $entityId, $activityEntityClass = null)
 {
     $activityEntityAlias = null;
     $rootEntities = $qb->getRootEntities();
     if (empty($rootEntities)) {
         throw new \RuntimeException('The query must have at least one root entity.');
     }
     if (empty($activityEntityClass)) {
         if (count($rootEntities) > 1) {
             throw new \RuntimeException('The $activityEntityClass must be specified if the query has several root entities.');
         }
         $activityEntityClass = $rootEntities[0];
         $activityEntityAlias = $qb->getRootAliases()[0];
     } else {
         $normalizedActivityEntityClass = ClassUtils::getRealClass($this->entityClassResolver->getEntityClass($activityEntityClass));
         foreach ($rootEntities as $i => $className) {
             $className = $this->entityClassResolver->getEntityClass($className);
             if ($className === $normalizedActivityEntityClass) {
                 $activityEntityAlias = $qb->getRootAliases()[$i];
                 break;
             }
         }
         if (empty($activityEntityAlias)) {
             throw new \RuntimeException(sprintf('The "%s" must be the root entity.', $activityEntityClass));
         }
     }
     $activityIdentifierFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($activityEntityClass);
     $targetIdentifierFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($entityClass);
     $filterQuery = $qb->getEntityManager()->createQueryBuilder()->select(sprintf('filterActivityEntity.%s', $activityIdentifierFieldName))->from($activityEntityClass, 'filterActivityEntity')->innerJoin(sprintf('filterActivityEntity.%s', ExtendHelper::buildAssociationName($entityClass, ActivityScope::ASSOCIATION_KIND)), 'filterTargetEntity')->where(sprintf('filterTargetEntity.%s = :targetEntityId', $targetIdentifierFieldName))->getQuery();
     $qb->andWhere($qb->expr()->in(sprintf('%s.%s', $activityEntityAlias, $activityIdentifierFieldName), $filterQuery->getDQL()))->setParameter('targetEntityId', $entityId);
 }
 /**
  * Gets the root entity of the filter criteria.
  *
  * <code>
  *     $filter = $service->buildFilterCriteria('u')
  *     
  *     $filter->getRootEntity(); // 'User'
  * </code>
  *
  * @return string
  */
 public function getRootEntity()
 {
     $rootEntities = $this->queryBuilder->getRootEntities();
     return $rootEntities[0];
 }
Example #21
0
 private function buildFieldNameMap(QueryBuilder $qb, Search $search)
 {
     $fieldNameMap = [];
     $entityFieldNames = $qb->getEntityManager()->getClassMetadata($qb->getRootEntities()[0])->getFieldNames();
     $currentJoins = [];
     $fieldNames = [];
     foreach ($search->getFieldFilters() as $fieldFilter) {
         $fieldNames[] = $fieldFilter->getField();
     }
     foreach ($search->getOrderBy() as $orderBy) {
         $fieldNames[] = $orderBy->getField();
     }
     $fieldNames = array_unique($fieldNames);
     foreach ($fieldNames as $fieldName) {
         $pieces = explode('.', $fieldName);
         if (in_array($fieldName, $entityFieldNames) || count($pieces) == 1) {
             $fieldNameMap[$fieldName] = $qb->getRootAlias() . '.' . $fieldName;
         } else {
             $lastAlias = $qb->getRootAlias();
             foreach ($pieces as $i => $piece) {
                 if ($i == count($pieces) - 1) {
                     $fieldNameMap[$fieldName] = $pieces[$i - 1] . '.' . $piece;
                 } else {
                     $currentJoin = $lastAlias . '.' . $piece;
                     if (!in_array($currentJoin, $currentJoins)) {
                         $qb->leftJoin($currentJoin, $piece);
                         $currentJoins[] = $currentJoin;
                     }
                     $lastAlias = $piece;
                 }
             }
         }
     }
     return $fieldNameMap;
 }
Example #22
0
 /**
  * @param int $index
  * @return ClassMetadata
  */
 protected function getClassMetadata($index = 0)
 {
     $rootClasses = $this->qb->getRootEntities();
     return $this->qb->getEntityManager()->getClassMetadata($rootClasses[$index]);
 }
Example #23
0
 /**
  * @param QueryBuilder $qb
  *
  * @return string
  *
  * @throws \RuntimeException
  */
 public function getRootEntityClass(QueryBuilder $qb)
 {
     $entities = $qb->getRootEntities();
     if (count($entities) !== 1) {
         if (count($entities) === 0) {
             throw new \RuntimeException('Cannot get root entity class. A query builder has no root entity.');
         } else {
             throw new \RuntimeException('Cannot get root entity class. A query builder has more than one root entity.');
         }
     }
     return $this->resolveEntityClass($entities[0]);
 }
 /**
  * @param QueryBuilder $qb
  * @param string       $alias
  *
  * @return null
  */
 protected function getRootEntity(QueryBuilder $qb, $alias)
 {
     $entity = null;
     $rootAliases = $qb->getRootAliases();
     for ($i = 0; $i < count($rootAliases); $i++) {
         if ($rootAliases[$i] === $alias) {
             $entity = $qb->getRootEntities()[$i];
             break;
         }
     }
     return $entity;
 }
Example #25
0
 /**
  * Get the results from the sql after adding the.
  *
  * @param VictoireQueryInterface $containerEntity
  * @param QueryBuilder           $itemsQueryBuilder
  *
  * @throws \Exception
  *
  * @return QueryBuilder The QB to list of objects
  */
 public function buildWithSubQuery(VictoireQueryInterface $containerEntity, QueryBuilder $itemsQueryBuilder, EntityManager $em)
 {
     //get the query of the container entity
     $query = $containerEntity->getQuery();
     if (method_exists($containerEntity, 'additionnalQueryPart')) {
         $query = $containerEntity->additionnalQueryPart();
     }
     if ($query !== '' && $query !== null) {
         $subQuery = $em->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item');
         $itemsQueryBuilder->andWhere(sprintf('main_item.id IN (%s %s)', $subQuery->getQuery()->getDql(), $query));
     }
     //Add ORDER BY if set
     if ($orderBy = json_decode($containerEntity->getOrderBy(), true)) {
         foreach ($orderBy as $addOrderBy) {
             $reflectionClass = new \ReflectionClass($itemsQueryBuilder->getRootEntities()[0]);
             $reflectionProperty = $reflectionClass->getProperty($addOrderBy['by']);
             //If ordering field is an association, treat it as a boolean
             if ($this->isAssociationField($reflectionProperty)) {
                 $itemsQueryBuilder->addSelect('CASE WHEN main_item.' . $addOrderBy['by'] . ' IS NULL THEN 0 ELSE 1 END AS HIDDEN caseOrder');
                 $itemsQueryBuilder->addOrderBy('caseOrder', $addOrderBy['order']);
             } else {
                 $itemsQueryBuilder->addOrderBy('main_item.' . $addOrderBy['by'], $addOrderBy['order']);
             }
         }
     }
     $currentView = $this->currentView;
     // If the current page is a BEP, we parse all its properties and inject them as query parameters
     if ($currentView() && $currentView() instanceof BusinessPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) {
         // NEW
         $metadatas = $em->getClassMetadata(get_class($currentEntity));
         foreach ($metadatas->fieldMappings as $fieldName => $field) {
             if (strpos($query, ':' . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName));
             }
         }
         foreach ($metadatas->associationMappings as $fieldName => $field) {
             if (strpos($query, ':' . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId());
             }
         }
         if (strpos($query, ':currentEntity') !== false) {
             $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId());
         }
     } elseif ($currentView() instanceof BusinessTemplate && strpos($query, ':currentEntity') !== false) {
         $itemsQueryBuilder->setParameter('currentEntity', $containerEntity->getEntity()->getId());
     }
     if (strpos($query, ':currentUser') !== false && is_object($this->getCurrentUser())) {
         if (is_object($this->getCurrentUser())) {
             $itemsQueryBuilder->setParameter('currentUser', $this->getCurrentUser()->getId());
         } else {
             throw new AccessDeniedException();
         }
     }
     return $itemsQueryBuilder;
 }
Example #26
0
 /**
  * Get the results from the sql after adding the.
  *
  * @param mixed        $containerEntity
  * @param QueryBuilder $itemsQueryBuilder
  *
  * @throws \Exception
  *
  * @return QueryBuilder The QB to list of objects
  */
 public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder, EntityManager $em)
 {
     //test the container entity
     if ($containerEntity === null) {
         throw new \Exception('The container entity parameter must not be null.');
     }
     //verify that the object has the query trait
     //@todo please use an interface and cast with it in the method signature
     $this->checkObjectHasQueryTrait($containerEntity);
     //get the query of the container entity
     $query = $containerEntity->getQuery();
     if (method_exists($containerEntity, 'additionnalQueryPart')) {
         $query = $containerEntity->additionnalQueryPart();
     }
     if ($query !== '' && $query !== null) {
         $subQuery = $em->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item');
         $itemsQueryBuilder->andWhere('main_item.id IN (' . $subQuery->getQuery()->getDql() . ' ' . $query . ')');
     }
     //Add ORDER BY if set
     if (method_exists($containerEntity, 'getOrderBy')) {
         $orderBy = json_decode($containerEntity->getOrderBy(), true);
         if ($orderBy) {
             foreach ($orderBy as $addOrderBy) {
                 $reflectionClass = new \ReflectionClass($itemsQueryBuilder->getRootEntities()[0]);
                 $reflectionProperty = $reflectionClass->getProperty($addOrderBy['by']);
                 //If ordering field is an association, treat it as a boolean
                 if ($this->isAssociationField($reflectionProperty)) {
                     $itemsQueryBuilder->addSelect('CASE WHEN main_item.' . $addOrderBy['by'] . ' IS NULL THEN 0 ELSE 1 END AS HIDDEN caseOrder');
                     $itemsQueryBuilder->addOrderBy('caseOrder', $addOrderBy['order']);
                 } else {
                     $itemsQueryBuilder->addOrderBy('main_item.' . $addOrderBy['by'], $addOrderBy['order']);
                 }
             }
         }
     }
     $currentView = $this->currentView;
     // If the current page is a BEP, we parse all its properties and inject them as query parameters
     if ($currentView() && $currentView() instanceof BusinessPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) {
         // NEW
         $metadatas = $em->getClassMetadata(get_class($currentEntity));
         foreach ($metadatas->fieldMappings as $fieldName => $field) {
             if (strpos($query, ':' . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName));
             }
         }
         foreach ($metadatas->associationMappings as $fieldName => $field) {
             if (strpos($query, ':' . $fieldName) !== false) {
                 $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId());
             }
         }
         if (strpos($query, ':currentEntity') !== false) {
             $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId());
         }
     }
     return $itemsQueryBuilder;
 }
 /**
  * This will clone the original query and apply acl
  *
  * @param QueryBuilder  $queryBuilder Builder
  * @param array         $permissions  Permission mask
  * @param UserInterface $user         User
  *
  * @return Query
  */
 public function apply(QueryBuilder $queryBuilder, array $permissions = array("VIEW"), UserInterface $user = null)
 {
     $whereQueryParts = $queryBuilder->getDQLPart('where');
     if (empty($whereQueryParts)) {
         $fromQueryParts = $queryBuilder->getDQLPart('from');
         $firstFromQueryAlias = $fromQueryParts[0]->getAlias();
         // this will help in cases where no where query is specified,
         // where query is required to walk in where clause
         $queryBuilder->where($firstFromQueryAlias . '.id IS NOT NULL');
     }
     $query = $this->cloneQuery($queryBuilder->getQuery());
     $builder = new MaskBuilder();
     foreach ($permissions as $permission) {
         $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission));
         $builder->add($mask);
     }
     $query->setHint('acl.mask', $builder->get());
     $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->aclWalkerClass);
     $entities = $queryBuilder->getRootEntities();
     $query->setHint('acl.root.entities', $entities);
     $query->setHint('acl.extra.query', $this->getPermittedIdsACLSQLForUser($query, $queryBuilder, $user));
     //$class = $this->getEntityManager()->getClassMetadata($entities[0]);
     //$entityRootTableName = $class->getQuotedTableName($this->getEntityManager()->getConnection()->getDatabasePlatform());
     /** @var QuoteStrategy $quoteStrategy */
     $quoteStrategy = $this->getEntityManager()->getConfiguration()->getQuoteStrategy();
     $entityRootTableName = $quoteStrategy->getTableName($this->getEntityManager()->getClassMetadata($entities[0]), $this->getEntityManager()->getConnection()->getDatabasePlatform());
     $entityRootAliases = $queryBuilder->getRootAliases();
     $entityRootAlias = $entityRootAliases[0];
     $query->setHint('acl.entityRootTableName', $entityRootTableName);
     $query->setHint('acl.entityRootTableDqlAlias', $entityRootAlias);
     return $query;
 }
Example #28
0
 /**
  * @author Franlin Rivero Grcia <*****@*****.**>
  * @param EntityManager $em
  * @param QueryBuilder $qb
  * @param array $filters Arreglo asociativo campo => valor
  * @param ResultType $resultType
  * @param type $order
  * @param type $page
  * @return array
  */
 public static function filterRecordsQB(EntityManager $em, QueryBuilder $qb, $filters = array(), $order = null, $resultType = ResultType::ObjectType)
 {
     $rootEntityA = $qb->getRootEntities();
     $rootEntity = $rootEntityA[0];
     $meta = $em->getClassMetadata($rootEntity);
     //        $meta  = $em->getClassMetadata($class);
     $alias = UtilRepository2::createAlias($rootEntity);
     $fields = $meta->getFieldNames();
     $asoc = $meta->getAssociationNames();
     //        if(count($qb->getDQLPart('groupBy')) > 0)
     //            foreach($fields as $field )
     //                $qb->addGroupBy($alias.".$field");
     UtilRepository2::fieldFilter($alias, $filters, $fields, $asoc, $meta, $qb);
     UtilRepository2::putOrder($alias, $fields, $order, $qb);
     //        print $qb->getQuery()->getSQL()."<br/>";
     //        die;
     return UtilRepository2::doResult($qb, $resultType, $alias);
 }