/** * @param $fromClause * * @return string */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause); $aclMetadata = $this->getQuery()->getHint('acl.metadata'); $extraQueries = $this->getQuery()->getHint(AclFilter::HINT_ACL_EXTRA_CRITERIA); if ($aclMetadata) { foreach ($aclMetadata as $key => $metadata) { $alias = $metadata['alias']; $query = $metadata['query']; $table = $metadata['table']; $tableAlias = $this->getSQLTableAlias($table, $alias); $aclAlias = 'ta' . $key . '_'; if ($extraQueries) { $extraCriteriaSql = $this->parseExtraQueries($extraQueries, $tableAlias); $aclSql = <<<ACL_SQL INNER JOIN ({$query}) {$aclAlias} ON ({$tableAlias}.id = {$aclAlias}.id OR ({$extraCriteriaSql})) ACL_SQL; } else { $aclSql = <<<ACL_SQL INNER JOIN ({$query}) {$aclAlias} ON ({$tableAlias}.id = {$aclAlias}.id) ACL_SQL; } $sql .= ' ' . $aclSql; } } return $sql; }
public function walkFromClause($fromClause) { $result = parent::walkFromClause($fromClause); if ($index = $this->getQuery()->getHint(self::HINT_FORCE_INDEX)) { $result = preg_replace('#(\\bFROM\\s*\\w+\\s*\\w+)#', '\\1 FORCE INDEX (' . $index . ')', $result); } return $result; }
/** * Walks down a FromClause AST node, thereby generating the appropriate SQL. * * @param string $fromClause fromClause * * @return string The SQL. */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause); $tableAlias = $this->getSQLTableAlias($this->getQuery()->getHint('acl.entityRootTableName'), $this->getQuery()->getHint('acl.entityRootTableDqlAlias')); $extraQuery = $this->getQuery()->getHint('acl.extra.query'); $tempAclView = sprintf(' JOIN (%s) ta_ ON %s.id = ta_.id ', $extraQuery, $tableAlias); return $sql . $tempAclView; }
/** * Walks down a FromClause AST node, thereby generating the appropriate SQL. * * @param string $fromClause * * @return string The SQL. */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause); $tableAlias = $this->getSQLTableAlias($this->getQuery()->getHint('acl.entityRootTableName'), $this->getQuery()->getHint('acl.entityRootTableDqlAlias')); $extraQuery = $this->getQuery()->getHint('acl.extra.query'); $tempAclView = <<<tempAclView JOIN ({$extraQuery}) ta_ ON {$tableAlias}.id = ta_.id tempAclView; return $sql . ' ' . $tempAclView; }
/** * {@inheritdoc} */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause); $prefix = $this->getQuery()->getHint('acl_resource_prefix'); $fromAlias = $this->getQuery()->getHint('acl_from_alias'); $fromIdentifier = $this->getQuery()->getHint('acl_from_identifier'); $permissionsTableName = $this->getQuery()->getHint('acl_permissions_table_name'); $resourceCondition = $this->getConnection()->getDatabasePlatform()->getConcatExpression($this->getConnection()->quote($prefix), $this->dqlToSqlReference($fromAlias, $fromIdentifier)); $sql .= ' LEFT JOIN ' . $permissionsTableName . ' acl_p ON acl_p.resource = ' . $resourceCondition; return $sql; }
/** * @param \Doctrine\ORM\Query\AST\FromClause $fromClause * * @return string */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause) . ' '; $aclJoin = $this->getQuery()->getHint('acl_join'); $oidReference = $this->getQuery()->getHint('acl_filter_oid_reference'); $objectIdentifierComparison = $this->getQuery()->getHint('acl_object_identifier_comparison'); $orX = $this->getQuery()->getHint('acl_filter_or_x'); $joinType = empty($orX) ? 'INNER' : 'LEFT'; $newOidReference = $this->DQLToSQLReference($oidReference); $sql .= <<<SQL {$joinType} JOIN ({$aclJoin}) acl ON CAST({$newOidReference} AS CHAR(100)) = {$objectIdentifierComparison} SQL; return $sql; }
/** * {@inheritdoc} */ public function walkFromClause($fromClause) { $sql = parent::walkFromClause($fromClause); $aclMetadata = $this->getQuery()->getHint('acl.metadata'); if ($aclMetadata) { foreach ($aclMetadata as $key => $metadata) { $alias = $metadata['alias']; $query = $metadata['query']; $table = $metadata['table']; $tableAlias = $this->getSQLTableAlias($table, $alias); $aclAlias = 'ta' . $key . '_'; $aclSql = <<<ACL_SQL INNER JOIN ({$query}) {$aclAlias} ON {$tableAlias}.id = {$aclAlias}.id ACL_SQL; $sql .= ' ' . $aclSql; } } return $sql; }
/** * Initializes a new <tt>MultiTableDeleteExecutor</tt>. * * @param \Doctrine\ORM\Query\AST\Node $AST The root AST node of the DQL query. * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker The walker used for SQL generation from the AST. * * @internal Any SQL construction and preparation takes place in the constructor for * best performance. With a query cache the executor will be cached. */ public function __construct(AST\Node $AST, $sqlWalker) { $em = $sqlWalker->getEntityManager(); $conn = $em->getConnection(); $platform = $conn->getDatabasePlatform(); $quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); $primaryClass = $em->getClassMetadata($AST->deleteClause->abstractSchemaName); $primaryDqlAlias = $AST->deleteClause->aliasIdentificationVariable; $rootClass = $em->getClassMetadata($primaryClass->rootEntityName); $tempTable = $platform->getTemporaryTableName($rootClass->getTemporaryIdTableName()); $idColumnNames = $rootClass->getIdentifierColumnNames(); $idColumnList = implode(', ', $idColumnNames); // 1. Create an INSERT INTO temptable ... SELECT identifiers WHERE $AST->getWhereClause() $sqlWalker->setSQLTableAlias($primaryClass->getTableName(), 't0', $primaryDqlAlias); $this->_insertSql = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ')' . ' SELECT t0.' . implode(', t0.', $idColumnNames); $rangeDecl = new AST\RangeVariableDeclaration($primaryClass->name, $primaryDqlAlias); $fromClause = new AST\FromClause(array(new AST\IdentificationVariableDeclaration($rangeDecl, null, array()))); $this->_insertSql .= $sqlWalker->walkFromClause($fromClause); // Append WHERE clause, if there is one. if ($AST->whereClause) { $this->_insertSql .= $sqlWalker->walkWhereClause($AST->whereClause); } // 2. Create ID subselect statement used in DELETE ... WHERE ... IN (subselect) $idSubselect = 'SELECT ' . $idColumnList . ' FROM ' . $tempTable; // 3. Create and store DELETE statements $classNames = array_merge($primaryClass->parentClasses, array($primaryClass->name), $primaryClass->subClasses); foreach (array_reverse($classNames) as $className) { $tableName = $quoteStrategy->getTableName($em->getClassMetadata($className), $platform); $this->_sqlStatements[] = 'DELETE FROM ' . $tableName . ' WHERE (' . $idColumnList . ') IN (' . $idSubselect . ')'; } // 4. Store DDL for temporary identifier table. $columnDefinitions = array(); foreach ($idColumnNames as $idColumnName) { $columnDefinitions[$idColumnName] = array('notnull' => true, 'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName))); } $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')'; $this->_dropTempTableSql = $platform->getDropTemporaryTableSQL($tempTable); }
/** * Initializes a new <tt>MultiTableUpdateExecutor</tt>. * * Internal note: Any SQL construction and preparation takes place in the constructor for * best performance. With a query cache the executor will be cached. * * @param \Doctrine\ORM\Query\AST\Node $AST The root AST node of the DQL query. * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker The walker used for SQL generation from the AST. */ public function __construct(AST\Node $AST, $sqlWalker) { $em = $sqlWalker->getEntityManager(); $conn = $em->getConnection(); $platform = $conn->getDatabasePlatform(); $quoteStrategy = $em->getConfiguration()->getQuoteStrategy(); $updateClause = $AST->updateClause; $primaryClass = $sqlWalker->getEntityManager()->getClassMetadata($updateClause->abstractSchemaName); $rootClass = $em->getClassMetadata($primaryClass->rootEntityName); $updateItems = $updateClause->updateItems; $tempTable = $platform->getTemporaryTableName($rootClass->getTemporaryIdTableName()); $idColumnNames = $rootClass->getIdentifierColumnNames(); $idColumnList = implode(', ', $idColumnNames); // 1. Create an INSERT INTO temptable ... SELECT identifiers WHERE $AST->getWhereClause() $sqlWalker->setSQLTableAlias($primaryClass->getTableName(), 't0', $updateClause->aliasIdentificationVariable); $this->_insertSql = 'INSERT INTO ' . $tempTable . ' (' . $idColumnList . ')' . ' SELECT t0.' . implode(', t0.', $idColumnNames); $rangeDecl = new AST\RangeVariableDeclaration($primaryClass->name, $updateClause->aliasIdentificationVariable); $fromClause = new AST\FromClause([new AST\IdentificationVariableDeclaration($rangeDecl, null, [])]); $this->_insertSql .= $sqlWalker->walkFromClause($fromClause); // 2. Create ID subselect statement used in UPDATE ... WHERE ... IN (subselect) $idSubselect = 'SELECT ' . $idColumnList . ' FROM ' . $tempTable; // 3. Create and store UPDATE statements $classNames = array_merge($primaryClass->parentClasses, [$primaryClass->name], $primaryClass->subClasses); $i = -1; foreach (array_reverse($classNames) as $className) { $affected = false; $class = $em->getClassMetadata($className); $updateSql = 'UPDATE ' . $quoteStrategy->getTableName($class, $platform) . ' SET '; foreach ($updateItems as $updateItem) { $field = $updateItem->pathExpression->field; if (isset($class->fieldMappings[$field]) && !isset($class->fieldMappings[$field]['inherited']) || isset($class->associationMappings[$field]) && !isset($class->associationMappings[$field]['inherited'])) { $newValue = $updateItem->newValue; if (!$affected) { $affected = true; ++$i; } else { $updateSql .= ', '; } $updateSql .= $sqlWalker->walkUpdateItem($updateItem); if ($newValue instanceof AST\InputParameter) { $this->_sqlParameters[$i][] = $newValue->name; ++$this->_numParametersInUpdateClause; } } } if ($affected) { $this->_sqlStatements[$i] = $updateSql . ' WHERE (' . $idColumnList . ') IN (' . $idSubselect . ')'; } } // Append WHERE clause to insertSql, if there is one. if ($AST->whereClause) { $this->_insertSql .= $sqlWalker->walkWhereClause($AST->whereClause); } // 4. Store DDL for temporary identifier table. $columnDefinitions = []; foreach ($idColumnNames as $idColumnName) { $columnDefinitions[$idColumnName] = ['notnull' => true, 'type' => Type::getType(PersisterHelper::getTypeOfColumn($idColumnName, $rootClass, $em))]; } $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' (' . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')'; $this->_dropTempTableSql = $platform->getDropTemporaryTableSQL($tempTable); }
/** * {@inheritDoc} */ public function walkFromClause($fromClause) { $result = parent::walkFromClause($fromClause); $result .= $this->joinTranslations($fromClause); return $result; }
/** * {@inheritDoc} */ public function walkFromClause($fromClause) { $result = parent::walkFromClause($fromClause); $result .= $this->translationJoinSql[0]; return $result; }