예제 #1
0
    /**
     * @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;
    }
예제 #2
0
 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;
 }
예제 #4
0
    /**
     * 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;
    }
예제 #5
0
 /**
  * {@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;
 }
예제 #6
0
    /**
     * @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;
    }
예제 #7
0
    /**
     * {@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;
    }
예제 #8
0
 /**
  * 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;
 }