SalesforceBlue

Feel the rhythm of Salesforce

Apex

Batch Apex Implementation Using Iterables

We use Iterables when you want to iterate over sObject rows rather than using Database.queryLocator in the Batch Apex.

You may require this if you need some more processing and need custom record batches for your batch execute method.

Below we discuss how to implement the Iterator and Iterable interfaces to use in Batch Apex.

Implement the Iterator Interface:

Using the Iterator interface you can create a custom set of instructions for traversing a List through a loop.

This is useful for data that exists in sources outside of Salesforce that you would normally define the scope of using a SELECT statement.

Iterators can also be used if you have multiple SELECT statements.

global class CustomIterable implements Iterator<Account>{ 

   List<Account> accs {get; set;} 
   Integer i {get; set;} 

   public CustomIterable(){ 
       accs = 
       [SELECT Id, Name, 
       NumberOfEmployees 
       FROM Account 
       WHERE Name = 'false']; 
       i = 0; 
   }   

   global boolean hasNext(){ 
       if(i >= accs.size()) {
           return false; 
       } else {
           return true; 
       }
   }    

   global Account next(){ 
       // 8 is an arbitrary 
       // constant in this example
       // that represents the 
       // maximum size of the list.
       if(i == 8){return null;} 
       i++; 
       return accs[i-1]; 
   } 
}

To use custom iterators, you must create an Apex class that implements the Iterator interface.

hasNext() method returns true if there is another item in the collection being traversed, false otherwise.

next() method returns the next item in the collection.

All methods in the Iterator interface must be declared as global or public.

Implementing the Iterable Interface:
global class foo implements iterable<Account>{
   global Iterator<Account> Iterator(){
      return new CustomIterable();
   }
}

The iterator method must be declared as global or public. It creates a reference to the iterator that you can then use to traverse the data structure.

In the above class, we are calling the CustomIterable class which was created before.

Using Iterable In Batch Apex:
global class batchClass implements Database.batchable<Account>{ 
   global Iterable<Account> start(Database.batchableContext info){ 
       return new foo(); 
   }     
   global void execute(Database.batchableContext info, List<Account> scope){ 
       List<Account> accsToUpdate = new List<Account>(); 
       for(Account a : scope){ 
           a.Name = 'UPDATED'; 
           a.NumberOfEmployees = 79; 
           accsToUpdate.add(a); 
       } 
       update accsToUpdate; 
   }     
   global void finish(Database.batchableContext info){     
   } 
}

The above class is a batch class that uses a custom iterator.

Please note that If you use an iterable, the governor limit for the total number of records retrieved by SOQL queries is still enforced.

Thank you for visiting SalesforceBlue.com
If you have any queries feel free to write down a comment below 🙂


Leave a Reply

Your email address will not be published. Required fields are marked *