]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
further minute speedups
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 26 May 2007 17:33:53 +0000 (17:33 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 26 May 2007 17:33:53 +0000 (17:33 +0000)
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/strategies.py
test/perf/masseagerload.py

index edcd7756bb6079752ee3ae6a19d0251a80afd2c3..f64360766f8842586a99a23866c8d9311ba904cf 100644 (file)
@@ -154,7 +154,7 @@ class InstrumentedAttribute(object):
             pass
 
     def _get_callable(self, obj):
-        if obj._state.has_key(('callable', self)):
+        if ('callable', self) in obj._state:
             return obj._state[('callable', self)]
         elif self.callable_ is not None:
             return self.callable_(obj)
@@ -220,7 +220,7 @@ class InstrumentedAttribute(object):
             state = obj._state
             # if an instance-wide "trigger" was set, call that
             # and start again
-            if state.has_key('trigger'):
+            if 'trigger' in state:
                 trig = state['trigger']
                 del state['trigger']
                 trig()
@@ -259,7 +259,7 @@ class InstrumentedAttribute(object):
         if event is not self:
             state = obj._state
             # if an instance-wide "trigger" was set, call that
-            if state.has_key('trigger'):
+            if 'trigger' in state:
                 trig = state['trigger']
                 del state['trigger']
                 trig()
@@ -680,7 +680,7 @@ class CommittedState(object):
         """
 
         if value is CommittedState.NO_VALUE:
-            if obj.__dict__.has_key(attr.key):
+            if attr.key in obj.__dict__:
                 value = obj.__dict__[attr.key]
         if value is not CommittedState.NO_VALUE:
             self.data[attr.key] = attr.copy(value)
@@ -928,7 +928,7 @@ class AttributeManager(object):
         by ``trigger_history()``.
         """
 
-        return obj._state.has_key('trigger')
+        return 'trigger' in obj._state
 
     def reset_instance_attribute(self, obj, key):
         """Remove any per-instance callable functions corresponding to
index 1017c3def46f4d7d0b1a2c1705ea9e82ca9a4a37..25e78b7fe55923d8d1894256e5b33d812b3c7e9c 100644 (file)
@@ -1472,7 +1472,7 @@ class Mapper(object):
             if self.__should_log_debug:
                 self.__log_debug("_instance(): identity key %s not in session" % str(identitykey))
         # look in result-local identitymap for it.
-        exists = context.identity_map.has_key(identitykey)
+        exists = identitykey in context.identity_map
         if not exists:
             if self.allow_null_pks:
                 # check if *all* primary key cols in the result are None - this indicates
@@ -1505,9 +1505,10 @@ class Mapper(object):
 
         # call further mapper properties on the row, to pull further
         # instances from the row and possibly populate this item.
-        if extension.populate_instance(self, context, row, instance, **{'instancekey':identitykey, 'isnew':isnew}) is EXT_PASS:
-            self.populate_instance(context, instance, row, **{'instancekey':identitykey, 'isnew':isnew})
-        if extension.append_result(self, context, row, instance, result, **{'instancekey':identitykey, 'isnew':isnew}) is EXT_PASS:
+        flags = {'instancekey':identitykey, 'isnew':isnew}
+        if extension.populate_instance(self, context, row, instance, **flags) is EXT_PASS:
+            self.populate_instance(context, instance, row, **flags)
+        if extension.append_result(self, context, row, instance, result, **flags) is EXT_PASS:
             if result is not None:
                 result.append(instance)
         return instance
@@ -1799,7 +1800,7 @@ class _ExtensionCarrier(MapperExtension):
 
     def __iter__(self):
         return iter(self.__elements)
-        
+
     def insert(self, extension):
         """Insert a MapperExtension at the beginning of this ExtensionCarrier's list."""
 
@@ -1809,62 +1810,34 @@ class _ExtensionCarrier(MapperExtension):
         """Append a MapperExtension at the end of this ExtensionCarrier's list."""
 
         self.__elements.append(extension)
+        
+    def _create_do(funcname):
+        def _do(self, *args, **kwargs):
+            for elem in self.__elements:
+                ret = getattr(elem, funcname)(*args, **kwargs)
+                if ret is not EXT_PASS:
+                    return ret
+            else:
+                return EXT_PASS
+        return _do
+        
+    get_session = _create_do('get_session')
+    load = _create_do('load')
+    get = _create_do('get')
+    get_by = _create_do('get_by')
+    select_by = _create_do('select_by')
+    select = _create_do('select')
+    translate_row = _create_do('translate_row')
+    create_instance = _create_do('create_instance')
+    append_result = _create_do('append_result')
+    populate_instance = _create_do('populate_instance')
+    before_insert = _create_do('before_insert')
+    before_update = _create_do('before_update')
+    after_update = _create_do('after_update')
+    after_insert = _create_do('after_insert')
+    before_delete = _create_do('before_delete')
+    after_delete = _create_do('after_delete')
 
-    def get_session(self, *args, **kwargs):
-        return self._do('get_session', *args, **kwargs)
-
-    def load(self, *args, **kwargs):
-        return self._do('load', *args, **kwargs)
-
-    def get(self, *args, **kwargs):
-        return self._do('get', *args, **kwargs)
-
-    def get_by(self, *args, **kwargs):
-        return self._do('get_by', *args, **kwargs)
-
-    def select_by(self, *args, **kwargs):
-        return self._do('select_by', *args, **kwargs)
-
-    def select(self, *args, **kwargs):
-        return self._do('select', *args, **kwargs)
-
-    def translate_row(self, *args, **kwargs):
-        return self._do('translate_row', *args, **kwargs)
-
-    def create_instance(self, *args, **kwargs):
-        return self._do('create_instance', *args, **kwargs)
-
-    def append_result(self, *args, **kwargs):
-        return self._do('append_result', *args, **kwargs)
-
-    def populate_instance(self, *args, **kwargs):
-        return self._do('populate_instance', *args, **kwargs)
-
-    def before_insert(self, *args, **kwargs):
-        return self._do('before_insert', *args, **kwargs)
-
-    def before_update(self, *args, **kwargs):
-        return self._do('before_update', *args, **kwargs)
-
-    def after_update(self, *args, **kwargs):
-        return self._do('after_update', *args, **kwargs)
-
-    def after_insert(self, *args, **kwargs):
-        return self._do('after_insert', *args, **kwargs)
-
-    def before_delete(self, *args, **kwargs):
-        return self._do('before_delete', *args, **kwargs)
-
-    def after_delete(self, *args, **kwargs):
-        return self._do('after_delete', *args, **kwargs)
-
-    def _do(self, funcname, *args, **kwargs):
-        for elem in self.__elements:
-            ret = getattr(elem, funcname)(*args, **kwargs)
-            if ret is not EXT_PASS:
-                return ret
-        else:
-            return EXT_PASS
 
 class ExtensionOption(MapperOption):
     def __init__(self, ext):
index d15d29a228a1385616679b5fb61b137be5261a1b..95cd1b88781383c15fdb422c18eeebbd40db336e 100644 (file)
@@ -494,11 +494,11 @@ class EagerLoader(AbstractRelationLoader):
                 def __init__(self, row):
                     self.row = row
                 def __contains__(self, key):
-                    return self.has_key(key)
+                    return key in map or key in self.row
                 def has_key(self, key):
-                    return map.has_key(key) or self.row.has_key(key)
+                    return key in self
                 def __getitem__(self, key):
-                    if map.has_key(key):
+                    if key in map:
                         key = map[key]
                     return self.row[key]
                 def keys(self):
index 2869fc6f7db8cf7421666072788880571c565d48..23b4c5ba1b78046994a2786a8f8260bffbc53df6 100644 (file)
@@ -8,8 +8,8 @@ import time
 
 db = testbase.db
 
-NUM = 500
-DIVISOR = 50
+NUM = 25000
+DIVISOR = 500
 
 class LoadTest(AssertMixin):
     def setUpAll(self):