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



Reply via email to