Unfortunately alot of companies use Leads and Contacts interchangeably. Here is a small Apex class that performs a SOSL search across Contacts and Leads by email address. The method then wraps each Contact and Lead as a generic Person object and returns them to the caller as a List.
public class PersonService {
public class Person {
String id ;
String firstName ;
String lastName ;
String company ;
String email ;
String phone ;
String sObjectType ;
}
public static List searchByEmail ( String email ) {
// list of Person objects to return
List people = new List ();
// issue the sosl search
List < list > searchResults = [ FIND : email IN EMAIL FIELDS RETURNING
Contact ( Id , Account . Name , Email , Phone , FirstName , LastName ),
Lead ( Id , Company , FirstName , LastName , Email , Phone )];
// cast the results by sObjec type
List contacts = (( List ) searchResults [ 0 ]);
List leads = (( List ) searchResults [ 1 ]);
// a each contact found as a Person
for ( Integer i = 0 ; i < contacts . size (); i ++ ) {
Person p = new Person ();
p . id = contacts [ i ]. Id ;
p . firstName = contacts [ i ]. FirstName ;
p . lastName = contacts [ i ]. LastName ;
p . company = contacts [ i ]. Account . Name ;
p . email = contacts [ i ]. Email ;
p . phone = contacts [ i ]. Phone ;
p . sObjectType = ' Contact ' ;
people . add ( p );
}
// a each lead found as a Person
for ( Integer i = 0 ; i < leads . size (); i ++ ) {
Person p = new Person ();
p . id = leads [ i ]. Id ;
p . firstName = leads [ i ]. FirstName ;
p . lastName = leads [ i ]. LastName ;
p . company = leads [ i ]. Company ;
p . email = leads [ i ]. Email ;
p . phone = leads [ i ]. Phone ;
p . sObjectType = ' Lead ' ;
people . add ( p );
}
System . debug ( ' Returning people: ' + people );
return people ;
}
}