== Why is this an issue?

In order to protect shared resources, Salesforce enforces a maximum number of SOQL queries which can be executed inside a single transaction. This is part of Governor limits.


Limiting the number of queries executed is necessary, and SOQL queries which have no chance of returning a result should be avoided. This is why SOQL Query of the form ``++SELECT ... FROM ... WHERE ... in :filterValues++`` should first check that the Set/Map (in this example named "filterValues") is not empty.


This rule raises an issue when such an SOQL query is not enclosed in one of

* ``++if (!filtervalues.isEmpty())++``
* ``++if (!filtervalues.size() != 0)++``
* ``++if (!filtervalues.size() > 0)++``


=== Noncompliant code example

[source,apex]
----
public class fooClass{
        Set<Id> setCasesId = new Set();

        //Noncompliant - SOQL Query executed without checking whether the Set is Empty
        for(Case c :[SELECT Id FROM Case WHERE Id IN :setCasesId]){
              //something
        }
}


public class fooClass{
        Map<Id, String> mapCasesId = new Map();

        //Noncompliant - SOQL Query executed without checking whether the Map is Empty
        for(Case c :[SELECT Id FROM Case WHERE Id IN :mapCasesId.keyset()]){
              // ...
        }
}

public class fooClass{
        Map<Id, String> mapCasesId = new Map();

        //Noncompliant - SOQL Query executed without checking whether the Map is Empty or Set is Empty
        for(Case c :[SELECT Id, Subject FROM Case WHERE Id IN :mapCasesId.keyset() OR  Id IN :setCasesId]){
              // ...
        }
}


public class fooClass{
        Map<Id, String> mapCasesId = new Map();

        //Noncompliant - SOQL Query executed without checking whether the Map is Empty and Set is Empty
        for(Case c :[SELECT Id, Subject FROM Case WHERE Id IN :mapCasesId.keyset() AND  Id IN :setCasesId]){
              // ...
        }
}
----


=== Compliant solution

[source,apex]
----
public class fooClass{
        Set<Id> setCasesId = new Set();
        if(!setCasesId.isEmpty()){
          for(Case c :[SELECT Id FROM Case WHERE Id IN :setCasesId]){
                //something
          }
       }
       // OR
       if(!setCasesId.size() > 0){
          for(Case c :[SELECT Id FROM Case WHERE Id IN :setCasesId]){
                //something
          }
       }
       // OR
       if(!setCasesId.size() != 0){
          for(Case c :[SELECT Id FROM Case WHERE Id IN :setCasesId]){
                //something
          }
       }
}


public class fooClass{
        Set<Id> setCasesId = new Set();    
        if(!mapCasesId.isEmpty()){
          for(Case c :[SELECT Id FROM Case WHERE Id IN :mapCasesId.keyset()]){
                //something
          }
       }
}


public class fooClass{
        Map<Id, String> mapCasesId = new Map();
        if((!setCasesId.isEmpty()) || (!mapCasesId.isEmpty())){
        for(Case c :[SELECT Id, Subject FROM Case WHERE Id IN :mapCasesId.keyset() OR  Id IN :setCasesId]){
              //something
        }
    }
}


public class fooClass{
        Map<Id, String> mapCasesId = new Map();
        //Recommended - SOQL Query executed after checking that the Map is Not Empty or Set is Not Empty
        if((!setCasesId.isEmpty()) && (!mapCasesId.isEmpty())){
        for(Case c :[SELECT Id, Subject FROM Case WHERE Id IN :mapCasesId.keyset()  AND  Id IN :setCasesId]){
              //something
        }
    }
}
----

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Check that the Set or Map is not empty before executing this query.


=== Highlighting

The SOQL query


endif::env-github,rspecator-view[]
