Browse Source

[translatable] query hint join default locale translation in case if current is empty, closes #109

gediminasm 14 years ago
parent
commit
7187a4e3d0

+ 23 - 3
lib/Gedmo/Translatable/Query/TreeWalker/TranslationWalker.php

@@ -297,6 +297,7 @@ class TranslationWalker extends SqlWalker
         $em = $this->getEntityManager();
         $em = $this->getEntityManager();
         $ea = new TranslatableEventAdapter;
         $ea = new TranslatableEventAdapter;
         $locale = $this->listener->getListenerLocale();
         $locale = $this->listener->getListenerLocale();
+        $defaultLocale = $this->listener->getDefaultLocale();
 
 
         foreach ($this->translatedComponents as $dqlAlias => $comp) {
         foreach ($this->translatedComponents as $dqlAlias => $comp) {
             if (!isset($result[$comp['nestingLevel']])) {
             if (!isset($result[$comp['nestingLevel']])) {
@@ -320,12 +321,31 @@ class TranslationWalker extends SqlWalker
                     .' = '.$this->conn->quote($field);
                     .' = '.$this->conn->quote($field);
                 $identifier = $meta->getSingleIdentifierFieldName();
                 $identifier = $meta->getSingleIdentifierFieldName();
                 $colName = $meta->getQuotedColumnName($identifier, $this->platform);
                 $colName = $meta->getQuotedColumnName($identifier, $this->platform);
-                $colAlias = $this->getSQLColumnAlias($colName);
                 $sql .= ' AND '.$tblAlias.'.'.$transMeta->getQuotedColumnName('foreignKey', $this->platform)
                 $sql .= ' AND '.$tblAlias.'.'.$transMeta->getQuotedColumnName('foreignKey', $this->platform)
                     .' = '.$compTblAlias.'.'.$colName;
                     .' = '.$compTblAlias.'.'.$colName;
                 $result[$comp['nestingLevel']] .= $sql;
                 $result[$comp['nestingLevel']] .= $sql;
-                $this->replacements[$compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform)]
-                    = $tblAlias.'.'.$transMeta->getQuotedColumnName('content', $this->platform);
+                if (strlen($defaultLocale)) {
+                    // join default locale
+                    $tblAliasDefault = $this->getSQLTableAlias('trans_default_locale'.$compTblAlias.$field);
+                    $sql = ' LEFT JOIN '.$transTable.' '.$tblAliasDefault;
+                    $sql .= ' ON '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('locale', $this->platform)
+                        .' = '.$this->conn->quote($defaultLocale);
+                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('objectClass', $this->platform)
+                        .' = '.$this->conn->quote($meta->name);
+                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('field', $this->platform)
+                        .' = '.$this->conn->quote($field);
+                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('foreignKey', $this->platform)
+                        .' = '.$compTblAlias.'.'.$colName;
+                    $result[$comp['nestingLevel']] .= $sql;
+                    $this->replacements[$compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform)]
+                        = 'COALESCE('.$tblAlias.'.'.$transMeta->getQuotedColumnName('content', $this->platform)
+                        .', '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('content', $this->platform).')'
+                    ;
+                } else {
+                    $this->replacements[$compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform)]
+                        = $tblAlias.'.'.$transMeta->getQuotedColumnName('content', $this->platform)
+                    ;
+                }
             }
             }
         }
         }
         return $result;
         return $result;

+ 10 - 0
lib/Gedmo/Translatable/TranslationListener.php

@@ -209,6 +209,16 @@ class TranslationListener extends MappedEventSubscriber
         return $this;
         return $this;
     }
     }
 
 
+    /**
+     * Gets the default locale
+     *
+     * @return string
+     */
+    public function getDefaultLocale()
+    {
+        return $this->defaultLocale;
+    }
+
     /**
     /**
      * Get currently set global locale, used
      * Get currently set global locale, used
      * extensively during query execution
      * extensively during query execution

+ 1 - 1
tests/Gedmo/Translatable/Fixture/Article.php

@@ -22,7 +22,7 @@ class Article implements Translatable
 
 
     /**
     /**
      * @Gedmo\Translatable
      * @Gedmo\Translatable
-     * @ORM\Column(name="content", type="text")
+     * @ORM\Column(name="content", type="text", nullable=true)
      */
      */
     private $content;
     private $content;
 
 

+ 59 - 0
tests/Gedmo/Translatable/TranslationQueryWalkerTest.php

@@ -40,6 +40,33 @@ class TranslationQueryWalkerTest extends BaseTestCaseORM
         $this->populate();
         $this->populate();
     }
     }
 
 
+    public function testIssue109()
+    {
+        $this->populateIssue109();
+        $this->em
+            ->getConfiguration()
+            ->expects($this->any())
+            ->method('getCustomHydrationMode')
+            ->with(TranslationWalker::HYDRATE_OBJECT_TRANSLATION)
+            ->will($this->returnValue('Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator'))
+        ;
+        $query = $this->em->createQueryBuilder();
+        $query->select('a')
+            ->from(self::ARTICLE, 'a')
+            ->add('where', $query->expr()->not($query->expr()->eq('a.title', ':title')))
+            ->setParameter('title', 'NA')
+        ;
+
+        $this->translationListener->setTranslatableLocale('es');
+        $this->translationListener->setDefaultLocale('en');
+        $this->translationListener->setTranslationFallback(true);
+        $query = $query->getQuery();
+        $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, self::TREE_WALKER_TRANSLATION);
+
+        $result = $query->getResult();
+        $this->assertEquals(3, count($result));
+    }
+
     public function testSubselectByTranslatedField()
     public function testSubselectByTranslatedField()
     {
     {
         $this->populateMore();
         $this->populateMore();
@@ -558,4 +585,36 @@ class TranslationQueryWalkerTest extends BaseTestCaseORM
         $this->em->flush();
         $this->em->flush();
         $this->em->clear();
         $this->em->clear();
     }
     }
+
+    public function populateIssue109()
+    {
+        $this->translationListener->setTranslatableLocale('en');
+        $text0 = new Article;
+        $text0->setTitle('text0');
+
+        $this->em->persist($text0);
+
+        $text1 = new Article;
+        $text1->setTitle('text1');
+
+        $this->em->persist($text1);
+
+        $na = new Article;
+        $na->setTitle('NA');
+
+        $this->em->persist($na);
+
+        $out = new Article;
+        $out->setTitle('Out');
+
+        $this->em->persist($out);
+        $this->em->flush();
+        $this->translationListener->setTranslatableLocale('es');
+
+        $text1->setTitle('texto1');
+        $text0->setTitle('texto0');
+        $this->em->persist($text1);
+        $this->em->persist($text0);
+        $this->em->flush();
+    }
 }
 }