From 19cb9c88093707bae469c88f150813ce3da7f95d Mon Sep 17 00:00:00 2001 From: Wim Velzeboer Date: Mon, 23 Aug 2021 12:06:21 +0100 Subject: [PATCH] Fix bug in formula criteria --- .../classes/criteria/fflib_Criteria.cls | 24 ++++++++++++++----- .../classes/criteria/fflib_CriteriaTest.cls | 16 +++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/sfdx-source/apex-extensions/main/default/classes/criteria/fflib_Criteria.cls b/sfdx-source/apex-extensions/main/default/classes/criteria/fflib_Criteria.cls index e1fd0e5..f8ac32d 100644 --- a/sfdx-source/apex-extensions/main/default/classes/criteria/fflib_Criteria.cls +++ b/sfdx-source/apex-extensions/main/default/classes/criteria/fflib_Criteria.cls @@ -45,8 +45,6 @@ public virtual with sharing class fflib_Criteria private String type; private IFormulaEvaluator formulaEvaluator; - - /** * populate private variables with default settings. */ @@ -173,6 +171,7 @@ public virtual with sharing class fflib_Criteria return this; } + private interface IFormulaEvaluator { Boolean evaluate(Object record, Map evaluatedResultByNumber); @@ -384,12 +383,25 @@ public virtual with sharing class fflib_Criteria private Boolean evaluateFormula(Object record) { - Map evaluatedResultByNumber = new Map(); - for (Integer i = 0; i < evaluators.size(); i++) + try { - evaluatedResultByNumber.put(i, evaluators.get(i).evaluate(record)); + Map evaluatedResultByNumber = new Map(); + for (Integer i = 0; i < evaluators.size(); i++) + { + evaluatedResultByNumber.put(i, evaluators.get(i).evaluate(record)); + } + return formulaEvaluator.evaluate(record, evaluatedResultByNumber); + } + catch (Exception e) + { + // If an error occurs during the validation, + // just return a null value and send a warning message to the debug log; + System.debug( + System.LoggingLevel.WARN, + 'Criteria condition failure with error: ' + e.getMessage() + '\n' + e.getStackTraceString() + ); + return null; } - return formulaEvaluator.evaluate(record, evaluatedResultByNumber); } /** diff --git a/sfdx-source/apex-extensions/tests/classes/criteria/fflib_CriteriaTest.cls b/sfdx-source/apex-extensions/tests/classes/criteria/fflib_CriteriaTest.cls index 7a89e10..69a9ebb 100644 --- a/sfdx-source/apex-extensions/tests/classes/criteria/fflib_CriteriaTest.cls +++ b/sfdx-source/apex-extensions/tests/classes/criteria/fflib_CriteriaTest.cls @@ -615,4 +615,20 @@ private with sharing class fflib_CriteriaTest .evaluate(new Contact(LastName = 'Smith')) ); } + + @IsTest + static void itShouldEvaluateFormula_ReturnNullOnErrorInFormula() + { + SObject record = fflib_MockSObjectUtil.addRelatedParentObject( + new Contact(LastName = 'Smith'), + new Account(Id = fflib_IDGenerator.generate(Account.SObjectType), Industry = 'Energy'), + 'Account'); + + System.assertEquals(null, + new fflib_Criteria() + .FormulaCriteria('1') + .equalTo('AccountTypo.Industry', 'Energy') + .evaluate(record) + ); + } } \ No newline at end of file