From 09f0c2ef0df5cb14693eea078c94c360c627f70e Mon Sep 17 00:00:00 2001 From: William Velzeboer <6429417+wimvelzeboer@users.noreply.github.com> Date: Thu, 22 Jan 2026 11:47:51 +0000 Subject: [PATCH] Add overloads for decimal values in getRecords and getRecordsNotIn (#77) * Add overloads for decimal values in getRecords and getRecordsNotIn * updated readme file * Add compatibility for multiselect picklists for the `getRecords` method --- README.md | 9 ++- .../classes/domains/fflib_SObjects2.cls | 75 +++++++++++++++++++ .../classes/domains/fflib_SObjects2Test.cls | 2 + 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1f13251..8432945 100644 --- a/README.md +++ b/README.md @@ -49,16 +49,19 @@ You can also have a look at the open items in the [project(s)](./projects), feel # Change Log Some of the changes that have major impact are listed here; -### Updates 2026 +### Updates January 2026 - **fflib_ArrayUtils**
+ _replaceKey_,
Add method to replace the key of a given map.
_replaceValue_,
Add three method overloads for merging a source map of idById and replacement map of idByString, idByDecimal or idByBoolean.
- _mergeMaps_,
Add method overload to merge two maps of idByBoolean, + _mergeMaps_,
Add method overload to merge two maps of idByBoolean

- **fflib_SObjects2**
The following methods have been added to the SObjects2 class:
_getBooleanFieldByIdField_
_getParentBooleanFieldById_
_getParentDecimalFieldById_
- _getParentStringFieldById_
+ _getParentStringFieldById_

+ Add new method overloads for Decimal values to `getRecords`, `getRecordsNotIn` and `getRecordsIsNot`

+ Add compatibility for multiselect picklists for the `getRecords` method, by adding a new method overload: `getRecords(Schema.SObjectField sObjectField, Set values, Boolean containsAll)`, and a multi-select picklist check in the method `getRecords(Schema.SObjectField sObjectField, String value)`

- **API Upgrades** Upgraded to API 65.0 diff --git a/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls b/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls index 619a560..77348ed 100644 --- a/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls +++ b/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls @@ -996,6 +996,9 @@ public virtual class fflib_SObjects2 @TestVisible protected virtual List getRecords(Schema.SObjectField sObjectField, String value) { + if (sObjectField.getDescribe().getType() == DisplayType.MULTIPICKLIST) + return getRecords(sObjectField, new Set{value}, true); + return getRecords(sObjectField, new Set{ value }); } @@ -1013,6 +1016,47 @@ public virtual class fflib_SObjects2 return result; } + /** + * Gets the records from the domain matching values in the given multi-select picklist field + * + * @param sObjectField The SObjectType of the multi-select picklist + * @param values The values to filter by + * @param containsAll If TRUE the returned records have all the given values, otherwise a record with just one value is also returned + * + * @return Returns a list of matching SObjects + */ + @TestVisible + protected virtual List getRecords(Schema.SObjectField sObjectField, Set values, Boolean containsAll) + { + if (sObjectField.getDescribe().getType() != DisplayType.MULTIPICKLIST) return getRecords(sObjectField, values); + + List result = new List(); + for (SObject record : getRecords()) + { + String value = (String) record.get(sObjectField); + + if ((value == null && (values == null || values.isEmpty() || values.contains(null))) // if values is empty and the field is empty = match! + || (value != null && containsAll && new Set(value.split(';')).containsAll(values)) + ) + { + result.add(record); + } + else if (value != null && containsAll == false) + { + Set fieldValues = new Set(value.split(';')); + for (String fieldValue : fieldValues) + { + if (values.contains(fieldValue)) + { + result.add(record); + break; + } + } + } + } + return result; + } + /** * Returns a list of records where the given field contains the provided value (String.contains) * @@ -1056,6 +1100,24 @@ public virtual class fflib_SObjects2 return result; } + @TestVisible + protected virtual List getRecordsIsNot(Schema.SObjectField sObjectField, Decimal value) + { + return getRecordsNotIn(sObjectField, new Set{ value }); + } + + @TestVisible + protected virtual List getRecordsNotIn(Schema.SObjectField sObjectField, Set values) + { + List result = new List(); + for (SObject record : getRecords()) + { + if (values?.contains((Decimal) record.get(sObjectField))) continue; + result.add(record); + } + return result; + } + @TestVisible protected virtual List getRecordsIsNot(Schema.SObjectField sObjectField, Id idValue) { @@ -1090,6 +1152,19 @@ public virtual class fflib_SObjects2 return result; } + @TestVisible + protected virtual List getRecords(Schema.SObjectField sObjectField, Decimal value) + { + List result = new List(); + for (SObject record : getRecords()) + { + if ((Decimal) record.get(sObjectField) != value) continue; + + result.add(record); + } + return result; + } + /** * Get Parent Domain SObjectType to SObjectField.relationship field on this domain SObjectType * diff --git a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls index f78a311..bea4072 100644 --- a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls +++ b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls @@ -124,7 +124,9 @@ private class fflib_SObjects2Test domain.getIdFieldValues(Account.Id, criteria); domain.getRecords(Account.Id, domain.getFirstSObject().Id); domain.getRecords(Account.Name, 'A'); + domain.getRecords(Account.AnnualRevenue, 1.0); domain.getRecordsIsNot(Account.Name, 'A'); + domain.getRecordsIsNot(Account.AnnualRevenue, 1.0); domain.getRecordsIsNot(Account.Id, domain.getFirstSObject().Id); domain.getSObjectByIdField(Account.Id); domain.getIdFieldValues(Account.Id, true);