]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- precompiled regexp for anonymous labels
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Aug 2007 16:25:30 +0000 (16:25 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Aug 2007 16:25:30 +0000 (16:25 +0000)
- has_key()->__contains__()

lib/sqlalchemy/ansisql.py
lib/sqlalchemy/sql.py

index bfb08d3376740db827febe1819ce297fd6d363ff..1dec5ede0f06f796e221efa49ce1f1dea12d01cb 100644 (file)
@@ -47,6 +47,7 @@ ILLEGAL_INITIAL_CHARACTERS = util.Set(string.digits + '$')
 
 BIND_PARAMS = re.compile(r'(?<![:\w\$\x5c]):([\w\$]+)(?![:\w\$])', re.UNICODE)
 BIND_PARAMS_ESC = re.compile(r'\x5c(:[\w\$]+)(?![:\w\$])', re.UNICODE)
+ANONYMOUS_LABEL = re.compile(r'{ANON (-?\d+) (.*)}')
 
 OPERATORS =  {
     operator.and_ : 'AND',
@@ -447,8 +448,9 @@ class ANSICompiler(engine.Compiled, sql.ClauseVisitor):
     def _truncated_identifier(self, ident_class, name):
         if (ident_class, name) in self.generated_ids:
             return self.generated_ids[(ident_class, name)]
-            
-        anonname = self._anonymize(name)
+        
+        anonname = ANONYMOUS_LABEL.sub(self._process_anon, name)
+
         if len(anonname) > self.dialect.max_identifier_length():
             counter = self.generated_ids.get(ident_class, 1)
             truncname = name[0:self.dialect.max_identifier_length() - 6] + "_" + hex(counter)[2:]
@@ -457,19 +459,20 @@ class ANSICompiler(engine.Compiled, sql.ClauseVisitor):
             truncname = anonname
         self.generated_ids[(ident_class, name)] = truncname
         return truncname
+
+    def _process_anon(self, match):
+        (ident, derived) = match.group(1,2)
+        if ('anonymous', ident) in self.generated_ids:
+            return self.generated_ids[('anonymous', ident)]
+        else:
+            anonymous_counter = self.generated_ids.get('anonymous', 1)
+            newname = derived + "_" + str(anonymous_counter)
+            self.generated_ids['anonymous'] = anonymous_counter + 1
+            self.generated_ids[('anonymous', ident)] = newname
+            return newname
     
     def _anonymize(self, name):
-        def anon(match):
-            (ident, derived) = match.group(1,2)
-            if ('anonymous', ident) in self.generated_ids:
-                return self.generated_ids[('anonymous', ident)]
-            else:
-                anonymous_counter = self.generated_ids.get('anonymous', 1)
-                newname = derived + "_" + str(anonymous_counter)
-                self.generated_ids['anonymous'] = anonymous_counter + 1
-                self.generated_ids[('anonymous', ident)] = newname
-                return newname
-        return re.sub(r'{ANON (-?\d+) (.*)}', anon, name)
+        return ANONYMOUS_LABEL.sub(self._process_anon, name)
             
     def bindparam_string(self, name):
         return self.bindtemplate % name
index 28b750c4ad45446d1e4df237ca0c6c97eed9639b..ee64e82f27f7c6d2a7d43b324fe0ff36e3a75f81 100644 (file)
@@ -2577,7 +2577,7 @@ class Alias(FromClause):
             alias = '{ANON %d %s}' % (id(self), alias or 'anon')
         self.name = alias
         self.encodedname = alias.encode('ascii', 'backslashreplace')
-
+        
     def is_derived_from(self, fromclause):
         x = self.selectable
         while True:
@@ -2780,7 +2780,7 @@ class _ColumnClause(ColumnElement):
             if self.table is not None and self.table.named_with_column():
                 self.__label = self.table.name + "_" + self.name
                 counter = 1
-                while self.table.c.has_key(self.__label):
+                while self.__label in self.table.c:
                     self.__label = self.__label + "_%d" % counter
                     counter += 1
             else:
@@ -2837,7 +2837,7 @@ class TableClause(FromClause):
         self.encodedname = self.name.encode('ascii', 'backslashreplace')
         self._oid_column = _ColumnClause('oid', self, _is_oid=True)
         self._export_columns(columns)
-
+        
     def _clone(self):
         # TableClause is immutable
         return self