incubator-bloodhound-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r1449736 - in /incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct: multiproduct/api.py multiproduct/dbcursor.py tests/db/cursor.py
Date Mon, 25 Feb 2013 14:56:15 GMT
Author: jure
Date: Mon Feb 25 14:56:15 2013
New Revision: 1449736

URL: http://svn.apache.org/r1449736
Log:
Translate ticket_custom, ticket_change and attachment tables, updated test cases for database
cursor


Modified:
    incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py
    incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
    incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/db/cursor.py

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py?rev=1449736&r1=1449735&r2=1449736&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py
(original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py
Mon Feb 25 14:56:15 2013
@@ -69,7 +69,11 @@ class MultiProductSystem(Component):
               for mcls in (Product, ProductResourceMap)]
 
     # Tables which should be migrated (extended with 'product' column)
-    MIGRATE_TABLES = ['enum', 'component', 'milestone', 'version', 'permission', 'wiki']
+    MIGRATE_TABLES = ['enum', 'component', 'milestone', 'version',
+                      'permission',
+                      'wiki',
+                      'report',
+                      ]
 
 
     def get_version(self):
@@ -139,9 +143,13 @@ class MultiProductSystem(Component):
                 import trac.db_default
 
                 DEFAULT_PRODUCT = 'default'
+                TICKET_TABLES = ['ticket_change', 'ticket_custom',
+                                 'attachment',
+                                ]
 
                 # extend trac default schema by adding product column and extending key with
product
-                table_defs = [copy.deepcopy(t) for t in trac.db_default.schema if t.name
in self.MIGRATE_TABLES]
+                table_defs = [copy.deepcopy(t) for t in trac.db_default.schema
+                                                    if t.name in self.MIGRATE_TABLES + TICKET_TABLES]
                 for t in table_defs:
                     t.columns.append(Column('product'))
                     if isinstance(t.key, list):
@@ -154,10 +162,9 @@ class MultiProductSystem(Component):
                                         (t.name, t.key, PLUGIN_NAME, db_installed_version,
3))
                 table_columns = dict()
                 for table in table_defs:
-                    table_columns[table.name] = filter(lambda column: column != 'product',
-                                                         [column.name for column in
-                                                            list(filter(lambda t: t.name
== table.name,
-                                                                                  table_defs)[0].columns)])
+                    table_columns[table.name] = [c for c in [column.name for column in
+                                                                [t for t in table_defs if
t.name == table.name][0].columns]
+                                                                    if c != 'product']
                 self.log.info("Creating default product")
                 default_product = Product(self.env)
                 default_product.update_field_dict({'prefix': DEFAULT_PRODUCT,
@@ -171,27 +178,68 @@ class MultiProductSystem(Component):
                 db("""UPDATE ticket SET product='%s'
                         WHERE product=''""" % DEFAULT_PRODUCT)
 
-                self.log.info("Migrating tables to a new schema")
-                for table in self.MIGRATE_TABLES:
-                    cols = ','.join(table_columns[table])
+                def create_temp_table(table):
+                    table_temp_name = '%s_temp' % table
+                    if table == 'report':
+                        cols = ','.join([c for c in table_columns[table] if c != 'id'])
+                    else:
+                        cols = ','.join(table_columns[table])
                     self.log.info("Migrating table '%s' to a new schema", table)
-                    db("CREATE TABLE %s_temp AS SELECT %s FROM %s" %
-                        (table, cols, table))
+                    db("CREATE TABLE %s AS SELECT %s FROM %s" %
+                       (table_temp_name, cols, table))
                     db("DROP TABLE %s" % table)
                     db_connector, _ = DatabaseManager(self.env)._get_connector()
-                    table_schema = filter(lambda t: t.name == table, table_defs)[0]
+                    table_schema = [t for t in table_defs if t.name == table][0]
                     for sql in db_connector.to_sql(table_schema):
                         db(sql)
-                    products = Product.select(self.env)
-                    for product in products:
-                        self.log.info("Populating table '%s' for product '%s' ('%s')", table,
product.name, product.prefix)
-                        db("INSERT INTO %s (%s, product) SELECT %s,'%s' FROM %s_temp" %
-                            (table, cols, cols, product.prefix, table))
+                    return table_temp_name, cols
+
+                def drop_temp_table(table):
+                    db("DROP TABLE %s" % table)
+
+                self.log.info("Migrating system tables to a new schema")
+                for table in self.MIGRATE_TABLES:
+                    temp_table_name, cols = create_temp_table(table)
+                    if table == 'wiki':
+                        self.log.info("Populating table '%s'", table)
+                        db("INSERT INTO %s (%s, product) SELECT %s,'' FROM %s" %
+                           (table, cols, cols, temp_table_name))
+                    else:
+                        products = Product.select(self.env)
+                        for product in products:
+                            self.log.info("Populating table '%s' for product '%s' ('%s')",
+                                          table, product.name, product.prefix)
+                            db("INSERT INTO %s (%s, product) SELECT %s,'%s' FROM %s" %
+                                (table, cols, cols, product.prefix, temp_table_name))
                     if table == 'permission':
                         self.log.info("Populating table '%s' for global scope", table)
-                        db("INSERT INTO %s (%s, product) SELECT %s,'%s' FROM %s_temp" %
-                           (table, cols, cols, '', table))
-                    db("DROP TABLE %s_temp" % table)
+                        db("INSERT INTO %s (%s, product) SELECT %s,'%s' FROM %s" %
+                           (table, cols, cols, '', temp_table_name))
+                    drop_temp_table(temp_table_name)
+
+                # Update ticket related tables
+                # Upgrade schema
+                self.log.info("Migrating ticket tables to a new schema")
+                for table in TICKET_TABLES:
+                    temp_table_name, cols = create_temp_table(table)
+                    db("INSERT INTO %s (%s, product) SELECT %s,'' FROM %s" %
+                       (table, cols, cols, temp_table_name))
+                    drop_temp_table(temp_table_name)
+
+                # Update product column based on ticket product
+                for table in TICKET_TABLES:
+                    if table == 'attachment':
+                        db("""UPDATE attachment
+                              SET product=(SELECT ticket.product FROM ticket WHERE ticket.id=attachment.id)
+                              WHERE type='ticket'""")
+                    else:
+                        db("""UPDATE %s
+                              SET product=(SELECT ticket.product FROM ticket WHERE ticket.id=%s.ticket)"""
%
+                           (table, table))
+                db("""UPDATE attachment
+                      SET product=(SELECT wiki.product FROM wiki WHERE wiki.name=attachment.id)
+                      WHERE type='wiki'""")
+
                 db_installed_version = self._update_db_version(db, 3)
 
             if db_installed_version < 4:

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py?rev=1449736&r1=1449735&r2=1449736&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
(original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/dbcursor.py
Mon Feb 25 14:56:15 2013
@@ -28,13 +28,17 @@ __all__ = ['BloodhoundIterableCursor', '
 SKIP_TABLES = ['system', 'auth_cookie',
                'session', 'session_attribute',
                'cache',
-               'attachment', 'repository', 'revision', 'node_change',
-               'ticket_change', 'ticket_custom',
-               'report',
+               'repository', 'revision', 'node_change',
                'bloodhound_product', 'bloodhound_productresourcemap', 'bloodhound_productconfig',
                'sqlite_master'
                ]
-TRANSLATE_TABLES = ['ticket', 'enum', 'component', 'milestone', 'version', 'permission',
'wiki']
+TRANSLATE_TABLES = ['ticket', 'ticket_change', 'ticket_custom',
+                    'attachment',
+                    'enum', 'component', 'milestone', 'version',
+                    'permission',
+                    'wiki',
+                    'report',
+                   ]
 PRODUCT_COLUMN = 'product'
 GLOBAL_PRODUCT = ''
 
@@ -310,7 +314,7 @@ class BloodhoundProductSQLTranslate(obje
 
     def _select_expression_tokens(self, parent, first_token, end_words):
         if isinstance(first_token, Types.IdentifierList):
-            return first_token, [first_token]
+            return first_token, [list(first_token.flatten())]
         tokens = list()
         current_list = list()
         current_token = first_token

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/db/cursor.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/db/cursor.py?rev=1449736&r1=1449735&r2=1449736&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/db/cursor.py
(original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/tests/db/cursor.py
Mon Feb 25 14:56:15 2013
@@ -26,26 +26,6 @@ data = {
     # non-translated SELECTs
     'system_select_nontranslated' : [
         (
-"""SELECT TYPE, id,
-                     filename,
-                     time,
-                     description,
-                     author
-        FROM attachment
-        WHERE time > %s
-          AND time < %s
-          AND TYPE = %s""",
-"""SELECT TYPE, id,
-                     filename,
-                     time,
-                     description,
-                     author
-        FROM attachment
-        WHERE time > %s
-          AND time < %s
-          AND TYPE = %s"""
-        ),
-        (
 """SELECT id,
                name,
                value
@@ -74,6 +54,26 @@ data = {
     # translated SELECTs
     'system_select_translated' : [
         (
+"""SELECT TYPE, id,
+                     filename,
+                     time,
+                     description,
+                     author
+        FROM attachment
+        WHERE time > %s
+          AND time < %s
+          AND TYPE = %s""",
+"""SELECT TYPE, id,
+                     filename,
+                     time,
+                     description,
+                     author
+        FROM (SELECT * FROM attachment WHERE product="PRODUCT") AS attachment
+        WHERE time > %s
+          AND time < %s
+          AND TYPE = %s"""
+        ),
+        (
 """SELECT name,
                due,
                completed,
@@ -131,7 +131,7 @@ data = {
                tc.field,
                tc.oldvalue,
                tc.newvalue
-        FROM ticket_change tc
+        FROM (SELECT * FROM ticket_change WHERE product="PRODUCT") AS tc
         INNER JOIN (SELECT * FROM ticket WHERE product="PRODUCT") AS t ON t.id = tc.ticket
         AND tc.time>=1351375199999999
         AND tc.time<=1354057199999999
@@ -576,7 +576,7 @@ data = {
                reporter AS _reporter
           FROM (SELECT * FROM ticket WHERE product="PRODUCT") AS t
           LEFT JOIN (SELECT * FROM enum WHERE product="PRODUCT") AS p  ON p.name = t.priority
AND p.type = 'priority'
-          LEFT JOIN ticket_change  ON tc.ticket = t.id AND tc.author = %s
+          LEFT JOIN (SELECT * FROM ticket_change WHERE product="PRODUCT") AS tc  ON tc.ticket
= t.id AND tc.author = %s
                                         AND tc.field = 'comment'
           WHERE t.status <> 'closed'
                 AND (owner = %s OR reporter = %s OR author = %s)
@@ -618,16 +618,6 @@ data = {
     # non-translated INSERTs
     'system_insert_nontranslated' : [
         (
-"""INSERT INTO ticket_custom (ticket, name, value)
-          SELECT id, 'totalhours', '0' FROM ticket WHERE id NOT IN (
-            SELECT ticket from ticket_custom WHERE name='totalhours'
-          )""",
-"""INSERT INTO ticket_custom (ticket, name, value)
-          SELECT id, 'totalhours', '0' FROM (SELECT * FROM ticket WHERE product="PRODUCT")
AS ticket WHERE id NOT IN (
-            SELECT ticket from ticket_custom WHERE name='totalhours'
-          )"""
-        ),
-        (
 """INSERT INTO session VALUES (%s,%s,0)""",
 """INSERT INTO session VALUES (%s,%s,0)"""
         ),
@@ -637,11 +627,21 @@ data = {
     'system_insert_translated' : [
         (
 """INSERT INTO ticket_custom (ticket, name, value)
+          SELECT id, 'totalhours', '0' FROM ticket WHERE id NOT IN (
+            SELECT ticket from ticket_custom WHERE name='totalhours'
+          )""",
+"""INSERT INTO ticket_custom (ticket, name, value, product)
+              SELECT id, 'totalhours', '0', product FROM (SELECT * FROM ticket WHERE product="PRODUCT")
AS ticket WHERE id NOT IN (
+                SELECT ticket from (SELECT * FROM ticket_custom WHERE product="PRODUCT")
AS ticket_custom WHERE name='totalhours'
+              )"""
+        ),
+        (
+"""INSERT INTO ticket_custom (ticket, name, value)
                     SELECT id, 'totalhours', '0' FROM ticket WHERE id NOT IN (
                     SELECT ticket from ticket_custom WHERE name='totalhours')""",
-"""INSERT INTO ticket_custom (ticket, name, value)
-                    SELECT id, 'totalhours', '0' FROM (SELECT * FROM ticket WHERE product="PRODUCT")
AS ticket WHERE id NOT IN (
-                    SELECT ticket from ticket_custom WHERE name='totalhours')"""
+"""INSERT INTO ticket_custom (ticket, name, value, product)
+                        SELECT id, 'totalhours', '0', product FROM (SELECT * FROM ticket
WHERE product="PRODUCT") AS ticket WHERE id NOT IN (
+                        SELECT ticket from (SELECT * FROM ticket_custom WHERE product="PRODUCT")
AS ticket_custom WHERE name='totalhours')"""
         ),
         (
 """INSERT INTO session (sid, last_visit, authenticated)
@@ -707,7 +707,7 @@ data = {
                           ORDER BY time DESC LIMIT 1)
                           WHERE id=%s""",
 """UPDATE ticket SET changetime=(
-                          SELECT time FROM ticket_change WHERE ticket=%s
+                          SELECT time FROM (SELECT * FROM ticket_change WHERE product="PRODUCT")
AS ticket_change WHERE ticket=%s
                           UNION
                           SELECT time FROM (
                               SELECT time FROM (SELECT * FROM ticket WHERE product="PRODUCT")
AS ticket WHERE id=%s LIMIT 1) AS t
@@ -756,6 +756,32 @@ data = {
                            SET
                                 id_project='%s' WHERE product='PRODUCT' AND milestone='%s'"""
         ),
+        (
+"""UPDATE ticket_change  SET  newvalue=%s
+                               WHERE ticket=%s and author=%s and time=%s and field=%s""",
+"""UPDATE ticket_change  SET  newvalue=%s
+                               WHERE product='PRODUCT' AND ticket=%s and author=%s and time=%s
and field=%s"""
+        ),
+        (
+"""UPDATE ticket_change  SET oldvalue=%s, newvalue=%s
+                               WHERE ticket=%s and author=%s and time=%s and field=%s""",
+"""UPDATE ticket_change  SET oldvalue=%s, newvalue=%s
+                               WHERE product='PRODUCT' AND ticket=%s and author=%s and time=%s
and field=%s"""
+        ),
+        (
+"""UPDATE
+                                ticket_custom
+                              SET
+                                value = '%s'
+                              WHERE
+                                name = 'project' AND value = '%s'""",
+"""UPDATE
+                                ticket_custom
+                              SET
+                                value = '%s'
+                              WHERE
+                                product='PRODUCT' AND name = 'project' AND value = '%s'"""
+        ),
     ],
 
     # non-translated UPDATEs
@@ -784,32 +810,6 @@ data = {
                             SET time=%s
                         WHERE   cookie=%s"""
         ),
-        (
-"""UPDATE ticket_change  SET  newvalue=%s
-                               WHERE ticket=%s and author=%s and time=%s and field=%s""",
-"""UPDATE ticket_change  SET  newvalue=%s
-                               WHERE ticket=%s and author=%s and time=%s and field=%s"""
-        ),
-        (
-"""UPDATE ticket_change  SET oldvalue=%s, newvalue=%s
-                               WHERE ticket=%s and author=%s and time=%s and field=%s""",
-"""UPDATE ticket_change  SET oldvalue=%s, newvalue=%s
-                               WHERE ticket=%s and author=%s and time=%s and field=%s"""
-        ),
-        (
-"""UPDATE
-                                ticket_custom
-                              SET
-                                value = '%s'
-                              WHERE
-                                name = 'project' AND value = '%s'""",
-"""UPDATE
-                                ticket_custom
-                              SET
-                                value = '%s'
-                              WHERE
-                                name = 'project' AND value = '%s'"""
-        ),
     ],
 
     # custom (plugin) table UPDATEs



Mime
View raw message