Reviewers: ,
Please review this at http://codereview.tryton.org/590007/
Affected files:
M trytond/model/modelsql.py
M trytond/model/modelstorage.py
Index: trytond/model/modelsql.py
===================================================================
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -1207,21 +1207,22 @@
rows = cursor.dictfetchmany(cursor.IN_MAX)
cache = cursor.get_cache(Transaction().context)
- cache.setdefault(cls.__name__, LRUDict(RECORD_CACHE_SIZE))
+ if cls.__name__ not in cache:
+ cache[cls.__name__] = LRUDict(RECORD_CACHE_SIZE)
delete_records =
Transaction().delete_records.setdefault(cls.__name__,
set())
keys = None
for data in islice(rows, 0, cache.size_limit):
if data['id'] in delete_records:
continue
- if not keys:
+ if keys is None:
keys = data.keys()
for k in keys[:]:
if k in ('_timestamp', '_datetime'):
keys.remove(k)
continue
field = cls._fields[k]
- if field._type not in ('many2one',):
+ if not getattr(field, 'datetime_field', None):
keys.remove(k)
continue
for k in keys:
Index: trytond/model/modelstorage.py
===================================================================
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -1145,14 +1145,6 @@
if self._local_counter != counter:
self._local_cache.clear()
self._local_counter = counter
- try:
- return self._local_cache[self.id][name]
- except KeyError:
- pass
- try:
- return self._cache[self.id][name]
- except KeyError:
- pass
# fetch the definition of the field
if name in self._fields:
@@ -1163,6 +1155,16 @@
raise AttributeError("'%s' Model has no attribute '%s'"
% (self.__name__, name))
+ try:
+ return self._local_cache[self.id][name]
+ except KeyError:
+ pass
+ try:
+ if field._type not in ('many2one', 'reference'):
+ return self._cache[self.id][name]
+ except KeyError:
+ pass
+
# build the list of fields we will fetch
ffields = {
name: field,
@@ -1224,14 +1226,8 @@
ffields[field.datetime_field] = datetime_field
def filter_(id_):
- try:
- if name in self._local_cache[id_]:
- return False
- if name in self._cache[id_]:
- return False
- except KeyError:
- pass
- return True
+ return (name not in self._cache.get(id_, {})
+ and name not in self._local_cache.get(id_, {}))
index = self._ids.index(self.id)
ids = chain(islice(self._ids, index, None),
islice(self._ids, 0, max(index - 1, 0)))
@@ -1278,25 +1274,39 @@
with contextlib.nested(Transaction().set_cursor(self._cursor),
Transaction().set_user(self._user),
Transaction().set_context(self._context)):
+ if not ids:
+ # All values in cache
+ ids = islice(chain(islice(self._ids, index, None),
+ islice(self._ids, 0, max(index - 1, 0))),
+ self._cursor.IN_MAX)
+ ffields = {name: ffields[name]}
+ read_data = [{'id': i, name: self._cache[i][name]}
+ for i in ids]
+ else:
+ read_data = self.read(ids, ffields.keys())
# create browse records for 'remote' models
- for data in self.read(ids, ffields.keys()):
+ for data in read_data:
for fname, field in ffields.iteritems():
+ fvalue = data[fname]
if field._type in ('many2one', 'one2one', 'one2many',
'many2many', 'reference'):
- data[fname] = instantiate(field, data[fname], data)
- elif not isinstance(field, fields.Function):
+ fvalue = instantiate(field, data[fname], data)
+ if data['id'] == self.id and fname == name:
+ value = fvalue
+ if (field._type not in
('many2one', 'one2one', 'one2many',
+ 'many2many', 'reference')
+ and not isinstance(field, fields.Function)):
continue
- if data['id'] == self.id and fname == name:
- value = data[fname]
if data['id'] not in self._local_cache:
self._local_cache[data['id']] = {}
- self._local_cache[data['id']][fname] = data[fname]
- del data[fname]
+ self._local_cache[data['id']][fname] = fvalue
+ if (field._type not in ('many2one', 'reference')
+ or getattr(field, 'datetime_field', None)
+ or isinstance(field, fields.Function)):
+ del data[fname]
if data['id'] not in self._cache:
self._cache[data['id']] = {}
self._cache[data['id']].update(data)
- if data['id'] == self.id and name in data:
- value = data[name]
return value
@property
--
--
[email protected] mailing list