]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- use a different bitwise approach here that doesn't require iterating
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 4 Jan 2015 04:22:07 +0000 (23:22 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 4 Jan 2015 04:22:07 +0000 (23:22 -0500)
through all possible set values

lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/langhelpers.py

index 7836e954899383822d5d0afdd06bc392a8e8b571..9c3f23cb2f2090c2e859018804279102c17983ae 100644 (file)
@@ -1496,6 +1496,10 @@ class SET(_EnumeratedValues):
                 (value, 2 ** idx)
                 for idx, value in enumerate(self.values)
             )
+            self._bitmap.update(
+                (2 ** idx, value)
+                for idx, value in enumerate(self.values)
+            )
         kw.setdefault('length', length)
         super(SET, self).__init__(**kw)
 
@@ -1510,12 +1514,9 @@ class SET(_EnumeratedValues):
             def process(value):
                 if value is not None:
                     value = int(value)
+
                     return set(
-                        [
-                            elem
-                            for idx, elem in enumerate(self.values)
-                            if value & (2 ** idx)
-                        ]
+                        util.map_bits(self._bitmap.__getitem__, value)
                     )
                 else:
                     return None
index dfed5b90a70bdd1d0cebd83e16e2ac15d086f09a..7c85ef94b4ea8723d297c41c5adbf1e399ffd0ed 100644 (file)
@@ -36,7 +36,7 @@ from .langhelpers import iterate_attributes, class_hierarchy, \
     generic_repr, counter, PluginLoader, hybridproperty, hybridmethod, \
     safe_reraise,\
     get_callable_argspec, only_once, attrsetter, ellipses_string, \
-    warn_limited
+    warn_limited, map_bits
 
 from .deprecations import warn_deprecated, warn_pending_deprecation, \
     deprecated, pending_deprecation, inject_docstring_text
index 7f57e501ac432a7f3f7ba239c427df4d4e563911..b708665f9d9311c5042aac22a31f20c168697a59 100644 (file)
@@ -92,6 +92,15 @@ def _unique_symbols(used, *bases):
             raise NameError("exhausted namespace for symbol base %s" % base)
 
 
+def map_bits(fn, n):
+    """Call the given function given each nonzero bit from n."""
+
+    while n:
+        b = n & (~n + 1)
+        yield fn(b)
+        n ^= b
+
+
 def decorator(target):
     """A signature-matching decorator factory."""