diff --git a/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls b/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls index 803b971..c9439f5 100644 --- a/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls +++ b/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls @@ -22,6 +22,64 @@ public inherited sharing class ${NAME} return (List<${SObject_API_Name}>) getRecords(); } + public I${NAME} selectById(Set ids) + { + return new ${NAME}(getRecords(ids)); + } + + private I${NAME} selectBy(fflib_Criteria criteria) + { + return new ${NAME}(getRecords(criteria)); + } + + private I${NAME} selectBlank(Schema.SObjectField sObjectField) + { + List<${SObject_API_Name}> result = new List<${SObject_API_Name}>(); + for (${SObject_API_Name} record : get${NAME}()) + { + if (String.isNotBlank((String) record.get(sObjectField))) continue; + + result.add(record); + } + return new ${NAME}(result); + } + + private I${NAME} selectNonBlank(Schema.SObjectField sObjectField) + { + List<${SObject_API_Name}> result = new List<${SObject_API_Name}>(); + for (${SObject_API_Name} record : get${NAME}()) + { + if (String.isBlank((String) record.get(sObjectField))) continue; + + result.add(record); + } + return new ${NAME}(result); + } + + private I${NAME} selectWith(Schema.SObjectField sObjectField) + { + List<${SObject_API_Name}> result = new List<${SObject_API_Name}>(); + for (${SObject_API_Name} record : get${NAME}()) + { + if (record.get(sObjectField) == null) continue; + + result.add(record); + } + return new ${NAME}(result); + } + + private I${NAME} selectWithout(Schema.SObjectField sObjectField) + { + List<${SObject_API_Name}> result = new List<${SObject_API_Name}>(); + for (${SObject_API_Name} record : get${NAME}()) + { + if (record.get(sObjectField) != null) continue; + + result.add(record); + } + return new ${NAME}(result); + } + public class Constructor implements fflib_IDomainConstructor { public fflib_SObjects construct(List records) diff --git a/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls.child.1.cls b/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls.child.1.cls index 4334312..5804dad 100644 --- a/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls.child.1.cls +++ b/dev-tools/assets/intelliJ/fileTemplates/AEPE - Domain Structure.cls.child.1.cls @@ -2,4 +2,5 @@ public interface I${NAME} extends fflib_ISObjects { List<${SObject_API_Name}> get${NAME}(); + I${NAME} selectById(Set ids); } \ No newline at end of file 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 0326647..f229323 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 @@ -713,7 +713,7 @@ public virtual class fflib_SObjects2 protected virtual Map getStringFieldByIdField(Schema.SObjectField valueField, Schema.SObjectField keyField) { Map result = new Map(); - Map fieldByField = getFieldByField(keyField, valueField); + Map fieldByField = getFieldByField(valueField, keyField); for (Object obj : fieldByField.keySet()) { result.put((Id) obj, (String) fieldByField.get(obj)); diff --git a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls index 131524f..de6af26 100644 --- a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls +++ b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls @@ -15,4 +15,15 @@ public with sharing class fflib_MockSObjectUtil JSON.serialize(parentObject) + '}', SObject.class); } + + public static SObject addFieldValue( + SObject record, SObjectField sObjectField, Object value) + { + String original = JSON.serialize(record); + return (SObject) JSON.deserialize( + original.left(original.length() - 1) + ',"' + + sObjectField.getDescribe().getName() + '":"' + + String.valueOf(value) + '"}', + SObject.class); + } } \ No newline at end of file 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 9bdda31..a8dec05 100644 --- a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls +++ b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls @@ -108,8 +108,6 @@ private class fflib_SObjects2Test domain.getIdFieldsByIdField(Account.Id, Account.Id); domain.getIdFieldValues(Account.Id); domain.getIdFieldValues(Account.Id, criteria); - domain.getIntegerFieldValues(Account.NumberOfEmployees); - domain.getIntegerFieldValues(Account.NumberOfEmployees, criteria); domain.getDecimalFieldValues(Account.BillingLatitude, criteria); domain.getDoubleFieldValues(Account.BillingLatitude); domain.getDoubleFieldValues(Account.BillingLatitude, criteria); @@ -117,7 +115,6 @@ private class fflib_SObjects2Test domain.getSObjectsByIdField(Account.Id); domain.getSObjectByStringField(Account.Name); domain.getSObjectsByStringField(Account.Name); - domain.getStringFieldByIdField(Account.Id, Account.Name); domain.getStringFieldByStringField(Account.Name, Account.AccountNumber); domain.getStringFieldValues(Account.Name, criteria); @@ -137,6 +134,89 @@ private class fflib_SObjects2Test System.assertEquals(accountId, nameById.get(accountId)); } + @IsTest + static void itShouldReturnStringFieldByIdField() + { + final String accountName = 'My Account'; + final Id accountId = fflib_IDGenerator.generate(Account.SObjectType); + DomainAccounts domain = new DomainAccounts( + new List + { + new Account(Id = accountId, Name = accountName), + new Account(Name = accountName + ' 2') // This one should be ignored + }); + + System.Test.startTest(); + Map result = domain.getStringFieldByIdField(Account.Name, Account.Id); + System.Test.stopTest(); + + System.assertEquals(1, result.size(), 'Incorrect returned amount of results'); + System.assert(result.keySet().contains(accountId), 'The accountId is missing from the results'); + System.assertEquals(accountName, result.get(accountId), 'Incorrect returned account name'); + } + + @IsTest + static void itShouldReturnIntegerFieldValues() + { + final Integer numberOfEmployees = 10; + final String accountName = 'Test Account'; + DomainAccounts domain = new DomainAccounts( + new List + { + new Account(NumberOfEmployees = numberOfEmployees), + new Account(Name = accountName, NumberOfEmployees = numberOfEmployees * 2), + new Account() // This one should be ignored + }); + + System.Test.startTest(); + Set result = domain.getIntegerFieldValues(Account.NumberOfEmployees).getIntegerSet(); + Set result2 = + domain.getIntegerFieldValues( + Account.NumberOfEmployees, + new fflib_Criteria().equalTo(Schema.Account.Name, accountName) + ) + .getIntegerSet(); + System.Test.stopTest(); + + System.assertEquals(2, result.size(), 'Incorrect amount of results'); + System.assert(result.contains(numberOfEmployees), 'The expected numberOfEmployees was not returned'); + System.assert(result.contains(numberOfEmployees * 2), 'The expected numberOfEmployees was not returned'); + + System.assertEquals(1, result2.size(), 'Incorrect amount of results'); + System.assert(result2.contains(numberOfEmployees * 2), 'The expected numberOfEmployees was not returned'); + } + + @IsTest + static void itShouldReturnLongFieldValues() + { + final Integer numberOfEmployees = 10; + final String accountName = 'Test Account'; + DomainAccounts domain = new DomainAccounts( + new List + { + new Account(NumberOfEmployees = numberOfEmployees), + new Account(Name = accountName, NumberOfEmployees = numberOfEmployees * 2), + new Account() // This one should be ignored + }); + + System.Test.startTest(); + Set result = domain.getLongFieldValues(Account.NumberOfEmployees).getLongSet(); + Set result2 = + domain.getLongFieldValues( + Account.NumberOfEmployees, + new fflib_Criteria().equalTo(Schema.Account.Name, accountName) + ) + .getLongSet(); + System.Test.stopTest(); + + System.assertEquals(2, result.size(), 'Incorrect amount of results'); + System.assert(result.contains(numberOfEmployees), 'The expected numberOfEmployees was not returned'); + System.assert(result.contains(numberOfEmployees * 2), 'The expected numberOfEmployees was not returned'); + + System.assertEquals(1, result2.size(), 'Incorrect amount of results'); + System.assert(result2.contains(numberOfEmployees * 2), 'The expected numberOfEmployees was not returned'); + } + @IsTest static void itShouldReturnRecordIdById() {