/**
  * @param array $knownAliases
  *
  * @throws QueryException
  */
 private function verifyAllAliasesAreKnown(array $knownAliases)
 {
     foreach ($this->sqlParts['join'] as $fromAlias => $joins) {
         if (!isset($knownAliases[$fromAlias])) {
             throw QueryException::unknownAlias($fromAlias, array_keys($knownAliases));
         }
     }
 }
 /**
  * @param string $fromAlias
  * @param array  $knownAliases
  *
  * @return string
  */
 private function getSQLForJoins($fromAlias, array &$knownAliases)
 {
     $sql = '';
     if (isset($this->sqlParts['join'][$fromAlias])) {
         foreach ($this->sqlParts['join'][$fromAlias] as $join) {
             if (array_key_exists($join['joinAlias'], $knownAliases)) {
                 throw QueryException::nonUniqueAlias($join['joinAlias'], array_keys($knownAliases));
             }
             $sql .= ' ' . strtoupper($join['joinType']) . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] . ' ON ' . (string) $join['joinCondition'];
             $knownAliases[$join['joinAlias']] = true;
             $sql .= $this->getSQLForJoins($join['joinAlias'], $knownAliases);
         }
     }
     return $sql;
 }
 private function getSQLForSelect()
 {
     $query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM ';
     $fromClauses = array();
     $joinsPending = true;
     $joinAliases = array();
     // Loop through all FROM clauses
     foreach ($this->sqlParts['from'] as $from) {
         $fromClause = $from['table'] . ' ' . $from['alias'];
         if ($joinsPending && isset($this->sqlParts['join'][$from['alias']])) {
             foreach ($this->sqlParts['join'] as $joins) {
                 foreach ($joins as $join) {
                     $fromClause .= ' ' . strtoupper($join['joinType']) . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] . ' ON ' . (string) $join['joinCondition'];
                     $joinAliases[$join['joinAlias']] = true;
                 }
             }
             $joinsPending = false;
         }
         $fromClauses[$from['alias']] = $fromClause;
     }
     // loop through all JOIN clauses for validation purpose
     $knownAliases = array_merge($fromClauses, $joinAliases);
     foreach ($this->sqlParts['join'] as $fromAlias => $joins) {
         if (!isset($knownAliases[$fromAlias])) {
             throw QueryException::unknownAlias($fromAlias, array_keys($knownAliases));
         }
     }
     $query .= implode(', ', $fromClauses) . ($this->sqlParts['where'] !== null ? ' WHERE ' . (string) $this->sqlParts['where'] : '') . ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '') . ($this->sqlParts['having'] !== null ? ' HAVING ' . (string) $this->sqlParts['having'] : '') . ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : '');
     return $this->maxResults === null && $this->firstResult == null ? $query : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult);
 }
 /**
  * @return string
  *
  * @throws \Doctrine\DBAL\Query\QueryException
  */
 private function getSQLForSelect()
 {
     $query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM ';
     $fromClauses = array();
     $knownAliases = array();
     // Loop through all FROM clauses
     foreach ($this->sqlParts['from'] as $from) {
         $knownAliases[$from['alias']] = true;
         $fromClause = $from['table'] . ' ' . $from['alias'] . $this->getSQLForJoins($from['alias'], $knownAliases);
         $fromClauses[$from['alias']] = $fromClause;
     }
     foreach ($this->sqlParts['join'] as $fromAlias => $joins) {
         if (!isset($knownAliases[$fromAlias])) {
             throw QueryException::unknownAlias($fromAlias, array_keys($knownAliases));
         }
     }
     $query .= implode(', ', $fromClauses) . ($this->sqlParts['where'] !== null ? ' WHERE ' . (string) $this->sqlParts['where'] : '') . ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '') . ($this->sqlParts['having'] !== null ? ' HAVING ' . (string) $this->sqlParts['having'] : '') . ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : '');
     return $this->maxResults === null && $this->firstResult == null ? $query : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult);
 }