[CalendarServer-changes] [13028] twext/trunk/twext/who/aggregate.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 28 12:34:47 PDT 2014


Revision: 13028
          http://trac.calendarserver.org//changeset/13028
Author:   wsanchez at apple.com
Date:     2014-03-28 12:34:47 -0700 (Fri, 28 Mar 2014)
Log Message:
-----------
Implement recordWith* methods.

Modified Paths:
--------------
    twext/trunk/twext/who/aggregate.py

Modified: twext/trunk/twext/who/aggregate.py
===================================================================
--- twext/trunk/twext/who/aggregate.py	2014-03-28 19:31:41 UTC (rev 13027)
+++ twext/trunk/twext/who/aggregate.py	2014-03-28 19:34:47 UTC (rev 13028)
@@ -79,10 +79,23 @@
         return self._recordType
 
 
-    def recordsFromExpression(self, expression, records=None):
+    @inlineCallbacks
+    def _oneFromSubServices(self, methodName, *args, **kwargs):
+        for service in self.services:
+            m = getattr(service, methodName)
+            record = yield m(*args, **kwargs)
+
+            if record is not None:
+                returnValue(record)
+
+        returnValue(None)
+
+
+    def _gatherFromSubServices(self, methodName, *args, **kwargs):
         ds = []
         for service in self.services:
-            d = service.recordsFromExpression(expression, records=records)
+            m = getattr(service, methodName)
+            d = m(*args, **kwargs)
             ds.append(d)
 
         def unwrapFirstError(f):
@@ -95,33 +108,57 @@
         return d
 
 
-    @inlineCallbacks
+    def recordsFromExpression(self, expression, records=None):
+        return self._gatherFromSubServices(
+            "recordsFromExpression", expression, records=None
+        )
+
+
+    # Implementation of recordWith*() methods may seem unnecessary here, since
+    # they eventually end up at recordsFromExpression() anyway (in our
+    # superclass).
+    # However, the wrapped services may have optimzed versions of these, so we
+    # want to call their implementations, not bypass them.
+
+
+    def recordsWithFieldValue(self, fieldName, value):
+        return self._gatherFromSubServices(
+            "recordsWithFieldValue", fieldName, value
+        )
+
+
     def recordWithUID(self, uid):
-        for service in self.services:
-            record = yield service.recordWithUID(uid)
-            if record is not None:
-                returnValue(record)
-        returnValue(None)
+        return self._oneFromSubServices("recordWithUID", uid)
 
 
-    def recordWithShortName(self, recordType, shortName):
+    def recordWithGUID(self, guid):
+        return self._oneFromSubServices("recordWithGUID", guid)
+
+
+    def recordsWithRecordType(self, recordType):
         # Since we know the recordType, we can go directly to the appropriate
         # service.
         for service in self.services:
             if recordType in service.recordTypes():
-                return service.recordWithShortName(recordType, shortName)
-        return succeed(None)
+                return service.recordsWithRecordType(recordType)
+        return succeed(())
 
 
-    def recordsWithRecordType(self, recordType):
+    def recordWithShortName(self, recordType, shortName):
         # Since we know the recordType, we can go directly to the appropriate
         # service.
         for service in self.services:
             if recordType in service.recordTypes():
-                return service.recordsWithRecordType(recordType)
-        return succeed(())
+                return service.recordWithShortName(recordType, shortName)
+        return succeed(None)
 
 
+    def recordsWithEmailAddress(self, emailAddress):
+        return self._gatherFromSubServices(
+            "recordsWithEmailAddress", emailAddress
+        )
+
+
     @inlineCallbacks
     def updateRecords(self, records, create=False):
         for record in records:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140328/1ceee205/attachment-0001.html>


More information about the calendarserver-changes mailing list