/** * @param Query $query */ protected function applyTranslatorGedmoHints(Query &$query) { if (BELCEBUR_GEDMO_TRANSLATION_LOCALE !== 'BELCEBUR_GEDMO_TRANSLATION_LOCALE') { $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->gedmoWalker); $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, BELCEBUR_GEDMO_TRANSLATION_LOCALE); $query->setHint(TranslatableListener::HINT_FALLBACK, TRUE); } }
/** * @param Query $query * @param string $locale * @throws \Exception */ protected function setTranslatableQueryHints(Query $query, $locale) { if (!class_exists('Gedmo\\Translatable\\TranslatableListener')) { throw new \Exception('"Translatable" extension missing. "stof/doctrine-extensions-bundle" needs to be installed'); } $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, 1); }
/** * {@inheritdoc} */ public function apply($fromAlias, $fromIdentifier, $resourcePrefix, array $requesterIdentifiers, $mask, array $orX = []) { $this->query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'AlexDpy\\Acl\\Database\\Filter\\DoctrineOrmAclWalker'); $this->query->setHint('acl_permissions_table_name', $this->getAclSchema()->getPermissionsTableName()); $this->query->setHint('acl_resource_prefix', $resourcePrefix); $this->query->setHint('acl_requester_identifiers', $requesterIdentifiers); $this->query->setHint('acl_mask', $mask); $this->query->setHint('acl_from_alias', $fromAlias); $this->query->setHint('acl_from_identifier', $fromIdentifier); $this->query->setHint('acl_or_x', $orX); return $this->query; }
/** * Apply ACL filter * * @param QueryBuilder | Query $query * @param array $permissions * @param string | UserInterface $identity * @param string $alias * @param array|Query|QueryBuilder $extraCriteria * * @return Query */ public function apply($query, array $permissions = array('VIEW'), $identity = null, $alias = null, $extraCriteria = false) { if (null === $identity) { $token = $this->securityContext->getToken(); $identity = $token->getUser(); } $query->setHint(static::HINT_ACL_EXTRA_CRITERIA, $this->getExtraCriteria($extraCriteria)); if ($query instanceof QueryBuilder) { $query = $this->cloneQuery($query->getQuery()); } elseif ($query instanceof Query) { $query = $this->cloneQuery($query); } else { throw new \Exception(); } $maskBuilder = new MaskBuilder(); foreach ($permissions as $permission) { $mask = constant(get_class($maskBuilder) . '::MASK_' . strtoupper($permission)); $maskBuilder->add($mask); } $entity = $this->getEntityFromAlias($query, $alias); $metadata = $entity['metadata']; $alias = $entity['alias']; $table = $metadata->getQuotedTableName($this->em->getConnection()->getDatabasePlatform()); $aclQuery = $this->getExtraQuery($this->getClasses($metadata), $this->getIdentifiers($identity), $maskBuilder->get()); $hintAclMetadata = false !== $query->getHint('acl.metadata') ? $query->getHint('acl.metadata') : array(); $hintAclMetadata[] = array('query' => $aclQuery, 'table' => $table, 'alias' => $alias); $query->setHint('acl.metadata', $hintAclMetadata); $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->aclWalker); return $query; }
/** * Adds a hint to a query object * * @param Query $query * @param string $name * @param mixed $value * * @return bool TRUE if the hint is added; otherwise, FALSE */ public function addHint(Query $query, $name, $value) { $result = false; if ($name === Query::HINT_CUSTOM_TREE_WALKERS) { $walkers = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS); if (false === $walkers) { $walkers = [$value]; $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $walkers); $result = true; } elseif (!in_array($value, $walkers, true)) { $walkers[] = $value; $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $walkers); $result = true; } } elseif ($name === Query::HINT_CUSTOM_OUTPUT_WALKER) { if ($query->getHint($name) !== $value) { $query->setHint($name, $value); $result = true; } } else { $query->setHint($name, $value); $result = true; } return $result; }
/** * @param \Doctrine\ORM\Query $query The Doctrine Query * @param array $fields Fields to export * @param string $dateTimeFormat */ public function __construct(Query $query, array $fields, $dateTimeFormat = 'r') { $this->query = clone $query; $this->query->setParameters($query->getParameters()); foreach ($query->getHints() as $name => $value) { $this->query->setHint($name, $value); } $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); $this->propertyPaths = array(); foreach ($fields as $name => $field) { if (is_string($name) && is_string($field)) { $this->propertyPaths[$name] = new PropertyPath($field); } else { $this->propertyPaths[$field] = new PropertyPath($field); } } $this->dateTimeFormat = $dateTimeFormat; }
/** * Updates the configured query object with the where-clause and query-hints. * * @param string $prependQuery Prepends this string to the where-clause * (" WHERE " or " AND " for example) * * @return self */ public function updateQuery($prependQuery = ' WHERE ') { $whereCase = $this->getWhereClause($prependQuery); if ('' !== $whereCase) { $this->query->setDQL($this->query->getDQL() . $whereCase); $this->query->setHint($this->getQueryHintName(), $this->getQueryHintValue()); } return $this; }
/** * Add a custom TreeWalker $walker class name to * be included in the CustomTreeWalker hint list * of the given $query * * @param Query $query * @param string $walker * @return void */ public static function addCustomTreeWalker(Query $query, $walker) { $customTreeWalkers = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS); if ($customTreeWalkers !== false && is_array($customTreeWalkers)) { $customTreeWalkers = array_merge($customTreeWalkers, array($walker)); } else { $customTreeWalkers = array($walker); } $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $customTreeWalkers); }
/** * @param \Doctrine\ORM\Query $query The Doctrine Query * @param array $fields Fields to export * @param string $dateTimeFormat */ public function __construct(Query $query, array $fields, $dateTimeFormat = 'r') { $this->query = clone $query; $this->query->setParameters($query->getParameters()); foreach ($query->getHints() as $name => $value) { $this->query->setHint($name, $value); } // Note : will be deprecated in Symfony 3.0, conserved for 2.2 compatibility // Use createPropertyAccessor() for 3.0 // @see Symfony\Component\PropertyAccess\PropertyAccess $this->propertyAccessor = PropertyAccess::getPropertyAccessor(); $this->propertyPaths = array(); foreach ($fields as $name => $field) { if (is_string($name) && is_string($field)) { $this->propertyPaths[$name] = new PropertyPath($field); } else { $this->propertyPaths[$field] = new PropertyPath($field); } } $this->dateTimeFormat = $dateTimeFormat; }
public function setHint(\Doctrine\ORM\Query $query) { return $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); }
/** * Appends a custom tree walker to the tree walkers hint. * * @param Query $query * @param string $walkerClass */ private function appendTreeWalker(Query $query, $walkerClass) { $hints = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS); if ($hints === false) { $hints = array(); } $hints[] = $walkerClass; $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $hints); }
/** * Returns valid IDs for a specific entity with ACL restrictions for current user applied * * @param PermissionDefinition $permissionDef * * @throws InvalidArgumentException * * @return array */ public function getAllowedEntityIds(PermissionDefinition $permissionDef) { $rootEntity = $permissionDef->getEntity(); if (empty($rootEntity)) { throw new InvalidArgumentException("You have to provide an entity class name!"); } $builder = new MaskBuilder(); foreach ($permissionDef->getPermissions() as $permission) { $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission)); $builder->add($mask); } $query = new Query($this->em); $query->setHint('acl.mask', $builder->get()); $query->setHint('acl.root.entity', $rootEntity); $sql = $this->getPermittedAclIdsSQLForUser($query); $rsm = new ResultSetMapping(); $rsm->addScalarResult('id', 'id'); $nativeQuery = $this->em->createNativeQuery($sql, $rsm); $transform = function ($item) { return $item['id']; }; $result = array_map($transform, $nativeQuery->getScalarResult()); return $result; }
/** * Sets hints for result query * * @param Query $query */ protected function setQueryHints(Query $query) { if (!empty($this->queryHints)) { foreach ($this->queryHints as $name => $value) { if (defined("Doctrine\\ORM\\Query::{$name}")) { $name = constant("Doctrine\\ORM\\Query::{$name}"); } $query->setHint($name, $value); } } }
/** * Add hints to the query * * @param Query $query Query * @param string|null $locale Lecale to which fallback * * @return Query */ public function setTranslatableHint(Query $query, $locale = null) { $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); $query->setHint(TranslatableListener::HINT_INNER_JOIN, false); $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); $query->setHint(TranslatableListener::HINT_FALLBACK, true); return $query; }
/** * Adds a Query hint to a Query Object * @param \Doctrine\ORM\Query $query * @return \Doctrine\ORM\Query */ public function addHintToQuery(\Doctrine\ORM\Query $query) { return $query->setHint($this->getConfiguration()->GetQueryHintName(), $this->getConfiguration()->GetQueryHintValue()); }
/** * Loads all translations with all translatable * fields from the given entity * * @link https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#entity-domain-object * * @param Query $query * @param string $locale * @param string $result = {'array', 'object'} * @param boolean $INNER_JOIN * @param boolean $FALLBACK * @param boolean $lazy_loading * * @return Query * @access public * @author Etienne de Longeaux <*****@*****.**> */ public function setTranslatableHints(Query $query, $locale, $INNER_JOIN = false, $FALLBACK = true, $lazy_loading = true) { // BE CARFULL ::: Strange Issue with Query Hint and APC $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); // if you use memcache or apc. You should set locale and other options like fallbacks to query through hints. Otherwise the query will be cached with a first used locale $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); // take locale from session or request etc. if ($INNER_JOIN) { $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_INNER_JOIN, $INNER_JOIN); // will use INNER joins for translations instead of LEFT joins, so that in case if you do not want untranslated records in your result set for instance. } if (!$lazy_loading) { // to avoid lazy-loading. $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true); } $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, $FALLBACK); // fallback to default values in case if record is not translated // $config = $this->container->get('doctrine')->getManager()->getConfiguration(); // if ($config->getCustomHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION) === null) { // $config->addCustomHydrationMode( // TranslationWalker::HYDRATE_OBJECT_TRANSLATION, // 'Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator' // ); // } $query->setHydrationMode(\Gedmo\Translatable\Query\TreeWalker\TranslationWalker::HYDRATE_OBJECT_TRANSLATION); $query->setHint(Query::HINT_REFRESH, true); return $query; }
/** * Given the Query it returns a new query that is a paginatable query * using a modified subselect. * * @param Query $query * @return Query */ public static function getPaginateQuery(Query $query, $offset, $itemCountPerPage, array $hints = array()) { foreach ($hints as $name => $hint) { $query->setHint($name, $hint); } return $query->setFirstResult($offset)->setMaxResults($itemCountPerPage); }
/** * Loads all translations with all translatable * fields from the given entity * * @link https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md#entity-domain-object * * @param object $entity Must implement Translatable * @return \Doctrine\ORM\Query * @param string $locale * @param bool $INNER_JOIN * @access public * * @author Etienne de Longeaux <*****@*****.**> */ public function setTranslatableHints(Query $query, $locale, $INNER_JOIN = false, $FALLBACK = true, $lazy_loading = true) { $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'); if ($INNER_JOIN) { $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_INNER_JOIN, $INNER_JOIN); // will use INNER joins for translations instead of LEFT joins, so that in case if you do not want untranslated records in your result set for instance. } if (!$lazy_loading) { // to avoid lazy-loading. $query->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true); } $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_FALLBACK, $FALLBACK); return $query; }
protected function setTranslationHints(Query $query, $locale = null) { $locale = null === $locale ? $this->defaultLocale : $locale; $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker')->setHint(TranslatableListener::HINT_FALLBACK, 1); if ($locale) { $query->setHint(TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale); } return $query; }
/** * Helper function to add mysql specified command to increase the sql performance. * * @param \Doctrine\ORM\Query $query * @param null $index Name of the forced index * @param bool $straightJoin true or false. Allow to add STRAIGHT_JOIN select condition * @param bool $sqlNoCache * @return Query */ public function addCustomHints(Query $query, $index = null, $straightJoin = false, $sqlNoCache = false) { $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Shopware\\Components\\Model\\Query\\SqlWalker\\ForceIndexWalker'); if ($straightJoin === true) { $query->setHint(SqlWalker\ForceIndexWalker::HINT_STRAIGHT_JOIN, true); } if ($index !== null) { $query->setHint(SqlWalker\ForceIndexWalker::HINT_FORCE_INDEX, $index); } if ($sqlNoCache === true) { $query->setHint(SqlWalker\ForceIndexWalker::HINT_SQL_NO_CACHE, true); } return $query; }
/** * Add to query share condition * * @param Query $query * @param Node|null $shareCondition */ protected function addShareConditionToQuery(Query $query, $shareCondition) { if ($shareCondition) { $hints = $query->getHints(); if (!empty($hints[Query::HINT_CUSTOM_TREE_WALKERS])) { $customHints = !in_array(self::ORO_ACL_WALKER, $hints[Query::HINT_CUSTOM_TREE_WALKERS]) ? array_merge($hints[Query::HINT_CUSTOM_TREE_WALKERS], [self::ORO_ACL_WALKER]) : $hints[Query::HINT_CUSTOM_TREE_WALKERS]; } else { $customHints = [self::ORO_ACL_WALKER]; } $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $customHints); $query->setHint(AclWalker::ORO_ACL_SHARE_CONDITION, $shareCondition); } }