I have created an app that would change CampaignMemeber Status Values by calling our web application api and storing info in custom objects. In my developer org where the package is created works fine but on our clients sandbox they get the error
System.QueryException: Non-selective query against large object type (more than 200000 rows).
I know the reason that they get is because the query is not selective or that they have a lot of record. The error is occurring in a trigger. Below i have my trigger. Could anyone suggest a way to make my query more selective(i know about indexed field and tire that already) or any other way around the issue?
trigger SynchronizeTrigger on Attendee__c (after update, after insert) {
Map<String,String> matchedRegistration = new Map<String,String>();
Map<String,String> matchedCheckin = new Map<String,String>();
Set<String> matchedEmails = new Set<String>();
Map<String,String> matchedSurnames = new Map<String,String>();
CampaignMember[] cmList = new CampaignMember[]{};
List<Fail__c> flist = new List<Fail__c>();
Public Authentication__c auth = new Authentication__c();
auth = [SELECT Authentication_Campaign__c FROM Authentication__c LIMIT 1];
public Integer attendeesAttended = 0;
public Integer attendeesDidNotShow = 0;
public Integer attendeesAccepted= 0;
public Integer attendeesCancelled = 0;
public Integer attendeesfailed = 0;
for(Attendee__c a : Trigger.new){
matchedRegistration.put(a.Attendee_Email_Address__c,a.Attendee_Registration__c);
matchedCheckin.put(a.Attendee_Email_Address__c,a.Attendee_Checkin__c);
matchedEmails.add(a.Attendee_Email_Address__c);
}
for(List<CampaignMember> cms : [SELECT Id,Campaign.Id, Contact.Email,Status
FROM CampaignMember
WHERE Campaign.Id =: auth.Authentication_Campaign__c AND Contact.Email IN: matchedEmails]){
for(CampaignMember cm : cms){
if(matchedRegistration.get(cm.Contact.Email)=='1' && matchedCheckin.get(cm.Contact.Email)=='1'){
cm.Status = 'Attended';
cmList.add(cm);
attendeesAttended++;
}else if(matchedRegistration.get(cm.Contact.Email)=='1' && matchedCheckin.get(cm.Contact.Email)=='0'){
cm.Status = 'Did Not Show';
cmList.add(cm);
attendeesDidNotShow ++;
}else if(matchedRegistration.get(cm.Contact.Email) =='1' && String.isEmpty(matchedCheckin.get(cm.Contact.Email))){
cm.Status = 'Accepted';
cmList.add(cm);
attendeesAccepted ++;
}else if(matchedRegistration.get(cm.Contact.Email)=='0'){
cm.Status = 'Cancelled';
cmList.add(cm);
attendeesCancelled ++;
}
update cmList;
}
}
for(List<CampaignMember> cms : [SELECT Id,Campaign.Id,FirstName,LastName,Contact.Email
FROM CampaignMember
WHERE Campaign.Id =: auth.Authentication_Campaign__c AND Contact.Email NOT IN: matchedEmails]){
for(CampaignMember cm : cms){
fList.add(new Fail__c(Fail_Firstname__c = cm.FirstName, Fail_Surname__c = cm.LastName, Fail_Email__c = cm.Contact.Email,Fail_Campaign_Name__c = cm.Campaign.Name ,Fail_Campaign__c = auth.Authentication_Campaign__c));
attendeesfailed ++;
upsert fList Fail_Email__c;
}
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Attended: ' + attendeesAttended + ' Delegate(s)' + ', ' + 'Did Not Show: ' + attendeesDidNotShow + ' Delegate(s)'+ ', ' + 'Accepted: ' + attendeesAccepted + ' Delegate(s)' + ', ' + 'Cancelled: ' + attendeesCancelled + ' Delegate(s)'));
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error, 'Failed Syncs: ' + attendeesfailed + ' Delegate(s)'));
}
Thanks