]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged merge fix from r4834/rel_0_4 branch
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 3 Jun 2008 14:33:08 +0000 (14:33 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 3 Jun 2008 14:33:08 +0000 (14:33 +0000)
CHANGES
lib/sqlalchemy/databases/postgres.py
lib/sqlalchemy/orm/interfaces.py
lib/sqlalchemy/orm/properties.py
test/orm/merge.py

diff --git a/CHANGES b/CHANGES
index 841a6227556cc8904adf9b3b018c7c1c43530b05..4a08007cdfb36a04bca46c7f628a7b05a93a1f01 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -77,6 +77,9 @@ user_defined_state
       will alias() the secondary (association) table so
       that multiple contains() calls will not conflict
       with each other [ticket:1058]
+
+    - fixed bug preventing merge() from functioning in 
+      conjunction with a comparable_property()
       
 - mysql
     - Added 'CALL' to the list of SQL keywords which return
index 2f4865e96e96d83ac8b1a7889197802f8e5c6e30..430fdc61ab6c4858406bbf4fe10439ce4e00e089 100644 (file)
@@ -675,7 +675,7 @@ class PGCompiler(compiler.DefaultCompiler):
             text += " OFFSET " + str(select._offset)
         return text
 
-    def get_select_precolumns(self, select):
+    def dont_get_select_precolumns(self, select):
         if select._distinct:
             if isinstance(select._distinct, bool):
                 return "DISTINCT "
index 7b120e884f7a11060605e290d37045f5498c05e3..eb333dfd2ffb51db12b0b553d144996c11edec72 100644 (file)
@@ -398,7 +398,7 @@ class MapperProperty(object):
 
         return not self.parent.non_primary
 
-    def merge(self, session, source, dest):
+    def merge(self, session, source, dest, dont_load, _recursive):
         """Merge the attribute represented by this ``MapperProperty``
         from source to destination object"""
 
index 792824fe3f3f2092025b5f7eaea530f7e29334dc..1ce71fdb64e89e307c4203297365046e1d074903 100644 (file)
@@ -192,7 +192,7 @@ class SynonymProperty(MapperProperty):
 
         strategies.DefaultColumnLoader(self)._register_attribute(None, None, False, comparator_callable, proxy_property=self.descriptor)
 
-    def merge(self, session, source, dest, _recursive):
+    def merge(self, session, source, dest, dont_load, _recursive):
         pass
 SynonymProperty.logger = log.class_logger(SynonymProperty)
 
@@ -215,6 +215,9 @@ class ComparableProperty(MapperProperty):
     def create_row_processor(self, selectcontext, path, mapper, row, adapter):
         return (None, None)
 
+    def merge(self, session, source, dest, dont_load, _recursive):
+        pass
+
 
 class PropertyLoader(StrategizedProperty):
     """Describes an object property that holds a single item or list
index 3d35397fb44a394576678d8cb3a8080bf7f46ba0..e8502d8912254fde5df3b5c921ae5db868b5ba08 100644 (file)
@@ -1,7 +1,7 @@
 import testenv; testenv.configure_for_tests()
 from testlib import sa, testing
 from testlib.sa.util import OrderedSet
-from testlib.sa.orm import mapper, relation, create_session
+from testlib.sa.orm import mapper, relation, create_session, PropComparator, synonym, comparable_property
 from testlib.testing import eq_, ne_
 from orm import _base, _fixtures
 
@@ -670,6 +670,33 @@ class MergeTest(_fixtures.FixtureTest):
         except sa.exc.InvalidRequestError, e:
             assert "dont_load=True option does not support" in str(e)
 
+    @testing.resolve_artifact_names
+    def test_synonym_comparable(self):
+        class User(object):
+
+           class Comparator(PropComparator):
+               pass
+
+           def _getValue(self):
+               return self._value
+
+           def _setValue(self, value):
+               setattr(self, '_value', value)
+
+           value = property(_getValue, _setValue)
+
+        mapper(User, users, properties={
+            'uid':synonym('id'),
+            'foobar':comparable_property(User.Comparator,User.value),
+        })
+        
+        sess = create_session()
+        u = User()
+        u.name = 'ed'
+        sess.save(u)
+        sess.flush()
+        sess.expunge(u)
+        sess.merge(u)
 
 if __name__ == "__main__":
     testenv.main()