Add more insight into how the fflib_Criteria formula was evaluated

Signed-off-by: WimVelzeboer <wimvelzeboer@protonmail.com>
This commit is contained in:
WimVelzeboer
2021-11-22 21:00:11 +00:00
parent 1f45c8d4c2
commit 0d8e29d00b
2 changed files with 32 additions and 10 deletions
+25 -2
View File
@@ -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 = '';
+7 -8
View File
@@ -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)')