]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- converted some more attributes to @memoized_property in expressions
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 10 Nov 2008 20:22:18 +0000 (20:22 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 10 Nov 2008 20:22:18 +0000 (20:22 +0000)
- flattened an unnecessary KeyError in identity.py
- memoized the default list of mapper properties queried in MapperEntity.setup_context

lib/sqlalchemy/orm/identity.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/sql/expression.py

index 8ad2b64bb257c40762c0fe80ed210db3322f39d9..7d3856a17819f14c85bbad36d95ac72ef24c3a42 100644 (file)
@@ -87,10 +87,13 @@ class WeakInstanceDict(IdentityMap):
 
     def __contains__(self, key):
         try:
-            state = dict.__getitem__(self, key)
-            o = state.obj()
-            if o is None:
-                o = state._is_really_none()
+            if dict.__contains__(self, key):
+                state = dict.__getitem__(self, key)
+                o = state.obj()
+                if o is None:
+                    o = state._is_really_none()
+            else:
+                return False
         except KeyError:
             return False
         return o is not None
@@ -112,9 +115,8 @@ class WeakInstanceDict(IdentityMap):
         self.remove(state)
         
     def remove(self, state):
-        if not self.contains_state(state):
+        if dict.pop(self, state.key) is not state:
             raise AssertionError("State %s is not present in this identity map" % state)
-        dict.__delitem__(self, state.key)
         del state._instance_dict
         self._manage_removed_state(state)
     
@@ -166,9 +168,8 @@ class StrongInstanceDict(IdentityMap):
         self._manage_incoming_state(state)
     
     def remove(self, state):
-        if not self.contains_state(state):
+        if dict.pop(self, state.key) is not state:
             raise AssertionError("State %s is not present in this identity map" % state)
-        dict.__delitem__(self, state.key)
         self._manage_removed_state(state)
     
     def discard(self, state):
index 42597cda1b654c78550c170d2f60bd4fb1745330..37a43101286cb812d290b6cb9253ae056fad8a28 100644 (file)
@@ -857,12 +857,19 @@ class Mapper(object):
         else:
             return mappers, self._selectable_from_mappers(mappers)
 
+    @util.memoized_property
+    def _default_polymorphic_properties(self):
+        return util.unique_list(
+            chain(*[list(mapper.iterate_properties) for mapper in [self] + self._with_polymorphic_mappers])
+        )
+        
     def _iterate_polymorphic_properties(self, mappers=None):
         if mappers is None:
-            mappers = self._with_polymorphic_mappers
-        return iter(util.unique_list(
-            chain(*[list(mapper.iterate_properties) for mapper in [self] + mappers])
-        ))
+            return iter(self._default_polymorphic_properties)
+        else:
+            return iter(util.unique_list(
+                chain(*[list(mapper.iterate_properties) for mapper in [self] + mappers])
+            ))
 
     @property
     def properties(self):
index 7ca3d7b9e2689dcdc5cfdc51756216e53156b615..4891b5ca50bf8acf87acb2959e2b9539fb2f6851 100644 (file)
@@ -1844,34 +1844,36 @@ class FromClause(Selectable):
         return getattr(self, 'name', self.__class__.__name__ + " object")
 
     def _reset_exported(self):
-        # delete all the "generated" collections of columns for a
-        # newly cloned FromClause, so that they will be re-derived
-        # from the item.  this is because FromClause subclasses, when
-        # cloned, need to reestablish new "proxied" columns that are
-        # linked to the new item
-        for attr in ('_columns', '_primary_key' '_foreign_keys', '_embedded_columns', '_all_froms'):
-            if hasattr(self, attr):
-                delattr(self, attr)
-
-    def _expr_attr_func(name):
-        get = attrgetter(name)
-        def attr(self):
-            try:
-                return get(self)
-            except AttributeError:
-                self._export_columns()
-                return get(self)
-        return property(attr)
+        """delete memoized collections when a FromClause is cloned."""
+
+        for attr in ('_columns', '_primary_key' '_foreign_keys', 'locate_all_froms'):
+            self.__dict__.pop(attr, None)
+
+    @util.memoized_property
+    def _columns(self):
+        self._export_columns()
+        return self._columns
+    
+    @util.memoized_property
+    def _primary_key(self):
+        self._export_columns()
+        return self._primary_key
     
-    columns = c = _select_iterable = _expr_attr_func('_columns')
-    primary_key = _expr_attr_func('_primary_key')
-    foreign_keys = _expr_attr_func('_foreign_keys')
+    @util.memoized_property
+    def _foreign_keys(self):
+        self._export_columns()
+        return self._foreign_keys
+        
+    columns = property(attrgetter('_columns'))
+    primary_key = property(attrgetter('_primary_key'))
+    foreign_keys = property(attrgetter('_foreign_keys'))
 
+    # synonyms for 'columns'
+    c = _select_iterable = property(attrgetter('columns'))
+    
     def _export_columns(self):
         """Initialize column collections."""
 
-        if hasattr(self, '_columns'):
-            return
         self._columns = ColumnCollection()
         self._primary_key = ColumnSet()
         self._foreign_keys = set()
@@ -2622,7 +2624,6 @@ class _FromGrouping(FromClause):
     @property
     def columns(self):
         return self.element.columns
-    c = columns
 
     @property
     def _hide_froms(self):
@@ -3000,8 +3001,8 @@ class _ScalarSelect(_Grouping):
     def columns(self):
         raise exc.InvalidRequestError("Scalar Select expression has no columns; "
                     "use this object directly within a column-level expression.")
-    c = columns
-
+    c  = columns
+    
     def self_group(self, **kwargs):
         return self
 
@@ -3169,7 +3170,8 @@ class Select(_SelectBaseMixin, FromClause):
         raise exc.InvalidRequestError("Select objects don't have a type.  "
                     "Call as_scalar() on this Select object "
                     "to return a 'scalar' version of this Select.")
-
+    
+    @util.memoized_instancemethod
     def locate_all_froms(self):
         """return a Set of all FromClause elements referenced by this Select.
 
@@ -3177,10 +3179,7 @@ class Select(_SelectBaseMixin, FromClause):
         is specifically for those FromClause elements that would actually be rendered.
         
         """
-        if not hasattr(self, '_all_froms'):
-            self._all_froms = self._froms.union(_from_objects(*list(self._froms)))
-
-        return self._all_froms
+        return self._froms.union(_from_objects(*list(self._froms)))
 
     @property
     def inner_columns(self):