[CalendarServer-changes] [10118] CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/ datastore/sql.py

source_changes at macosforge.org source_changes at macosforge.org
Sun Dec 2 16:08:43 PST 2012


Revision: 10118
          http://trac.calendarserver.org//changeset/10118
Author:   gaya at apple.com
Date:     2012-12-02 16:08:43 -0800 (Sun, 02 Dec 2012)
Log Message:
-----------
get rid of DELETE loops. cleaning.

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py

Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2012-12-02 21:13:11 UTC (rev 10117)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py	2012-12-03 00:08:43 UTC (rev 10118)
@@ -159,8 +159,9 @@
                     abo.CREATED,
                     abo.MODIFIED))
 
+
     @classmethod
-    def _columnsWithResourceIDsQuery(cls, columns, resourceIDs): #@NoSelf
+    def _abObjectColumnsWithResourceIDsQuery(cls, columns, resourceIDs): #@NoSelf
         """
         DAL statement to retrieve addressbook object rows with given columns.
         """
@@ -299,31 +300,30 @@
         """
         Get all addressbookobject resource IDs in this address book
         """
-        # TODO: cache in attr
-        # TODO: optimize
+        # TODO: see if result can be cached in attr
 
-        allMemberIDs = set() if self.owned() else set([self._resourceID, ])
+        objectIDs = set() if self.owned() else set([self._resourceID, ])
         examinedIDs = set()
         remainingIDs = set([self._resourceID, ])
         while remainingIDs:
             memberRows = yield self._memberIDsWithGroupIDsQuery(remainingIDs).on(self._txn, groupIDs=remainingIDs)
-            allMemberIDs |= set([memberRow[0] for memberRow in memberRows])
+            objectIDs |= set([memberRow[0] for memberRow in memberRows])
             examinedIDs |= remainingIDs
-            remainingIDs = allMemberIDs - examinedIDs
+            remainingIDs = objectIDs - examinedIDs
 
-        returnValue(tuple(allMemberIDs))
+        returnValue(tuple(objectIDs))
 
 
     @inlineCallbacks
     def listObjectResources(self):
         if self._objectNames is None:
             abo = schema.ADDRESSBOOK_OBJECT
-            memberIDs = yield self._allAddressBookObjectIDs()
-            rows = (yield self._columnsWithResourceIDsQuery(
+            objectIDs = yield self._allAddressBookObjectIDs()
+            rows = (yield self._abObjectColumnsWithResourceIDsQuery(
                     [abo.RESOURCE_NAME],
-                    memberIDs).on(
-                        self._txn, resourceIDs=memberIDs)
-                    ) if memberIDs else []
+                    objectIDs).on(
+                        self._txn, resourceIDs=objectIDs)
+                    ) if objectIDs else []
             self._objectNames = sorted([row[0] for row in rows])
 
         returnValue(self._objectNames)
@@ -363,6 +363,14 @@
         return self._kind
 
 
+    @classmethod
+    def _deleteMembersWithMemberIDAndGroupIDsQuery(cls, memberID, groupIDs): #@NoSelf
+        aboMembers = schema.ABO_MEMBERS
+        return Delete(
+            aboMembers,
+            Where=(aboMembers.MEMBER_ID == memberID).And(
+                    aboMembers.GROUP_ID.In(Parameter("groupIDs", len(groupIDs)))))
+
     @inlineCallbacks
     def remove(self):
 
@@ -388,25 +396,14 @@
             # convert delete in sharee shared group address book to remove of memberships
             # that make this object visible to the sharee
 
-            # FIX ME: Combine into one query
-            memberIDs = yield self._addressbook._allAddressBookObjectIDs()
+            ownerAddressBook = yield self.ownerAddressBook()
+            objectIDs = yield ownerAddressBook._allAddressBookObjectIDs()
+            assert self._ownerAddressBookResourceID not in objectIDs
 
-            groupIDRows = yield Select(
-                [aboMembers.GROUP_ID],
-                From=aboMembers,
-                Where=(aboMembers.MEMBER_ID == self._resourceID).And(
-                        aboMembers.GROUP_ID != self._ownerAddressBookResourceID),
-            ).on(self._txn)
-            groupIDs = [groupIDRow[0] for groupIDRow in groupIDRows]
+            if objectIDs:
+                yield self._deleteMembersWithMemberIDAndGroupIDsQuery(self._resourceID, objectIDs).on(
+                    self._txn, groupIDs=objectIDs)
 
-            for groupID in set(groupIDs) & set(memberIDs):
-                yield Delete(
-                    aboMembers,
-                    Where=(aboMembers.MEMBER_ID == self._resourceID).And(
-                            aboMembers.GROUP_ID == groupID),
-                ).on(self._txn)
-
-            ownerAddressBook = yield self.ownerAddressBook()
             yield self._changeAddressBookRevision(ownerAddressBook)
 
         else:
@@ -475,18 +472,18 @@
         @return: L{self} if object exists in the DB, else C{None}
         """
 
-        memberIDs = yield self._addressbook._allAddressBookObjectIDs()
+        objectIDs = yield self._addressbook._allAddressBookObjectIDs()
         if self._name:
-            rows = (yield self._allWithResourceIDAndName(memberIDs).on(
+            rows = (yield self._allWithResourceIDAndName(objectIDs).on(
                 self._txn, name=self._name,
-                resourceIDs=memberIDs,)) if memberIDs else []
+                resourceIDs=objectIDs,)) if objectIDs else []
         elif self._uid:
-            rows = (yield self._allWithResourceIDAndUID(memberIDs).on(
+            rows = (yield self._allWithResourceIDAndUID(objectIDs).on(
                 self._txn, uid=self._uid,
-                resourceIDs=memberIDs,)) if memberIDs else []
+                resourceIDs=objectIDs,)) if objectIDs else []
         elif self._resourceID:
             rows = (yield self._allWithResourceID.on(
-                self._txn, resourceID=self._resourceID,)) if (self._resourceID in memberIDs) else []
+                self._txn, resourceID=self._resourceID,)) if (self._resourceID in objectIDs) else []
 
         if rows:
             self._initFromRow(tuple(rows[0]))
@@ -534,9 +531,9 @@
     @classmethod
     @inlineCallbacks
     def _allColumnsWithParent(cls, parent): #@NoSelf
-        memberIDs = yield parent._allAddressBookObjectIDs()
-        rows = (yield cls._columnsWithResourceIDsQuery(cls._allColumns, memberIDs).on(
-            parent._txn, resourceIDs=memberIDs)) if memberIDs else []
+        objectIDs = yield parent._allAddressBookObjectIDs()
+        rows = (yield cls._abObjectColumnsWithResourceIDsQuery(cls._allColumns, objectIDs).on(
+            parent._txn, resourceIDs=objectIDs)) if objectIDs else []
         returnValue(rows)
 
 
@@ -551,9 +548,9 @@
     @classmethod
     @inlineCallbacks
     def _allColumnsWithParentAndNames(cls, parent, names): #@NoSelf
-        memberIDs = yield parent._allAddressBookObjectIDs()
-        rows = (yield cls._allColumnsWithResourceIDsAndNamesQuery(memberIDs, names).on(
-            parent._txn, resourceIDs=memberIDs, names=names)) if memberIDs else []
+        objectIDs = yield parent._allAddressBookObjectIDs()
+        rows = (yield cls._allColumnsWithResourceIDsAndNamesQuery(objectIDs, names).on(
+            parent._txn, resourceIDs=objectIDs, names=names)) if objectIDs else []
         returnValue(rows)
 
 
@@ -635,9 +632,27 @@
                       )
 
 
+    @classmethod
+    def _deleteMembersWithGroupIDAndMemberIDsQuery(cls, groupID, memberIDs): #@NoSelf
+        aboMembers = schema.ABO_MEMBERS
+        return Delete(
+            aboMembers,
+            Where=(aboMembers.GROUP_ID == groupID).And(
+                    aboMembers.MEMBER_ID.In(Parameter("memberIDs", len(memberIDs)))))
+
+
+    @classmethod
+    def _deleteForeignMembersWithGroupIDAndMembeAddrsQuery(cls, groupID, memberAddrs): #@NoSelf
+        aboForeignMembers = schema.ABO_FOREIGN_MEMBERS
+        return Delete(
+            aboForeignMembers,
+            Where=(aboForeignMembers.GROUP_ID == groupID).And(
+                    aboForeignMembers.MEMBER_ADDRESS.In(Parameter("memberAddrs", len(memberAddrs)))))
+
+
     @inlineCallbacks
     def updateDatabase(self, component, expand_until=None, reCreate=False,
-                       inserting=False, removingObject=None):
+                       inserting=False):
         """
         Update the database tables for the new data being written.
 
@@ -778,17 +793,10 @@
             memberIDsToDelete = set(currentMemberIDs) - set(memberIDs)
             memberIDsToAdd = set(memberIDs) - set(currentMemberIDs)
 
-            #correct for object that is about to be removed
-            if removingObject:
-                memberIDsToDelete |= set([removingObject._resourceID])
+            if memberIDsToDelete:
+                yield self._deleteMembersWithGroupIDAndMemberIDsQuery(self._resourceID, memberIDsToDelete).on(
+                    self._txn, memberIDs=memberIDsToDelete)
 
-            for memberIDToDelete in memberIDsToDelete:
-                yield Delete(
-                    aboMembers,
-                    Where=((aboMembers.GROUP_ID == self._resourceID).And(
-                            aboMembers.MEMBER_ID == memberIDToDelete))
-                ).on(self._txn)
-
             for memberIDToAdd in memberIDsToAdd:
                 yield Insert(
                     {aboMembers.GROUP_ID: self._resourceID,
@@ -808,17 +816,10 @@
                 foreignMemberAddrsToDelete = set(currentForeignMemberAddrs) - set(foreignMemberAddrs)
                 foreignMemberAddrsToAdd = set(foreignMemberAddrs) - set(currentForeignMemberAddrs)
 
-                for foreignMemberAddrToDelete in foreignMemberAddrsToDelete:
-                    yield Delete(
-                        aboForeignMembers,
-                        Where=((aboForeignMembers.GROUP_ID == self._resourceID).And(
-                                aboForeignMembers.MEMBER_ADDRESS == foreignMemberAddrToDelete))
-                    ).on(self._txn)
+                if foreignMemberAddrsToDelete:
+                    yield self._deleteForeignMembersWithGroupIDAndMembeAddrsQuery(self._resourceID, foreignMemberAddrsToDelete).on(
+                        self._txn, memberAddrs=foreignMemberAddrsToDelete)
 
-                #correct for object that is about to be removed
-                if removingObject:
-                    foreignMemberAddrsToAdd |= set(["urn:uuid:" + removingObject.uid()])
-
                 for foreignMemberAddrToAdd in foreignMemberAddrsToAdd:
                     yield Insert(
                         {aboForeignMembers.GROUP_ID: self._resourceID,
@@ -869,7 +870,7 @@
 
             # then get member UIDs
             abo = schema.ADDRESSBOOK_OBJECT
-            memberUIDRows = (yield self._columnsWithResourceIDsQuery(
+            memberUIDRows = (yield self._abObjectColumnsWithResourceIDsQuery(
                              [abo.VCARD_UID],
                              memberIDs).on(
                                 self._txn, resourceIDs=memberIDs)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121202/14144c87/attachment-0001.html>


More information about the calendarserver-changes mailing list