126 lines
3.5 KiB
Plaintext
126 lines
3.5 KiB
Plaintext
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)
|
|
|
|
include::message.adoc[]
|
|
|
|
include::highlighting.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|