Merge pull request #36 from wimvelzeboer/feature/GetAllValues

Add getAllValues to fflib_ArrayUtils
This commit is contained in:
William Velzeboer
2022-03-16 10:45:13 +00:00
committed by GitHub
2 changed files with 96 additions and 0 deletions
@@ -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<String> getAllValues(Map<Id, String> stringsByIds, Set<Id> idsToRetrieve)
{
Set<String> result = new Set<String>();
for (Id id : idsToRetrieve)
{
if (stringsByIds.containsKey(id) == false) continue;
result.add(stringsByIds.get(id));
}
return result;
}
/**
* Validates if a list is empty
*
@@ -185,6 +205,31 @@ public class fflib_ArrayUtils
return lastValue(cloneAndSort(input));
}
/**
* Merge the given two maps, without modifying the source.
*
* @param mapA Map<Id, Set<String>>
* @param mapB Map<Id, Set<String>>
*
* @return Returns the merged map
*/
public static Map<Id, Set<String>> mergeMaps(Map<Id, Set<String>> mapA, Map<Id, Set<String>> mapB)
{
Map<Id, Set<String>> 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
*
@@ -238,6 +238,57 @@ 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
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<Id, String> stringsByIds = new Map<Id, String>
{
accountIdA => 'Account A',
accountIdB => 'Account B',
accountIdC => 'Account C'
};
// WHEN we retrieve a sub-set of Ids
Set<String> result = fflib_ArrayUtils.getAllValues(stringsByIds, new Set<Id> {accountIdA, accountIdB});
// THEN we get the values of the provide sub-set Ids
System.assert(result.containsAll(new Set<String> {'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<Id> ids = new Set<Id> {accountIdA, accountIdB, accountIdC};
final Map<Id, Set<String>> stringsByIdsA = new Map<Id, Set<String>>
{
accountIdA => new Set<String> {'A1', 'A2'},
accountIdB => new Set<String> {'B1'}
};
final Map<Id, Set<String>> stringsByIdsB = new Map<Id, Set<String>>
{
accountIdA => new Set<String> {'A3'},
accountIdC => new Set<String> {'C1'}
};
Map<Id, Set<String>> result = fflib_ArrayUtils.mergeMaps(stringsByIdsA, stringsByIdsB);
System.assert(result.keySet().containsAll(ids));
System.assert(result.get(accountIdA).containsAll(new Set<String>{'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<Datetime> generateDateTimes()
{
return new List<Datetime>