From 90e0ac2379b26730ff53e3131902d10047931d5a Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Wed, 15 Feb 2017 16:00:59 +0100 Subject: [PATCH 1/7] [ADD] allow creating missing indexes --- database_cleanup/__openerp__.py | 1 + database_cleanup/models/__init__.py | 1 + database_cleanup/models/create_indexes.py | 80 +++++++++++++++++++++++ database_cleanup/views/create_indexes.xml | 52 +++++++++++++++ database_cleanup/views/menu.xml | 7 ++ database_cleanup/views/purge_wizard.xml | 7 +- 6 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 database_cleanup/models/create_indexes.py create mode 100644 database_cleanup/views/create_indexes.xml diff --git a/database_cleanup/__openerp__.py b/database_cleanup/__openerp__.py index cf56734d38c..0e4531c6eea 100644 --- a/database_cleanup/__openerp__.py +++ b/database_cleanup/__openerp__.py @@ -9,6 +9,7 @@ 'license': 'AGPL-3', 'category': 'Tools', 'data': [ + "views/create_indexes.xml", "views/purge_wizard.xml", 'views/purge_menus.xml', 'views/purge_modules.xml', diff --git a/database_cleanup/models/__init__.py b/database_cleanup/models/__init__.py index 1857ee3b012..28bfb5ccdf6 100644 --- a/database_cleanup/models/__init__.py +++ b/database_cleanup/models/__init__.py @@ -6,3 +6,4 @@ from . import purge_data from . import purge_menus from . import ir_model_fields +from . import create_indexes diff --git a/database_cleanup/models/create_indexes.py b/database_cleanup/models/create_indexes.py new file mode 100644 index 00000000000..ab98d5c2aa2 --- /dev/null +++ b/database_cleanup/models/create_indexes.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from ..identifier_adapter import IdentifierAdapter +from openerp import api, fields, models + + +class CreateIndexesLine(models.TransientModel): + _inherit = 'cleanup.purge.line' + _name = 'cleanup.create_indexes.line' + + purged = fields.Boolean('Created') + wizard_id = fields.Many2one('cleanup.create_indexes.wizard') + field_id = fields.Many2one('ir.model.fields', required=True) + + @api.multi + def purge(self): + tables = set() + for field in self.mapped('field_id'): + model = self.env[field.model] + name = '%s_%s_index' % (model._table, field.name) + self.env.cr.execute( + 'create index %s ON %s (%s)', + ( + IdentifierAdapter(name, quote=False), + IdentifierAdapter(model._table), + IdentifierAdapter(field.name), + ), + ) + tables.add(model._table) + for table in tables: + self.env.cr.execute( + 'analyze %s', (IdentifierAdapter(model._table),) + ) + self.write({ + 'purged': True, + }) + + +class CreateIndexesWizard(models.TransientModel): + _inherit = 'cleanup.purge.wizard' + _name = 'cleanup.create_indexes.wizard' + _description = 'Create indexes' + + purge_line_ids = fields.One2many( + 'cleanup.create_indexes.line', 'wizard_id', + ) + + @api.multi + def find(self): + for field in self.env['ir.model.fields'].search([ + ('index', '=', True), + ]): + if field.model not in self.env.registry: + continue + model = self.env[field.model] + name = '%s_%s_index' % (model._table, field.name) + self.env.cr.execute( + 'select indexname from pg_indexes ' + 'where indexname=%s and tablename=%s', + (name, model._table) + ) + if self.env.cr.rowcount: + continue + + self.env.cr.execute( + 'select a.attname ' + 'from pg_attribute a ' + 'join pg_class c on a.attrelid=c.oid ' + 'join pg_tables t on t.tablename=c.relname ' + 'where attname=%s and c.relname=%s', + (field.name, model._table,) + ) + if not self.env.cr.rowcount: + continue + + yield (0, 0, { + 'name': '%s.%s' % (field.model, field.name), + 'field_id': field.id, + }) diff --git a/database_cleanup/views/create_indexes.xml b/database_cleanup/views/create_indexes.xml new file mode 100644 index 00000000000..b89c3993a86 --- /dev/null +++ b/database_cleanup/views/create_indexes.xml @@ -0,0 +1,52 @@ + + + + cleanup.create_indexes.wizard + + primary + + + + + + + + Create missing indexes + ir.actions.server + code + + action = self.get_wizard_action(cr, uid, context=context) + + + + cleanup.create_indexes.line + + primary + + + + + + + Create + ir.actions.server + code + + self.purge(cr, uid, context.get('active_ids', []), context) + + + + Create indexes + action + client_action_multi + cleanup.create_indexes.line + + + diff --git a/database_cleanup/views/menu.xml b/database_cleanup/views/menu.xml index 0796f907b07..6fc237eb952 100644 --- a/database_cleanup/views/menu.xml +++ b/database_cleanup/views/menu.xml @@ -52,5 +52,12 @@ + + Create missing indexes + + + + + diff --git a/database_cleanup/views/purge_wizard.xml b/database_cleanup/views/purge_wizard.xml index 40417f3a813..0fd88e793e2 100644 --- a/database_cleanup/views/purge_wizard.xml +++ b/database_cleanup/views/purge_wizard.xml @@ -9,7 +9,7 @@