[IMP] models: convert deprecated model._all_columns into a dynamic property

The mappings model._all_columns takes quite some memory (around 2MB per
registry) because of the numerous dictionaries (one per model) and inefficient
memory storage of column_info.  Since it is deprecated and almost no longer
used, it can be computed on demand.
This commit is contained in:
Raphael Collet 2015-03-04 10:25:55 +01:00
parent e2ea691cef
commit 0f9b452c33
3 changed files with 13 additions and 17 deletions

View File

@ -111,9 +111,6 @@ class TestPropertyField(common.TransactionCase):
self.partner._columns.update({ self.partner._columns.update({
'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"), 'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"),
}) })
self.partner._all_columns.update({
'property_country': fields.column_info('property_country', self.partner._columns['property_country'], None, None, None),
})
self.partner._field_create(cr) self.partner._field_create(cr)
partner_id = self.partner.create(cr, alice, { partner_id = self.partner.create(cr, alice, {

View File

@ -341,7 +341,7 @@ class BaseModel(object):
# 1. includes self fields, # 1. includes self fields,
# 2. uses column_info instead of a triple. # 2. uses column_info instead of a triple.
# Warning: _all_columns is deprecated, use _fields instead # Warning: _all_columns is deprecated, use _fields instead
_all_columns = {} # _all_columns = {}
_table = None _table = None
_log_create = False _log_create = False
@ -491,7 +491,6 @@ class BaseModel(object):
""" """
field = cls._fields.pop(name) field = cls._fields.pop(name)
cls._columns.pop(name, None) cls._columns.pop(name, None)
cls._all_columns.pop(name, None)
if hasattr(cls, name): if hasattr(cls, name):
delattr(cls, name) delattr(cls, name)
return field return field
@ -2898,7 +2897,7 @@ class BaseModel(object):
@classmethod @classmethod
def _inherits_reload(cls): def _inherits_reload(cls):
""" Recompute the _inherit_fields and _all_columns mappings. """ """ Recompute the _inherit_fields mapping. """
cls._inherit_fields = struct = {} cls._inherit_fields = struct = {}
for parent_model, parent_field in cls._inherits.iteritems(): for parent_model, parent_field in cls._inherits.iteritems():
parent = cls.pool[parent_model] parent = cls.pool[parent_model]
@ -2908,19 +2907,17 @@ class BaseModel(object):
for name, source in parent._inherit_fields.iteritems(): for name, source in parent._inherit_fields.iteritems():
struct[name] = (parent_model, parent_field, source[2], source[3]) struct[name] = (parent_model, parent_field, source[2], source[3])
# old-api stuff @property
cls._all_columns = cls._get_column_infos() def _all_columns(self):
""" Returns a dict mapping all fields names (direct fields and inherited
@classmethod field via _inherits) to a ``column_info`` struct giving detailed columns.
def _get_column_infos(cls): Deprecated.
"""Returns a dict mapping all fields names (direct fields and """
inherited field via _inherits) to a ``column_info`` struct
giving detailed columns """
result = {} result = {}
# do not inverse for loops, since local fields may hide inherited ones! # do not inverse for loops, since local fields may hide inherited ones!
for k, (parent, m2o, col, original_parent) in cls._inherit_fields.iteritems(): for k, (parent, m2o, col, original_parent) in self._inherit_fields.iteritems():
result[k] = fields.column_info(k, col, parent, m2o, original_parent) result[k] = fields.column_info(k, col, parent, m2o, original_parent)
for k, col in cls._columns.iteritems(): for k, col in self._columns.iteritems():
result[k] = fields.column_info(k, col) result[k] = fields.column_info(k, col)
return result return result
@ -3024,7 +3021,7 @@ class BaseModel(object):
field = model._fields[field_name] field = model._fields[field_name]
field._triggers.update(triggers) field._triggers.update(triggers)
# determine old-api cls._inherit_fields and cls._all_columns # determine old-api structures about inherited fields
cls._inherits_reload() cls._inherits_reload()
# register stuff about low-level function fields # register stuff about low-level function fields

View File

@ -1681,6 +1681,8 @@ class column_info(object):
contains it i.e in case of multilevel inheritance, ``None`` for contains it i.e in case of multilevel inheritance, ``None`` for
local columns. local columns.
""" """
__slots__ = ['name', 'column', 'parent_model', 'parent_column', 'original_parent']
def __init__(self, name, column, parent_model=None, parent_column=None, original_parent=None): def __init__(self, name, column, parent_model=None, parent_column=None, original_parent=None):
self.name = name self.name = name
self.column = column self.column = column