]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- inlinings
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 16 Dec 2010 23:46:17 +0000 (18:46 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 16 Dec 2010 23:46:17 +0000 (18:46 -0500)
- in particular, mapper.primary_key is a tuple now

lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/collections.py
lib/sqlalchemy/orm/identity.py
lib/sqlalchemy/orm/interfaces.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/util/_collections.py
test/orm/inheritance/test_poly_linked_list.py

index 002215268a7fdeee020c2865d3ff929d16ff46bf..2ffffc0345356ed6274497d88d2c9768513d1b2a 100644 (file)
@@ -340,8 +340,6 @@ class AttributeImpl(object):
                     callable_ = None
 
                 if callable_ is not None:
-                    #if passive is not PASSIVE_OFF:
-                    #    return PASSIVE_NO_RESULT
                     value = callable_(passive=passive)
                     if value is PASSIVE_NO_RESULT:
                         return value
@@ -790,10 +788,8 @@ class CollectionAttributeImpl(AttributeImpl):
         collection, user_data = self._initialize_collection(state)
 
         if value:
-            for item in value:
-                collection.append_without_event(item)
+            collection.append_multiple_without_event(value)
 
-        state.callables.pop(self.key, None)
         state.dict[self.key] = user_data
 
         state.commit(dict_, [self.key])
index b523295232b6dca56e1321c17dc79006c2059a8e..99e6464f2995821b9c46c9155a5db003cb0cf2e3 100644 (file)
@@ -471,6 +471,9 @@ class CollectionAdapter(object):
     The ORM uses an CollectionAdapter exclusively for interaction with
     entity collections.
 
+    The usage of getattr()/setattr() is currently to allow injection
+    of custom methods, such as to unwrap Zope security proxies.
+    
     """
     def __init__(self, attr, owner_state, data):
         self._key = attr.key
@@ -553,6 +556,12 @@ class CollectionAdapter(object):
         """Add or restore an entity to the collection, firing no events."""
         getattr(self._data(), '_sa_appender')(item, _sa_initiator=False)
 
+    def append_multiple_without_event(self, items):
+        """Add or restore an entity to the collection, firing no events."""
+        appender = getattr(self._data(), '_sa_appender')
+        for item in items:
+            appender(item, _sa_initiator=False)
+
     def remove_with_event(self, item, initiator=None):
         """Remove an entity from the collection, firing mutation events."""
         getattr(self._data(), '_sa_remover')(item, _sa_initiator=initiator)
@@ -563,13 +572,17 @@ class CollectionAdapter(object):
 
     def clear_with_event(self, initiator=None):
         """Empty the collection, firing a mutation event for each entity."""
+        
+        remover = getattr(self._data(), '_sa_remover')
         for item in list(self):
-            self.remove_with_event(item, initiator)
+            remover(item, _sa_initiator=initiator)
 
     def clear_without_event(self):
         """Empty the collection, firing no events."""
+
+        remover = getattr(self._data(), '_sa_remover')
         for item in list(self):
-            self.remove_without_event(item)
+            remover(item, _sa_initiator=False)
 
     def __iter__(self):
         """Iterate over entities in the collection."""
index 30c3a06b70694e511c0e2dc8f720f93982c541a4..8604c000845750508b8d951b6369685f2679198b 100644 (file)
@@ -152,17 +152,16 @@ class WeakInstanceDict(IdentityMap):
             self._manage_removed_state(state)
         
     def get(self, key, default=None):
-        state = dict.get(self, key, default)
-        if state is default:
+        if not dict.__contains__(self, key):
             return default
+        state = dict.__getitem__(self, key)
         o = state.obj()
         if o is None:
             o = state._is_really_none()
-        if o is None:
-            return default
+            if o is None:
+                return default
         return o
 
-
     def items(self):
     # Py2K
         return list(self.iteritems())
index 2a9d3760b1c13880813c6f5ed75ca2fb618e26af..e917c675a4a737e92d9d51eafb424f19233b3a3c 100644 (file)
@@ -315,7 +315,7 @@ class StrategizedProperty(MapperProperty):
                 _reduce_path(path)), None)
         if cls:
             try:
-                return self.__all_strategies[cls]
+                return self._strategies[cls]
             except KeyError:
                 return self.__init_strategy(cls)
         else:
@@ -323,12 +323,12 @@ class StrategizedProperty(MapperProperty):
 
     def _get_strategy(self, cls):
         try:
-            return self.__all_strategies[cls]
+            return self._strategies[cls]
         except KeyError:
             return self.__init_strategy(cls)
 
     def __init_strategy(self, cls):
-        self.__all_strategies[cls] = strategy = cls(self)
+        self._strategies[cls] = strategy = cls(self)
         strategy.init()
         return strategy
 
@@ -341,7 +341,7 @@ class StrategizedProperty(MapperProperty):
                     create_row_processor(context, path, mapper, row, adapter)
 
     def do_init(self):
-        self.__all_strategies = {}
+        self._strategies = {}
         self.strategy = self.__init_strategy(self.strategy_class)
 
     def post_instrument_class(self, mapper):
index 2b050ebff683c5455d9e89f558507d80c9fe24a6..48c37f80d7731ccef57e0a23fda105719c03459f 100644 (file)
@@ -519,7 +519,7 @@ class Mapper(object):
                     "key columns for mapped table '%s'" % 
                     (self, self.mapped_table.description))
 
-            self.primary_key = primary_key
+            self.primary_key = tuple(primary_key)
             self._log("Identified primary key columns: %s", primary_key)
 
     def _configure_properties(self):
@@ -1287,8 +1287,13 @@ class Mapper(object):
 
     def _get_committed_state_attr_by_column(self, state, dict_, column,
                                                     passive=False):
-        return self._columntoproperty[column]._getcommitted(
-            state, dict_, column, passive=passive)
+                                                    
+        prop = self._columntoproperty[column]
+        value = state.manager[prop.key].impl.\
+                    get_committed_value(state, dict_, passive=passive)
+        if prop.get_col_value:
+            value = prop.get_col_value(column, value)
+        return value
 
     def _optimized_get_statement(self, state, attribute_names):
         """assemble a WHERE clause which retrieves a given state by primary
index d628d87dcec753a191aebe978c4b90891001cd6b..239159f3e4759ffe27a5695ec4bc3ba582fb82a6 100644 (file)
@@ -104,7 +104,7 @@ class ColumnProperty(StrategizedProperty):
     def do_init(self):
         super(ColumnProperty, self).do_init()
         if len(self.columns) > 1 and \
-                self.parent.primary_key.issuperset(self.columns):
+                set(self.parent.primary_key).issuperset(self.columns):
             util.warn(
                 ("On mapper %s, primary key column '%s' is being combined "
                  "with distinct primary key column '%s' in attribute '%s'.  "
index d6fb0c005f21312f6d5500035fc07dcf1319d4c9..ab7a181a77c4e1eae1a7307575cdf8b5870b8778 100644 (file)
@@ -580,9 +580,10 @@ class LoadLazyAttribute(object):
             
     def __call__(self, passive=False):
         state, key = self.state, self.key
-        instance_mapper = mapper._state_mapper(state)
+        instance_mapper = state.manager.mapper
         prop = instance_mapper._props[key]
-        strategy = prop._get_strategy(LazyLoader)
+        prop_mapper = prop.mapper
+        strategy = prop._strategies[LazyLoader]
         pending = not state.key
         
         if (
@@ -595,7 +596,7 @@ class LoadLazyAttribute(object):
             return attributes.PASSIVE_NO_RESULT
             
         session = sessionlib._state_session(state)
-        if session is None:
+        if not session:
             raise orm_exc.DetachedInstanceError(
                 "Parent instance %s is not bound to a Session; "
                 "lazy load operation of attribute '%s' cannot proceed" % 
@@ -610,13 +611,14 @@ class LoadLazyAttribute(object):
             else:
                 get_attr = instance_mapper._get_state_attr_by_column
             
+            dict_ = state.dict
             ident = [
                 get_attr(
                         state,
                         state.dict,
                         strategy._equated_columns[pk],
                         passive=passive)
-                for pk in prop.mapper.primary_key
+                for pk in prop_mapper.primary_key
             ]
             if attributes.PASSIVE_NO_RESULT in ident:
                 return attributes.PASSIVE_NO_RESULT
@@ -624,14 +626,14 @@ class LoadLazyAttribute(object):
             if _none_set.issuperset(ident):
                 return None
                 
-            ident_key = prop.mapper.identity_key_from_primary_key(ident)
+            ident_key = prop_mapper.identity_key_from_primary_key(ident)
             instance = Query._get_from_identity(session, ident_key, passive)
             if instance is not None:
                 return instance
             elif passive is attributes.PASSIVE_NO_FETCH:
                 return attributes.PASSIVE_NO_RESULT
                 
-        q = session.query(prop.mapper)._adapt_all_clauses()
+        q = session.query(prop_mapper)._adapt_all_clauses()
         
         # don't autoflush on pending
         if pending:
index cb6b27e367822dfb875ab464456ce4cd171f7693..67f37e76398c816eb1f91329e37a139365b63d4c 100644 (file)
@@ -1591,7 +1591,11 @@ class ColumnCollectionConstraint(Constraint):
         return self.columns.contains_column(col)
 
     def __iter__(self):
-        return iter(self.columns)
+        # inlining of 
+        # return iter(self.columns)
+        # ColumnCollection->OrderedProperties->OrderedDict
+        ordered_dict = self.columns._data
+        return (ordered_dict[key] for key in ordered_dict._list)
 
     def __len__(self):
         return len(self.columns)
index 98c894e5b80147882aee4d5090523998e0607240..022da2de8a62ccb074773c9479b814939ea7fbb0 100644 (file)
@@ -18,10 +18,9 @@ class NamedTuple(tuple):
     """
 
     def __new__(cls, vals, labels=None):
-        vals = list(vals)
         t = tuple.__new__(cls, vals)
         if labels:
-            t.__dict__ = dict(itertools.izip(labels, vals))
+            t.__dict__.update(zip(labels, vals))
             t._labels = labels
         return t
 
index 8b300f06a7367c7b6b4a00c5094bb182c9ca2d8f..db622920afa7e1d1f1acb870d66c7879fa9ec1c8 100644 (file)
@@ -113,7 +113,7 @@ class PolymorphicCircularTest(_base.MappedTest):
         table3_mapper = mapper(Table3, table3, inherits=table1_mapper, polymorphic_identity='table3')
 
         configure_mappers()
-        assert table1_mapper.primary_key == [table1.c.id], table1_mapper.primary_key
+        assert table1_mapper.primary_key == (table1.c.id,), table1_mapper.primary_key
 
     @testing.fails_on('maxdb', 'FIXME: unknown')
     def testone(self):