Add more insight into how the fflib_Criteria formula was evaluated
Signed-off-by: WimVelzeboer <wimvelzeboer@protonmail.com>
This commit is contained in:
Regular → Executable
+25
-2
@@ -166,11 +166,19 @@ public virtual with sharing class fflib_Criteria
|
||||
*/
|
||||
public virtual fflib_Criteria formulaCriteria(String formula)
|
||||
{
|
||||
this.type = 'FORMULA';
|
||||
this.type = fflib_Criteria.FORMULA;
|
||||
this.formulaEvaluator = new FormulaEvaluator(formula.toUpperCase());
|
||||
return this;
|
||||
}
|
||||
|
||||
public virtual String getEvaluatedFormula()
|
||||
{
|
||||
if (this.type != fflib_Criteria.FORMULA)
|
||||
throw new CriteriaException('Expected a Formula');
|
||||
|
||||
return ((FormulaEvaluator) this.formulaEvaluator).getEvaluatedFormula();
|
||||
}
|
||||
|
||||
|
||||
private interface IFormulaEvaluator
|
||||
{
|
||||
@@ -180,7 +188,8 @@ public virtual with sharing class fflib_Criteria
|
||||
|
||||
public class FormulaEvaluator implements IFormulaEvaluator
|
||||
{
|
||||
private String formula;
|
||||
final private String formula;
|
||||
private Map<Integer, Boolean> evaluatedResultByNumber;
|
||||
private String type
|
||||
{
|
||||
get;
|
||||
@@ -243,6 +252,7 @@ public virtual with sharing class fflib_Criteria
|
||||
|
||||
public Boolean evaluate(Object record, Map<Integer, Boolean> evaluatedResultByNumber)
|
||||
{
|
||||
this.evaluatedResultByNumber = evaluatedResultByNumber;
|
||||
Boolean result = !(this.type == 'OR');
|
||||
for (IFormulaEvaluator evaluator : formulaParts)
|
||||
{
|
||||
@@ -259,6 +269,19 @@ public virtual with sharing class fflib_Criteria
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getEvaluatedFormula()
|
||||
{
|
||||
String result = String.valueOf(this.formula);
|
||||
for (Integer i : this.evaluatedResultByNumber.keySet())
|
||||
{
|
||||
result = result.replace(
|
||||
String.valueOf(i+1),
|
||||
String.valueOf(evaluatedResultByNumber.get(i)).toUpperCase()
|
||||
);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toSOQL(Map<Integer, String> queryByNumber)
|
||||
{
|
||||
String result = '';
|
||||
|
||||
Regular → Executable
+7
-8
@@ -581,14 +581,13 @@ private with sharing class fflib_CriteriaTest
|
||||
);
|
||||
|
||||
// WHEN we process a formula criteria it should evaluate the formula
|
||||
System.assert(
|
||||
new fflib_Criteria()
|
||||
.FormulaCriteria('(1 AND 2) OR (1 AND 3)')
|
||||
.equalTo(Contact.LastName, 'Smith')
|
||||
.equalTo(Contact.FirstName, 'John')
|
||||
.equalTo(Contact.Department, 'MIB')
|
||||
.evaluate(record)
|
||||
);
|
||||
fflib_Criteria result = new fflib_Criteria()
|
||||
.FormulaCriteria('(1 AND 2) OR (1 AND 3)')
|
||||
.equalTo(Contact.LastName, 'Smith')
|
||||
.equalTo(Contact.FirstName, 'John')
|
||||
.equalTo(Contact.Department, 'MIB');
|
||||
System.assert(result.evaluate(record));
|
||||
System.assertEquals('(TRUE AND TRUE) OR (TRUE AND FALSE)', result.getEvaluatedFormula(), 'Incorrect formula returned');
|
||||
System.assertEquals(false,
|
||||
new fflib_Criteria()
|
||||
.FormulaCriteria('(1 AND 2) OR (1 AND 3)')
|
||||
|
||||
Reference in New Issue
Block a user