/**
  * Creates a left join list for translations
  * on used query components
  *
  * @todo: make it cleaner
  * @return string
  */
 private function getTranslationJoinsSql()
 {
     $result = array();
     $em = $this->getEntityManager();
     $ea = new TranslatableEventAdapter();
     $locale = $this->listener->getListenerLocale();
     foreach ($this->translatedComponents as $dqlAlias => $comp) {
         if (!isset($result[$comp['nestingLevel']])) {
             $result[$comp['nestingLevel']] = '';
         }
         $meta = $comp['metadata'];
         $config = $this->listener->getConfiguration($em, $meta->name);
         $transClass = $this->listener->getTranslationClass($ea, $meta->name);
         $transMeta = $em->getClassMetadata($transClass);
         $transTable = $transMeta->getQuotedTableName($this->platform);
         foreach ($config['fields'] as $field) {
             $compTableName = $meta->getQuotedTableName($this->platform);
             $compTblAlias = $this->getSQLTableAlias($compTableName, $dqlAlias);
             $tblAlias = $this->getSQLTableAlias('trans' . $compTblAlias . $field);
             $sql = ' LEFT JOIN ' . $transTable . ' ' . $tblAlias;
             $sql .= ' ON ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('locale', $this->platform) . ' = ' . $this->conn->quote($locale);
             $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('objectClass', $this->platform) . ' = ' . $this->conn->quote($meta->name);
             $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('field', $this->platform) . ' = ' . $this->conn->quote($field);
             $identifier = $meta->getSingleIdentifierFieldName();
             $colName = $meta->getQuotedColumnName($identifier, $this->platform);
             $colAlias = $this->getSQLColumnAlias($colName);
             $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('foreignKey', $this->platform) . ' = ' . $compTblAlias . '.' . $colName;
             $result[$comp['nestingLevel']] .= $sql;
             $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform);
         }
     }
     return $result;
 }
 /**
  * Creates a left join list for translations
  * on used query components
  *
  * @todo: make it cleaner
  * @return string
  */
 private function prepareTranslatedComponents()
 {
     $em = $this->getEntityManager();
     $ea = new TranslatableEventAdapter();
     $locale = $this->listener->getListenerLocale();
     $defaultLocale = $this->listener->getDefaultLocale();
     foreach ($this->translatedComponents as $dqlAlias => $comp) {
         $meta = $comp['metadata'];
         $config = $this->listener->getConfiguration($em, $meta->name);
         $transClass = $this->listener->getTranslationClass($ea, $meta->name);
         $transMeta = $em->getClassMetadata($transClass);
         $transTable = $transMeta->getQuotedTableName($this->platform);
         if ($locale !== $defaultLocale) {
             foreach ($config['fields'] as $field) {
                 $compTableName = $meta->getQuotedTableName($this->platform);
                 $compTblAlias = $this->getSQLTableAlias($compTableName, $dqlAlias);
                 $tblAlias = $this->getSQLTableAlias('trans' . $compTblAlias . $field);
                 $sql = ' LEFT JOIN ' . $transTable . ' ' . $tblAlias;
                 $sql .= ' ON ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('locale', $this->platform) . ' = ' . $this->conn->quote($locale);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('objectClass', $this->platform) . ' = ' . $this->conn->quote($meta->name);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('field', $this->platform) . ' = ' . $this->conn->quote($field);
                 $identifier = $meta->getSingleIdentifierFieldName();
                 $colName = $meta->getQuotedColumnName($identifier, $this->platform);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('foreignKey', $this->platform) . ' = ' . $compTblAlias . '.' . $colName;
                 isset($this->components[$dqlAlias]) ? $this->components[$dqlAlias] .= $sql : ($this->components[$dqlAlias] = $sql);
                 if ($this->needsFallback()) {
                     // COALESCE with the original record columns
                     $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = 'COALESCE(' . $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform) . ', ' . $compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform) . ')';
                 } else {
                     $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform);
                 }
             }
         }
     }
 }
 public function getTranslationClass(TranslatableAdapter $ea, $class)
 {
     $class = parent::getTranslationClass($ea, $class);
     if ($class === 'Gedmo\\Translatable\\Entity\\Translation') {
         return 'Stof\\DoctrineExtensionsBundle\\Entity\\Translation';
     } elseif ($class === 'Gedmo\\Translatable\\Document\\Translation') {
         return 'Stof\\DoctrineExtensionsBundle\\Document\\Translation';
     }
     return $class;
 }