Просмотр исходного кода

[Translatable] tiny optimization of walker

Denis Chmel 13 лет назад
Родитель
Сommit
695c073a23
1 измененных файлов с 36 добавлено и 34 удалено
  1. 36 34
      lib/Gedmo/Translatable/Query/TreeWalker/TranslationWalker.php

+ 36 - 34
lib/Gedmo/Translatable/Query/TreeWalker/TranslationWalker.php

@@ -251,15 +251,19 @@ class TranslationWalker extends SqlWalker
      */
     private function prepareTranslatedComponents()
     {
-        $em = $this->getEntityManager();
         $q = $this->getQuery();
-        $ea = new TranslatableEventAdapter;
         $locale = $q->getHint(TranslationListener::HINT_TRANSLATABLE_LOCALE);
         if (!$locale) {
             // use from listener
             $locale = $this->listener->getListenerLocale();
         }
         $defaultLocale = $this->listener->getDefaultLocale();
+        if ($locale === $defaultLocale) {
+            // Skip preparation as there's no need to translate anything
+            return;
+        }
+        $em = $this->getEntityManager();
+        $ea = new TranslatableEventAdapter;
         $joinStrategy = $q->getHint(TranslationListener::HINT_INNER_JOIN) ? 'INNER' : 'LEFT';
 
         foreach ($this->translatedComponents as $dqlAlias => $comp) {
@@ -268,40 +272,38 @@ class TranslationWalker extends SqlWalker
             $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 = " {$joinStrategy} 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;
-
-                    $originalField = $compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform);
-                    $substituteField = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform);
-
-                    // If original field is integer - treat translation as integer (for ORDER BY, WHERE, etc)
-                    $fieldMapping = $meta->getFieldMapping($field);
-                    if (in_array($fieldMapping["type"], array("integer", "bigint", "tinyint", "int"))) {
-                        $substituteField = 'CAST(' . $substituteField . ' AS SIGNED)';
-                    }
-
-                    // Fallback to original if was asked for
-                    if ($this->needsFallback()) {
-                        $substituteField = 'COALESCE('.$substituteField.', '.$originalField.')';
-                    }
+            foreach ($config['fields'] as $field) {
+                $compTableName = $meta->getQuotedTableName($this->platform);
+                $compTblAlias = $this->getSQLTableAlias($compTableName, $dqlAlias);
+                $tblAlias = $this->getSQLTableAlias('trans'.$compTblAlias.$field);
+                $sql = " {$joinStrategy} 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;
+
+                $originalField = $compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform);
+                $substituteField = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform);
+
+                // If original field is integer - treat translation as integer (for ORDER BY, WHERE, etc)
+                $fieldMapping = $meta->getFieldMapping($field);
+                if (in_array($fieldMapping["type"], array("integer", "bigint", "tinyint", "int"))) {
+                    $substituteField = 'CAST(' . $substituteField . ' AS SIGNED)';
+                }
 
-                    $this->replacements[$originalField] = $substituteField;
+                // Fallback to original if was asked for
+                if ($this->needsFallback()) {
+                    $substituteField = 'COALESCE('.$substituteField.', '.$originalField.')';
                 }
+
+                $this->replacements[$originalField] = $substituteField;
             }
         }
     }