Skip to content

Performance fix for enterprise.retrieve #13

@GoogleCodeExporter

Description

@GoogleCodeExporter
What steps will reproduce the problem?
1. Do a retrieve of 113 records by Id list.
2. It takes 2 minutes.
3. It took 113 API calls.

What is the expected output? What do you see instead?
The expected output is correct, but slow and expensive.
The attached code appears to product the same results, uses more memory,
but faster and less expensively. 

   def retrieve(
        self,
        fieldList,
        sObjectType,
        ids,
        ):
        '''
    Currently, this uses query() to emulate the retrieve() functionality, as suds' unmarshaller
    borks on the sf: prefix that Salesforce prepends to all fields other than Id and type (any
    fields not defined in the 'sObject' section of the Enterprise WSDL). This code used to
    do a single API query for each Id. This was both slow and expensive.
    '''
        if len(ids) == 0:
            return []
        idsin = ["'%s'" % id for id in ids]
        idsin = ",".join(idsin)
        idsin = "(%s)" % idsin
        sObjects = []
        queryString = 'SELECT Id, ' + fieldList + ' FROM ' \
            + sObjectType + ' WHERE Id in %s ' % idsin
        queryResult = self.query(queryString)
        resultsById = {}
        for record in queryResult.records:
            if record:
                sObject = self.generateObject(sObjectType)
                for (k, v) in record:
                    setattr(sObject, k, v)
            resultsById[sObject.Id] = sObject
        for id in ids:
            sObject = resultsById.get(id, None)
            if sObject:
                sObjects.append(sObject)
            else:
                sObjects.append(None)


        return self._handleResultTyping(sObjects)


Original issue reported on code.google.com by [email protected] on 6 Jul 2011 at 2:48

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions