← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~wgrant/launchpad/pofile-filter-stormify into lp:launchpad

 

William Grant has proposed merging lp:~wgrant/launchpad/pofile-filter-stormify into lp:launchpad.

Commit message:
Stormify the remaining POTMsgSet filter methods in POFile.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/pofile-filter-stormify/+merge/251249

Stormify the remaining POTMsgSet filter methods in POFile. There are no non-cosmetic query changes, but it's much easier to rework the queries to use new denormalised columns.

findPOTMsgSetsContaining is handled separately in https://code.launchpad.net/~wgrant/launchpad/bug-736005-trivialise/+merge/250447.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~wgrant/launchpad/pofile-filter-stormify into lp:launchpad.
=== modified file 'lib/lp/translations/model/pofile.py'
--- lib/lp/translations/model/pofile.py	2013-06-20 05:50:00 +0000
+++ lib/lp/translations/model/pofile.py	2015-02-27 13:00:56 +0000
@@ -23,6 +23,7 @@
     )
 from storm.expr import (
     And,
+    Cast,
     Coalesce,
     Desc,
     Exists,
@@ -267,8 +268,10 @@
         Orders the result by TranslationTemplateItem.sequence which must
         be among `origin_tables`.
         """
+        if isinstance(query, basestring):
+            query = SQL(query)
         results = IMasterStore(POTMsgSet).using(origin_tables).find(
-            POTMsgSet, SQL(query))
+            POTMsgSet, query)
         return results.order_by(TranslationTemplateItem.sequence)
 
     def findPOTMsgSetsContaining(self, text):
@@ -581,50 +584,42 @@
         """
         flag_name = getUtility(ITranslationSideTraitsSet).getForTemplate(
             self.potemplate).flag_name
-        clause_tables = ['TranslationTemplateItem', 'TranslationMessage']
-        clauses = self._getClausesForPOFileMessages()
-        clauses.append('TranslationMessage.%s IS TRUE' % flag_name)
-        self._appendCompletePluralFormsConditions(clauses)
+        clause_tables = [TranslationTemplateItem, TranslationMessage]
+        clauses = self._getStormClausesForPOFileMessages()
+        clauses.append(getattr(TranslationMessage, flag_name))
+        clauses.extend(
+            SQL(clause) for clause in self._getCompletePluralFormsConditions())
 
         # A message is current in this pofile if:
         #  * it's current (above) AND
         #  * (it's diverged AND non-empty)
         #     OR (it's shared AND non-empty AND no diverged one exists)
-        diverged_translation_clauses = [
-            'TranslationMessage.potemplate = %s' % sqlvalues(self.potemplate),
-        ]
-        diverged_translation_query = ' AND '.join(
-            diverged_translation_clauses)
-
-        shared_translation_clauses = [
-            'TranslationMessage.potemplate IS NULL',
-            '''NOT EXISTS (
-                 SELECT * FROM TranslationMessage AS diverged
-                   WHERE
-                     diverged.potemplate=%(potemplate)s AND
-                     diverged.%(flag_name)s IS TRUE AND
-                     diverged.language = %(language)s AND
-                     diverged.potmsgset=TranslationMessage.potmsgset)''' % (
-                dict(
-                     flag_name=flag_name,
-                     language=quote(self.language),
-                     potemplate=quote(self.potemplate),
-                     )
-                ),
-        ]
-        shared_translation_query = ' AND '.join(shared_translation_clauses)
-
-        translated_query = ('( (' + diverged_translation_query + ') OR ('
-                            + shared_translation_query + ') )')
-        clauses.append(translated_query)
+        diverged_translation_clause = (
+            TranslationMessage.potemplateID == self.potemplate.id,
+            )
+
+        Diverged = ClassAlias(TranslationMessage, 'Diverged')
+        shared_translation_clause = And(
+            TranslationMessage.potemplateID == None,
+            Not(Exists(Select(
+                1,
+                tables=[Diverged],
+                where=And(
+                    Diverged.potmsgsetID == TranslationMessage.potmsgsetID,
+                    Diverged.languageID == self.language.id,
+                    getattr(Diverged, flag_name),
+                    Diverged.potemplateID == self.potemplate.id)))))
+
+        clauses.append(
+            Or(diverged_translation_clause, shared_translation_clause))
         return (clauses, clause_tables)
 
     def getPOTMsgSetTranslated(self):
         """See `IPOFile`."""
         clauses, clause_tables = self._getTranslatedMessagesQuery()
-        clauses.append('TranslationTemplateItem.potmsgset = POTMsgSet.id')
-
-        query = ' AND '.join(clauses)
+        query = And(
+            TranslationTemplateItem.potmsgsetID == POTMsgSet.id,
+            *clauses)
         clause_tables.insert(0, POTMsgSet)
         return self._getOrderedPOTMsgSets(clause_tables, query)
 
@@ -633,86 +628,81 @@
         # We get all POTMsgSet.ids with translations, and later
         # exclude them using a NOT IN subselect.
         translated_clauses, clause_tables = self._getTranslatedMessagesQuery()
-        translated_clauses.append(
-            'POTMsgSet.id=TranslationTemplateItem.potmsgset')
-        # Even though this seems silly, Postgres prefers
-        # TranslationTemplateItem index if we add it (and on staging we
-        # get more than a 10x speed improvement: from 8s to 0.7s).  We
-        # also need to put it before any other clauses to be actually useful.
-        translated_clauses.insert(0,
-            'TranslationTemplateItem.potmsgset ='
-            ' TranslationTemplateItem.potmsgset')
-        translated_query = (
-            "(SELECT POTMsgSet.id"
-            "   FROM TranslationTemplateItem, TranslationMessage, POTMsgSet"
-            "   WHERE " + " AND ".join(translated_clauses) + ")")
+        translated_query = Select(
+            POTMsgSet.id,
+            tables=[TranslationTemplateItem, TranslationMessage, POTMsgSet],
+            where=And(
+                # Even though this seems silly, Postgres prefers
+                # TranslationTemplateItem index if we add it (and on
+                # staging we get more than a 10x speed improvement: from
+                # 8s to 0.7s).  We also need to put it before any other
+                # clauses to be actually useful.
+                TranslationTemplateItem.potmsgsetID ==
+                    TranslationTemplateItem.potmsgsetID,
+                POTMsgSet.id == TranslationTemplateItem.potmsgsetID,
+                *translated_clauses))
         clauses = [
-            'TranslationTemplateItem.potemplate = %s' % sqlvalues(
-                self.potemplate),
-            'TranslationTemplateItem.potmsgset = POTMsgSet.id',
-            'TranslationTemplateItem.sequence > 0',
+            TranslationTemplateItem.potemplateID == self.potemplate.id,
+            TranslationTemplateItem.potmsgsetID == POTMsgSet.id,
+            TranslationTemplateItem.sequence > 0,
+            Not(TranslationTemplateItem.potmsgsetID.is_in(translated_query)),
             ]
-        clauses.append(
-            'TranslationTemplateItem.potmsgset NOT IN (%s)' % (
-                translated_query))
-
-        query = ' AND '.join(clauses)
         return self._getOrderedPOTMsgSets(
-            [POTMsgSet, TranslationTemplateItem], query)
+            [POTMsgSet, TranslationTemplateItem], And(*clauses))
 
     def getPOTMsgSetWithNewSuggestions(self):
         """See `IPOFile`."""
         flag_name = getUtility(ITranslationSideTraitsSet).getForTemplate(
             self.potemplate).flag_name
-        clauses = self._getClausesForPOFileMessages()
-        msgstr_clause = make_plurals_sql_fragment(
-            "TranslationMessage.msgstr%(form)d IS NOT NULL", "OR")
+        clauses = self._getStormClausesForPOFileMessages()
+        msgstr_clause = Or(*(
+            getattr(TranslationMessage, 'msgstr%d' % form) != None
+            for form in xrange(TranslationConstants.MAX_PLURAL_FORMS)))
         clauses.extend([
-            'TranslationTemplateItem.potmsgset = POTMsgSet.id',
-            'TranslationMessage.%s IS NOT TRUE' % flag_name,
-            "(%s)" % msgstr_clause,
+            TranslationTemplateItem.potmsgsetID == POTMsgSet.id,
+            Not(getattr(TranslationMessage, flag_name)),
+            msgstr_clause,
             ])
 
-        diverged_translation_query = (
-            '''(SELECT COALESCE(diverged.date_reviewed, diverged.date_created)
-                 FROM TranslationMessage AS diverged
-                 WHERE
-                   diverged.%(flag_name)s IS TRUE AND
-                   diverged.potemplate = %(potemplate)s AND
-                   diverged.language = %(language)s AND
-                   diverged.potmsgset=POTMsgSet.id)''' % dict(
-            flag_name=flag_name,
-            potemplate=quote(self.potemplate),
-            language=quote(self.language)))
-
-        shared_translation_query = (
-            '''(SELECT COALESCE(shared.date_reviewed, shared.date_created)
-                 FROM TranslationMessage AS shared
-                 WHERE
-                   shared.%(flag_name)s IS TRUE AND
-                   shared.potemplate IS NULL AND
-                   shared.language = %(language)s AND
-                   shared.potmsgset=POTMsgSet.id)''' % dict(
-            flag_name=flag_name,
-            language=quote(self.language)))
-        beginning_of_time = "TIMESTAMP '1970-01-01 00:00:00'"
-        newer_than_query = (
-            "TranslationMessage.date_created > COALESCE(" +
-            ",".join([diverged_translation_query,
-                      shared_translation_query,
-                      beginning_of_time]) + ")")
-        clauses.append(newer_than_query)
+        Diverged = ClassAlias(TranslationMessage, "Diverged")
+        diverged_translation_query = Select(
+            Coalesce(Diverged.date_reviewed, Diverged.date_created),
+            tables=[Diverged],
+            where=And(
+                Diverged.potmsgsetID == POTMsgSet.id,
+                Diverged.languageID == self.language.id,
+                getattr(Diverged, flag_name),
+                Diverged.potemplateID == self.potemplate.id))
+
+        Shared = ClassAlias(TranslationMessage, "Shared")
+        shared_translation_query = Select(
+            Coalesce(Shared.date_reviewed, Shared.date_created),
+            tables=[Shared],
+            where=And(
+                Shared.potmsgsetID == POTMsgSet.id,
+                Shared.languageID == self.language.id,
+                getattr(Shared, flag_name),
+                Shared.potemplateID == None))
+
+        beginning_of_time = Cast(u'1970-01-01 00:00:00', 'timestamp')
+        clauses.append(
+            TranslationMessage.date_created >
+                Coalesce(
+                    diverged_translation_query, shared_translation_query,
+                    beginning_of_time))
 
         # A POT set has "new" suggestions if there is a non current
         # TranslationMessage newer than the current reviewed one.
-        query = (
-            """POTMsgSet.id IN (SELECT DISTINCT TranslationMessage.potmsgset
-                 FROM TranslationMessage, TranslationTemplateItem, POTMsgSet
-                 WHERE (%(query)s)) AND
-               POTMsgSet.id=TranslationTemplateItem.potmsgset AND
-               TranslationTemplateItem.potemplate=%(potemplate)s
-            """ % dict(query=' AND '.join(clauses),
-                       potemplate=quote(self.potemplate)))
+        query = And(
+            POTMsgSet.id.is_in(
+                Select(
+                    TranslationMessage.potmsgsetID,
+                    tables=[
+                        TranslationMessage, TranslationTemplateItem,
+                        POTMsgSet],
+                    where=And(*clauses))),
+            POTMsgSet.id == TranslationTemplateItem.potmsgsetID,
+            TranslationTemplateItem.potemplateID == self.potemplate.id)
         return self._getOrderedPOTMsgSets(
             [POTMsgSet, TranslationTemplateItem], query)
 
@@ -727,44 +717,39 @@
             ITranslationSideTraitsSet).getForTemplate(
                 self.potemplate).other_side_traits.flag_name
         clauses.extend([
-            'TranslationTemplateItem.potmsgset = POTMsgSet.id',
-            'TranslationMessage.%s IS FALSE' % other_side_flag_name,
+            TranslationTemplateItem.potmsgsetID == POTMsgSet.id,
+            Not(getattr(TranslationMessage, other_side_flag_name)),
             ])
 
-        imported_no_diverged = (
-            '''NOT EXISTS (
-                 SELECT * FROM TranslationMessage AS diverged
-                   WHERE
-                     diverged.%(flag_name)s IS TRUE AND
-                     diverged.id <> imported.id AND
-                     diverged.potemplate = %(potemplate)s AND
-                     diverged.language = %(language)s AND
-                     diverged.potmsgset=TranslationMessage.potmsgset)''' % (
-                dict(
-                    flag_name=other_side_flag_name,
-                    potemplate=quote(self.potemplate),
-                    language=quote(self.language),
-                    )))
+        Imported = ClassAlias(TranslationMessage, 'Imported')
+        Diverged = ClassAlias(TranslationMessage, 'Diverged')
+        imported_no_diverged = Not(Exists(
+            Select(
+                1,
+                tables=[Diverged],
+                where=And(
+                    Diverged.id != Imported.id,
+                    Diverged.potmsgsetID == TranslationMessage.potmsgsetID,
+                    Diverged.languageID == self.language.id,
+                    getattr(Diverged, other_side_flag_name),
+                    Diverged.potemplateID == self.potemplate.id))))
         imported_clauses = [
-            'imported.id <> TranslationMessage.id',
-            'imported.potmsgset = POTMsgSet.id',
-            'imported.language = %s' % sqlvalues(self.language),
-            'imported.%s IS TRUE' % other_side_flag_name,
-            '(imported.potemplate=%s OR ' % sqlvalues(self.potemplate) +
-            '   (imported.potemplate IS NULL AND ' + imported_no_diverged
-            + '  ))',
+            Imported.id != TranslationMessage.id,
+            Imported.potmsgsetID == POTMsgSet.id,
+            Imported.languageID == self.language.id,
+            getattr(Imported, other_side_flag_name),
+            Or(
+                Imported.potemplateID == self.potemplate.id,
+                And(Imported.potemplateID == None, imported_no_diverged)),
             ]
-        self._appendCompletePluralFormsConditions(imported_clauses,
-                                                  'imported')
-        exists_imported_query = (
-            'EXISTS ('
-            '  SELECT * FROM TranslationMessage AS imported'
-            '      WHERE ' + ' AND '.join(imported_clauses) + ')')
-        clauses.append(exists_imported_query)
+        imported_clauses.extend(
+            SQL(clause) for clause in
+            self._getCompletePluralFormsConditions('imported'))
+        clauses.append(Exists(Select(
+            1, tables=[Imported], where=And(*imported_clauses))))
 
         clause_tables.insert(0, POTMsgSet)
-        query = ' AND '.join(clauses)
-        return self._getOrderedPOTMsgSets(clause_tables, query)
+        return self._getOrderedPOTMsgSets(clause_tables, And(*clauses))
 
     def messageCount(self):
         """See `IRosettaStats`."""
@@ -794,16 +779,17 @@
             self.rosettacount,
             self.unreviewed_count)
 
-    def _appendCompletePluralFormsConditions(self, query,
-                                             table_name='TranslationMessage'):
+    def _getCompletePluralFormsConditions(self,
+                                          table_name='TranslationMessage'):
         """Add conditions to implement ITranslationMessage.is_complete in SQL.
 
         :param query: A list of AND SQL conditions where the implementation of
             ITranslationMessage.is_complete will be appended as SQL
             conditions.
         """
-        query.append('%(table_name)s.msgstr0 IS NOT NULL' % {
-            'table_name': table_name})
+        query = [
+            '%(table_name)s.msgstr0 IS NOT NULL' % {'table_name': table_name},
+            ]
         if self.language.pluralforms > 1:
             plurals_query = ' AND '.join(
                 '%(table_name)s.msgstr%(plural_form)d IS NOT NULL' % {
@@ -825,11 +811,9 @@
         side_traits = getUtility(ITranslationSideTraitsSet).getForTemplate(
             self.potemplate)
         complete_plural_clause_this_side = ' AND '.join(
-            self._appendCompletePluralFormsConditions(
-                [], table_name='Current'))
+            self._getCompletePluralFormsConditions(table_name='Current'))
         complete_plural_clause_other_side = ' AND '.join(
-            self._appendCompletePluralFormsConditions(
-                [], table_name='Other'))
+            self._getCompletePluralFormsConditions(table_name='Other'))
         params = {
             'potemplate': quote(self.potemplate),
             'language': quote(self.language),


Follow ups