From d139917d690ee751f8b0328b700b94d432ec9b1f Mon Sep 17 00:00:00 2001 From: WimVelzeboer Date: Wed, 16 Mar 2022 09:47:30 +0000 Subject: [PATCH 1/2] Add getAllValues to fflib_ArrayUtils Signed-off-by: WimVelzeboer --- .../classes/utils/fflib_ArrayUtils.cls | 20 ++++++++++++++++++ .../classes/utils/fflib_ArrayUtilsTest.cls | 21 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls index 90b05d7..dff2c07 100644 --- a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls +++ b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls @@ -73,6 +73,26 @@ public class fflib_ArrayUtils return objects.get(0); } + /** + * Gets all String values for the given Ids + * + * @param stringsByIds the data map to process + * @param idsToRetrieve The keys for which to retrieve their string values + * + * @return Returns all the values for the provided keys + */ + public static Set getAllValues(Map stringsByIds, Set idsToRetrieve) + { + Set result = new Set(); + for (Id id : idsToRetrieve) + { + if (stringsByIds.containsKey(id) == false) continue; + + result.add(stringsByIds.get(id)); + } + return result; + } + /** * Validates if a list is empty * diff --git a/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls b/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls index c240706..6281736 100644 --- a/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls +++ b/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls @@ -238,6 +238,27 @@ private class fflib_ArrayUtilsTest System.assertEquals(8, result, 'Did not return the last value in the list of objects'); } + @IsTest + static void itShouldReturnAllValuesForTheGivenIds() + { + // GIVEN a map with String by Ids + Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); + Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); + Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); + Map stringsByIds = new Map + { + accountIdA => 'Account A', + accountIdB => 'Account B', + accountIdC => 'Account C' + }; + + // WHEN we retrieve a sub-set of Ids + Set result = fflib_ArrayUtils.getAllValues(stringsByIds, new Set {accountIdA, accountIdB}); + + // THEN we get the values of the provide sub-set Ids + System.assert(result.containsAll(new Set{'Account A', 'Account B'})); + } + private static List generateDateTimes() { return new List From 3335482e8f292b26d45ddf7b5816da97b6382d87 Mon Sep 17 00:00:00 2001 From: WimVelzeboer Date: Wed, 16 Mar 2022 10:06:58 +0000 Subject: [PATCH 2/2] Add mergeMap to fflib_ArrayUtils Signed-off-by: WimVelzeboer --- .../classes/utils/fflib_ArrayUtils.cls | 25 ++++++++++++ .../classes/utils/fflib_ArrayUtilsTest.cls | 40 ++++++++++++++++--- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls index dff2c07..ea2c8c2 100644 --- a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls +++ b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_ArrayUtils.cls @@ -205,6 +205,31 @@ public class fflib_ArrayUtils return lastValue(cloneAndSort(input)); } + /** + * Merge the given two maps, without modifying the source. + * + * @param mapA Map> + * @param mapB Map> + * + * @return Returns the merged map + */ + public static Map> mergeMaps(Map> mapA, Map> mapB) + { + Map> result = mapA.clone(); + for (Id idValue : mapB.keySet()) + { + if (result.containsKey(idValue)) + { + result.get(idValue).addAll(mapB.get(idValue)); + } + else + { + result.put(idValue, mapB.get(idValue)); + } + } + return result; + } + /** * Sorts the list with Datetime values and return the oldest value in the list * diff --git a/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls b/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls index 6281736..cce7ced 100644 --- a/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls +++ b/sfdx-source/apex-extensions/tests/classes/utils/fflib_ArrayUtilsTest.cls @@ -242,10 +242,10 @@ private class fflib_ArrayUtilsTest static void itShouldReturnAllValuesForTheGivenIds() { // GIVEN a map with String by Ids - Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); - Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); - Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); - Map stringsByIds = new Map + final Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Map stringsByIds = new Map { accountIdA => 'Account A', accountIdB => 'Account B', @@ -256,7 +256,37 @@ private class fflib_ArrayUtilsTest Set result = fflib_ArrayUtils.getAllValues(stringsByIds, new Set {accountIdA, accountIdB}); // THEN we get the values of the provide sub-set Ids - System.assert(result.containsAll(new Set{'Account A', 'Account B'})); + System.assert(result.containsAll(new Set {'Account A', 'Account B'})); + } + + @IsTest + static void itShouldReturnMergedMap() + { + final Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); + final Set ids = new Set {accountIdA, accountIdB, accountIdC}; + + final Map> stringsByIdsA = new Map> + { + accountIdA => new Set {'A1', 'A2'}, + accountIdB => new Set {'B1'} + }; + final Map> stringsByIdsB = new Map> + { + accountIdA => new Set {'A3'}, + accountIdC => new Set {'C1'} + }; + + Map> result = fflib_ArrayUtils.mergeMaps(stringsByIdsA, stringsByIdsB); + + System.assert(result.keySet().containsAll(ids)); + System.assert(result.get(accountIdA).containsAll(new Set{'A1', 'A2', 'A3'})); + System.assert(result.get(accountIdA).size() == 3); + System.assert(result.get(accountIdB).contains('B1')); + System.assert(result.get(accountIdB).size() == 1); + System.assert(result.get(accountIdC).contains('C1')); + System.assert(result.get(accountIdC).size() == 1); } private static List generateDateTimes()