Code

Ticket #7338: method_cache_r9787.diff

File method_cache_r9787.diff, 3.2 KB (added by msaelices, 5 years ago)

Patch that work with django r9787 revision

Line 
1Index: django/db/models/sql/query.py
2===================================================================
3--- django/db/models/sql/query.py       (revisión: 9787)
4+++ django/db/models/sql/query.py       (copia de trabajo)
5@@ -22,6 +22,7 @@
6 from django.core.exceptions import FieldError
7 from datastructures import EmptyResultSet, Empty, MultiJoin
8 from constants import *
9+from django.core.cache import cache
10 
11 try:
12     set
13@@ -90,6 +91,9 @@
14         self.extra_params = ()
15         self.extra_order_by = ()
16 
17+        # Cached queryset atribute. None means no cached
18+        self.cache_timeout = None
19+
20     def __str__(self):
21         """
22         Returns the query as a string of SQL with the parameter values
23@@ -190,6 +194,7 @@
24         obj.extra_where = self.extra_where
25         obj.extra_params = self.extra_params
26         obj.extra_order_by = self.extra_order_by
27+        obj.cache_timeout = self.cache_timeout
28         if self.filter_is_sticky and self.used_aliases:
29             obj.used_aliases = self.used_aliases.copy()
30         else:
31@@ -237,7 +242,26 @@
32         """
33         resolve_columns = hasattr(self, 'resolve_columns')
34         fields = None
35-        for rows in self.execute_sql(MULTI):
36+        if self.cache_timeout is not None:
37+            # Check cache for stored objects from an exactly equal query
38+            k = str(self)
39+            try:
40+                import hashlib
41+            except ImportError:
42+                import sha
43+                k = sha.new(k).hexdigest()
44+            else:
45+                k = hashlib.sha1(k).hexdigest()
46+
47+            if cache.has_key(k) and cache.get(k):
48+                sql_result = cache.get(k, [])
49+            else:
50+                cache.set(k, [i for i in self.execute_sql(MULTI)], self.cache_timeout)
51+                sql_result = cache.get(k, [])
52+        else:
53+            sql_result = self.execute_sql(MULTI)
54+
55+        for rows in sql_result:
56             for row in rows:
57                 if resolve_columns:
58                     if fields is None:
59Index: django/db/models/manager.py
60===================================================================
61--- django/db/models/manager.py (revisión: 9787)
62+++ django/db/models/manager.py (copia de trabajo)
63@@ -140,6 +140,9 @@
64     def reverse(self, *args, **kwargs):
65         return self.get_query_set().reverse(*args, **kwargs)
66 
67+    def cache(self, timeout=20):
68+        return self.get_query_set().cache(timeout=timeout)
69+       
70     def _insert(self, values, **kwargs):
71         return insert_query(self.model, values, **kwargs)
72 
73Index: django/db/models/query.py
74===================================================================
75--- django/db/models/query.py   (revisión: 9787)
76+++ django/db/models/query.py   (copia de trabajo)
77@@ -640,6 +640,16 @@
78         clone.query.standard_ordering = not clone.query.standard_ordering
79         return clone
80 
81+    def cache(self, timeout=20):
82+        """
83+        Forces the current queryset to check if a exact equal query has been
84+        stored in the cache. The expiration time is the seconds in 'timeout'
85+        variable.
86+        """
87+        clone = self._clone()
88+        clone.query.cache_timeout = timeout
89+        return clone
90+
91     ###################
92     # PRIVATE METHODS #
93     ###################