[CalendarServer-changes] [10682] CalendarServer/trunk/twext/who/xml.py

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 11 13:19:13 PST 2013


Revision: 10682
          http://trac.calendarserver.org//changeset/10682
Author:   wsanchez at apple.com
Date:     2013-02-11 13:19:13 -0800 (Mon, 11 Feb 2013)
Log Message:
-----------
Avoid looking up fieldName repeatedly in a loop within a loop.

Modified Paths:
--------------
    CalendarServer/trunk/twext/who/xml.py

Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py	2013-02-11 20:08:51 UTC (rev 10681)
+++ CalendarServer/trunk/twext/who/xml.py	2013-02-11 21:19:13 UTC (rev 10682)
@@ -403,20 +403,22 @@
         recordsByUID = dict(((record.uid, record) for record in records))
 
         #
-        # Find the record types and field names that our parser can
-        # map to.
+        # Index the record type -> attribute and field name -> element
+        # mappings.
         #
-        recordTypes = set()
+        recordTypes = {}
         for valueName in self.value.iterconstants():
             recordType = getattr(valueName, "recordType", None)
             if recordType is not None:
-                recordTypes.add(recordType)
+                recordTypes[recordType] = valueName.value
+        del valueName
 
-        fieldNames = set()
+        fieldNames = {}
         for elementName in self.element.iterconstants():
             fieldName = getattr(elementName, "fieldName", None)
             if fieldName is not None:
-                fieldNames.add(fieldName)
+                fieldNames[fieldName] = elementName.value
+        del elementName
 
         #
         # Walk through the record nodes in the XML tree
@@ -438,24 +440,24 @@
                 for (name, value) in record.fields.items():
                     if name == self.fieldName.recordType:
                         if value in recordTypes:
-                            recordNode.set(self.attribute.recordType.value, valueName.value)
+                            recordNode.set(self.attribute.recordType.value, recordTypes[value])
                         else:
                             raise AssertionError("Unknown record type: %r" % (value,))
+
                     else:
-                        # FIXME: This lookup of the field name element is a bit much to do in a loop
-                        for elementName in self.element.iterconstants():
-                            if getattr(elementName, "fieldName", None) == name:
-                                if self.fieldName.isMultiValue(name):
-                                    values = value
-                                else:
-                                    values = (value,)
+                        if name in fieldNames:
+                            tag = fieldNames[name]
 
-                                for value in values:
-                                    subNode = XMLElement(tag=elementName.value)
-                                    subNode.text = value
-                                    recordNode.append(subNode)
+                            if self.fieldName.isMultiValue(name):
+                                values = value
+                            else:
+                                values = (value,)
 
-                                break
+                            for value in values:
+                                subNode = XMLElement(tag)
+                                subNode.text = value
+                                recordNode.append(subNode)
+
                         else:
                             raise AssertionError("Unknown field name: %r" % (name,))
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130211/660c8f9a/attachment.html>


More information about the calendarserver-changes mailing list