[CalendarServer-changes] [7403] CalendarServer/trunk/twext/enterprise/dal

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 29 14:28:03 PDT 2011


Revision: 7403
          http://trac.macosforge.org/projects/calendarserver/changeset/7403
Author:   glyph at apple.com
Date:     2011-04-29 14:28:01 -0700 (Fri, 29 Apr 2011)
Log Message:
-----------
track indexes in the schema parser and model

Modified Paths:
--------------
    CalendarServer/trunk/twext/enterprise/dal/model.py
    CalendarServer/trunk/twext/enterprise/dal/parseschema.py
    CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py

Modified: CalendarServer/trunk/twext/enterprise/dal/model.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/model.py	2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/model.py	2011-04-29 21:28:01 UTC (rev 7403)
@@ -329,7 +329,23 @@
                 yield set(constraint.affectsColumns)
 
 
+class Index(object):
+    """
+    An L{Index} is an SQL index.
+    """
 
+    def __init__(self, schema, name, table):
+        self.name = name
+        self.table = table
+        self.columns = []
+        schema.indexes.append(self)
+
+
+    def addColumn(self, column):
+        self.columns.append(column)
+
+
+
 class Sequence(FancyEqMixin, object):
     """
     A sequence object.
@@ -337,10 +353,11 @@
 
     compareAttributes = 'name'.split()
 
-    def __init__(self, name):
+    def __init__(self, schema, name):
         _checkstr(name)
         self.name = name
         self.referringColumns = []
+        schema.sequences.append(self)
 
 
     def __repr__(self):
@@ -348,6 +365,18 @@
 
 
 
+def _namedFrom(name, sequence):
+    """
+    Retrieve an item with a given name attribute from a given sequence, or raise
+    a L{KeyError}.
+    """
+    for item in sequence:
+        if item.name == name:
+            return item
+    raise KeyError(name)
+
+
+
 class Schema(object):
     """
     A schema containing tables, indexes, and sequences.
@@ -356,6 +385,7 @@
     def __init__(self, filename='<string>'):
         self.filename = filename
         self.tables = []
+        self.indexes = []
         self.sequences = []
 
 
@@ -364,17 +394,14 @@
 
 
     def tableNamed(self, name):
-        for table in self.tables:
-            if table.name == name:
-                return table
-        raise KeyError(name)
+        return _namedFrom(name, self.tables)
 
 
     def sequenceNamed(self, name):
-        for sequence in self.sequences:
-            if sequence.name == name:
-                return sequence
-        raise KeyError(name)
+        return _namedFrom(name, self.sequences)
 
 
+    def indexNamed(self, name):
+        return _namedFrom(name, self.indexes)
 
+

Modified: CalendarServer/trunk/twext/enterprise/dal/parseschema.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/parseschema.py	2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/parseschema.py	2011-04-29 21:28:01 UTC (rev 7403)
@@ -26,9 +26,8 @@
 from sqlparse.sql import (Comment, Identifier, Parenthesis, IdentifierList,
                           Function)
 
-from twext.enterprise.dal.model import Schema, Table, SQLType, ProcedureCall
-from twext.enterprise.dal.model import Constraint
-from twext.enterprise.dal.model import Sequence
+from twext.enterprise.dal.model import (
+    Schema, Table, SQLType, ProcedureCall, Constraint, Sequence, Index)
 
 
 
@@ -116,9 +115,31 @@
                 t = tableFromCreateStatement(schema, stmt)
                 t.addComment(preface)
             elif createType == u'SEQUENCE':
-                schema.sequences.append(
-                    Sequence(
-                        stmt.token_next(2, True).get_name().encode('utf-8')))
+                Sequence(schema,
+                         stmt.token_next(2, True).get_name().encode('utf-8'))
+            elif createType == u'INDEX':
+                signifindex = iterSignificant(stmt)
+                expect(signifindex, ttype=Keyword.DDL, value='CREATE')
+                expect(signifindex, ttype=Keyword, value='INDEX')
+                indexName = nameOrIdentifier(signifindex.next())
+                expect(signifindex, ttype=Keyword, value='ON')
+                [tableName, columnArgs] = iterSignificant(expect(signifindex,
+                                                                 cls=Function))
+                tableName = nameOrIdentifier(tableName)
+                arggetter = iterSignificant(columnArgs)
+
+                expect(arggetter, ttype=Punctuation, value=u'(')
+                valueOrValues = arggetter.next()
+                if isinstance(valueOrValues, IdentifierList):
+                    valuelist = valueOrValues.get_identifiers()
+                else:
+                    valuelist = [valueOrValues]
+                expect(arggetter, ttype=Punctuation, value=u')')
+
+                idx = Index(schema, indexName, schema.tableNamed(tableName))
+                for token in valuelist:
+                    columnName = nameOrIdentifier(token)
+                    idx.addColumn(idx.table.columnNamed(columnName))
         elif stmt.get_type() == 'INSERT':
             insertTokens = iterSignificant(stmt)
             expect(insertTokens, ttype=Keyword.DML, value='INSERT')
@@ -412,7 +433,7 @@
     """
     if ttype is not None:
         if nextval.ttype != ttype:
-            raise ViolatedExpectation(ttype, '%s:%s' % (nextval.ttype, nextval))
+            raise ViolatedExpectation(ttype, '%s:%r' % (nextval.ttype, nextval))
     if value is not None:
         if nextval.value.upper() != value.upper():
             raise ViolatedExpectation(value, nextval.value)

Modified: CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py	2011-04-29 19:52:59 UTC (rev 7402)
+++ CalendarServer/trunk/twext/enterprise/dal/test/test_parseschema.py	2011-04-29 21:28:01 UTC (rev 7403)
@@ -244,3 +244,29 @@
         self.assertEquals(s.tableNamed("c").columnNamed("d").cascade, True)
 
 
+    def test_indexes(self):
+        """
+        A 'create index' statement will add an L{Index} object to a L{Schema}'s
+        C{indexes} list.
+        """
+        s = Schema()
+        addSQLToSchema(
+            s,
+            """
+            create table q (b integer); -- noise
+            create table a (b integer primary key, c integer);
+            create table z (c integer); -- make sure we get the right table
+
+            create index idx_a_b on a(b);
+            create index idx_a_b_c on a(c, b);
+            """)
+
+        a = s.tableNamed("a")
+        b = s.indexNamed("idx_a_b")
+        bc = s.indexNamed('idx_a_b_c')
+        self.assertEquals(b.table, a)
+        self.assertEquals(b.columns, [a.columnNamed("b")])
+        self.assertEquals(bc.table, a)
+        self.assertEquals(bc.columns, [a.columnNamed("c"), a.columnNamed("b")])
+
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110429/95fcab9f/attachment-0001.html>


More information about the calendarserver-changes mailing list