]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
workin out the lazy/eager thing
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 17 Nov 2005 05:05:23 +0000 (05:05 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 17 Nov 2005 05:05:23 +0000 (05:05 +0000)
lib/sqlalchemy/attributes.py
test/mapper.py

index 35344350bd4aa18efc24e4798a9e3139d21bbe32..40c2cc1956036109bf6e792ebe5cf91ea1975363 100644 (file)
@@ -105,7 +105,7 @@ class ListElement(util.HistoryArraySet):
                 list_ = []
             obj.__dict__[key] = []
             
-        util.HistoryArraySet.__init__(self, list_, **kwargs)
+        util.HistoryArraySet.__init__(self, list_, readonly=kwargs.get('readonly', False))
 
     def gethistory(self, *args, **kwargs):
         return self
@@ -181,19 +181,19 @@ class AttributeManager(object):
         pass
 
     def value_changed(self, obj, key, value):
+        """subclasses override this method to provide functionality upon an attribute change of value."""
         pass
+        
     def create_prop(self, key, uselist, **kwargs):
         return SmartProperty(self).property(key, uselist)
     def create_list(self, obj, key, list_, **kwargs):
         return ListElement(obj, key, list_, **kwargs)
+    def create_callable(self, obj, key, func, uselist, **kwargs):
+        return CallableProp(self, func, obj, key, uselist, **kwargs)
         
     def get_attribute(self, obj, key, **kwargs):
         try:
             return self.get_history(obj, key, **kwargs).getattr()
-        except KeyError:
-            pass
-        try:
-            return obj.__dict__[key]
         except KeyError:
             raise AttributeError(key)
 
@@ -207,12 +207,6 @@ class AttributeManager(object):
     def delete_attribute(self, obj, key, **kwargs):
         self.get_history(obj, key, **kwargs).delattr()
         self.value_changed(obj, key, None)
-
-    def set_callable(self, obj, key, func, uselist, **kwargs):
-        self.attribute_history(obj)[key] = CallableProp(self, func, obj, key, uselist, **kwargs)
-    
-    def create_callable(self, obj, key, func, uselist, **kwargs):
-        return CallableProp(self, func, obj, key, uselist, **kwargs)
         
     def rollback(self, *obj):
         for o in obj:
@@ -234,8 +228,13 @@ class AttributeManager(object):
                 
     def remove(self, obj):
         pass
-            
-    def get_history(self, obj, key, create_prop = None, passive=False, **kwargs):
+
+    def create_history(self, obj, key, uselist, callable_=None, **kwargs):
+        p = self.create_history_container(obj, key, uselist, callable_=callable_, **kwargs)
+        self.attribute_history(obj)[key] = p
+        return p
+
+    def get_history(self, obj, key, passive=False, **kwargs):
         try:
             return self.attribute_history(obj)[key].gethistory(passive=passive, **kwargs)
         except KeyError, e:
@@ -262,25 +261,27 @@ class AttributeManager(object):
             attr = {}
             class_._class_managed_attributes = attr
         return attr
+
+
+    def create_history_container(self, obj, key, uselist, callable_ = None, **kwargs):
+        if callable_ is not None:
+            return self.create_callable(obj, key, callable_, uselist=uselist, **kwargs)
+        elif not uselist:
+            return PropHistory(obj, key, **kwargs)
+        else:
+            list_ = obj.__dict__.get(key, None)
+            return self.create_list(obj, key, list_, **kwargs)
         
-    def register_attribute(self, class_, key, uselist, create_prop = None, **kwargs):
+    def register_attribute(self, class_, key, uselist, callable_=None, **kwargs):
         # create a function, that will create this object attribute when its first called
         def createprop(obj):
-            if create_prop is not None:
-                # create the object attribute as a callable
-                # TODO: too much indirection here, figure out cleaner way
-                p = self.create_callable(obj, key, create_prop(obj), uselist=uselist, **kwargs)
-                self.attribute_history(obj)[key] = p
-                return p
-            elif not uselist:
-                p = PropHistory(obj, key, **kwargs)
-                self.attribute_history(obj)[key] = p
-                return p
+            if callable_ is not None: 
+                func = callable_(obj)
             else:
-                list_ = obj.__dict__.get(key, None)
-                p = self.create_list(obj, key, list_, **kwargs)
-                self.attribute_history(obj)[key] = p
-                return p
+                func = None
+            p = self.create_history_container(obj, key, uselist, callable_=func, **kwargs)
+            self.attribute_history(obj)[key] = p
+            return p
         
         self.class_managed(class_)[key] = createprop
         setattr(class_, key, self.create_prop(key, uselist))
index b846b12e07866842a3dd8ba4e6c24d0759caae52..989324b662367366b8dece881a49e32cde2bc534 100644 (file)
@@ -10,7 +10,7 @@ import tables
 
 class MapperSuperTest(AssertMixin):
     def setUpAll(self):
-#        db.echo = False
+        db.echo = False
         tables.create()
         tables.data()
         db.echo = testbase.echo
@@ -53,7 +53,9 @@ class MapperTest(MapperSuperTest):
         m = mapper(User, users, properties = dict(
             addresses = relation(Address, addresses, lazy = True)
         ))
+#        l = m.select()
         l = m.options(eagerload('addresses')).select()
+
         self.assert_result(l, User,
             {'user_id' : 7, 'addresses' : (Address, [{'address_id' : 1}])},
             {'user_id' : 8, 'addresses' : (Address, [{'address_id' : 2}, {'address_id' : 3}])},