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);