@@ -34,7 +34,7 @@ private with sharing class fflib_SObjectSelectorTest
3434
3535 static testMethod void testGetSObjectName ()
3636 {
37- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
37+ AccountSelector selector = new AccountSelector ();
3838 system .assertEquals (null , selector .getSObjectFieldSetList ());
3939 system .assertEquals (' Account' ,selector .getSObjectName ());
4040 }
@@ -51,7 +51,7 @@ private with sharing class fflib_SObjectSelectorTest
5151 idSet .add (item .Id );
5252
5353 Test .startTest ();
54- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
54+ AccountSelector selector = new AccountSelector ();
5555 List <Account > result = (List <Account >) selector .selectSObjectsById (idSet );
5656 Test .stopTest ();
5757
@@ -76,7 +76,7 @@ private with sharing class fflib_SObjectSelectorTest
7676 idSet .add (item .Id );
7777
7878 Test .startTest ();
79- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
79+ AccountSelector selector = new AccountSelector ();
8080 Database .QueryLocator result = selector .queryLocatorById (idSet );
8181 System .Iterator < SObject > iteratorResult = result .iterator ();
8282 Test .stopTest ();
@@ -110,7 +110,7 @@ private with sharing class fflib_SObjectSelectorTest
110110 return ; // Abort the test if unable to create a user with low enough acess
111111 System .runAs (testUser )
112112 {
113- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
113+ AccountSelector selector = new AccountSelector ();
114114 try
115115 {
116116 List <Account > result = (List <Account >) selector .selectSObjectsById (idSet );
@@ -139,7 +139,7 @@ private with sharing class fflib_SObjectSelectorTest
139139 return ; // Abort the test if unable to create a user with low enough acess
140140 System .runAs (testUser )
141141 {
142- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector (false , false , false , true );
142+ AccountSelector selector = new AccountSelector (false , false , false , true );
143143 try
144144 {
145145 List <Account > result = (List <Account >) selector .selectSObjectsById (idSet );
@@ -153,7 +153,7 @@ private with sharing class fflib_SObjectSelectorTest
153153
154154 static testMethod void testSOQL ()
155155 {
156- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
156+ AccountSelector selector = new AccountSelector ();
157157 String soql = selector .newQueryFactory ().toSOQL ();
158158 Pattern p = Pattern .compile (' SELECT (.*) FROM Account ORDER BY AccountNumber DESC NULLS FIRST , AnnualRevenue ASC NULLS LAST ' );
159159 Matcher m = p .matcher (soql );
@@ -165,7 +165,7 @@ private with sharing class fflib_SObjectSelectorTest
165165
166166 static testMethod void testSOQL_defaultSorting ()
167167 {
168- Testfflib_SObjectSelectorDefaultSorting selector = new Testfflib_SObjectSelectorDefaultSorting (false );
168+ DefaultSortingAccountSelector selector = new DefaultSortingAccountSelector (false );
169169 String soql = selector .newQueryFactory ().toSOQL ();
170170 Pattern p = Pattern .compile (String .format (' SELECT (.*) FROM Account ORDER BY {0} ASC NULLS FIRST ' ,
171171 new List <String >{selector .getOrderBy ()}));
@@ -178,7 +178,7 @@ private with sharing class fflib_SObjectSelectorTest
178178
179179 static testMethod void testDefaultConfig ()
180180 {
181- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector ();
181+ AccountSelector selector = new AccountSelector ();
182182 System .assertEquals (false , selector .isEnforcingFLS ());
183183 System .assertEquals (true , selector .isEnforcingCRUD ());
184184 System .assertEquals (false , selector .isIncludeFieldSetFields ());
@@ -213,7 +213,7 @@ private with sharing class fflib_SObjectSelectorTest
213213 static void testWithoutSorting ()
214214 {
215215 // Given
216- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector (false , false , false , false );
216+ AccountSelector selector = new AccountSelector (false , false , false , false );
217217 fflib_QueryFactory qf = selector .newQueryFactory ();
218218
219219 Set <String > expectedSelectFields = new Set <String >{ ' Name' , ' Id' , ' AccountNumber' , ' AnnualRevenue' };
@@ -239,7 +239,7 @@ private with sharing class fflib_SObjectSelectorTest
239239 static void testWithOrderingNullsLast ()
240240 {
241241 // Build the selector to test with
242- Testfflib_SObjectSelector selector = new Testfflib_SObjectSelector (false , false , false , false );
242+ AccountSelector selector = new AccountSelector (false , false , false , false );
243243 fflib_QueryFactory qf = selector .newQueryFactory ();
244244
245245 // Add in the expected fields
@@ -466,14 +466,14 @@ private with sharing class fflib_SObjectSelectorTest
466466 }
467467
468468
469- private class Testfflib_SObjectSelector extends fflib_SObjectSelector
469+ private class AccountSelector extends fflib_SObjectSelector
470470 {
471- public Testfflib_SObjectSelector ()
471+ public AccountSelector ()
472472 {
473473 super ();
474474 }
475475
476- public Testfflib_SObjectSelector (Boolean includeFieldSetFields , Boolean enforceCRUD , Boolean enforceFLS , Boolean sortSelectFields )
476+ public AccountSelector (Boolean includeFieldSetFields , Boolean enforceCRUD , Boolean enforceFLS , Boolean sortSelectFields )
477477 {
478478 super (includeFieldSetFields , enforceCRUD , enforceFLS , sortSelectFields );
479479 }
@@ -498,7 +498,7 @@ private with sharing class fflib_SObjectSelectorTest
498498 return ' AccountNumber DESC, AnnualRevenue ASC NULLS LAST' ;
499499 }
500500 }
501-
501+
502502 private class Testfflib_UserSObjectSelector extends fflib_SObjectSelector
503503 {
504504 public Testfflib_UserSObjectSelector ()
@@ -523,9 +523,9 @@ private with sharing class fflib_SObjectSelectorTest
523523
524524 }
525525
526- private class Testfflib_SObjectSelectorDefaultSorting extends fflib_SObjectSelector
526+ private class DefaultSortingAccountSelector extends fflib_SObjectSelector
527527 {
528- public Testfflib_SObjectSelectorDefaultSorting (Boolean includeFieldSetFields )
528+ public DefaultSortingAccountSelector (Boolean includeFieldSetFields )
529529 {
530530 super (includeFieldSetFields );
531531 }
@@ -629,6 +629,56 @@ private with sharing class fflib_SObjectSelectorTest
629629 }
630630 }
631631
632+ private class ContractSelector extends fflib_SObjectSelector {
633+ public ContractSelector (){
634+ super (false ,DataAccess .SYSTEM_MODE );
635+ }
636+
637+ public Schema.SObjectType getSObjectType (){
638+ return Contract .SObjectType ;
639+ }
640+
641+ public List <Schema .SObjectField > getSObjectFieldList (){
642+ return new List <Schema .SObjectField > {
643+ Contract .Id ,
644+ Contract .ContractNumber
645+ };
646+ }
647+ }
648+
649+ private class OrderSelector extends fflib_SObjectSelector {
650+ public OrderSelector (){
651+ super (false ,DataAccess .SYSTEM_MODE );
652+ }
653+
654+ public Schema.SObjectType getSObjectType (){
655+ return Order .SObjectType ;
656+ }
657+
658+ public List <Schema .SObjectField > getSObjectFieldList (){
659+ return new List <Schema .SObjectField > {
660+ Order .Id ,
661+ Order .OrderNumber
662+ };
663+ }
664+ }
665+
666+ private class TaskSelector extends fflib_SObjectSelector {
667+ public TaskSelector (){
668+ super (false ,DataAccess .SYSTEM_MODE );
669+ }
670+
671+ public Schema.SObjectType getSObjectType (){
672+ return Task .SObjectType ;
673+ }
674+
675+ public List <Schema .SObjectField > getSObjectFieldList (){
676+ return new List <Schema .SObjectField > {
677+ Task .Id ,
678+ Task .Subject
679+ };
680+ }
681+ }
632682
633683 /**
634684 * Create test user
@@ -762,6 +812,37 @@ private with sharing class fflib_SObjectSelectorTest
762812 System .assertEquals (expectedSOQL , actualSOQL );
763813 }
764814
815+ @IsTest
816+ static void toSOQL_When_GreatGreatGrandchildRelationships_Expect_WelformedSOQL (){
817+ AccessLevelAccountSelector aSel = new AccessLevelAccountSelector ();
818+ fflib_QueryFactory aQF = aSel .newQueryFactory ();
819+
820+ ContractSelector cSel = new ContractSelector ();
821+ fflib_QueryFactory cQF = cSel .addQueryFactorySubselect (aQF );
822+
823+ AccessLevelOpportunitySelector oppSel = new AccessLevelOpportunitySelector ();
824+ fflib_QueryFactory oppQF = oppSel .addQueryFactorySubselect (cQF );
825+
826+ OrderSelector orderSel = new OrderSelector ();
827+ fflib_QueryFactory orderQF = orderSel .addQueryFactorySubselect (oppQF );
828+
829+ TaskSelector tSel = new TaskSelector ();
830+ fflib_QueryFactory tQF = tSel .addQueryFactorySubselect (orderQF );
831+
832+ String expected
833+ = ' SELECT name, id, annualrevenue, accountnumber, '
834+ + ' (SELECT id, contractnumber, '
835+ + ' (SELECT name, id, amount, closedate, '
836+ + ' (SELECT id, ordernumber, '
837+ + ' (SELECT id, subject FROM Tasks ORDER BY Subject ASC NULLS FIRST ) '
838+ + ' FROM Orders ORDER BY OrderNumber ASC NULLS FIRST ) '
839+ + ' FROM Opportunities ORDER BY Name ASC NULLS FIRST ) '
840+ + ' FROM Contracts ORDER BY ContractNumber ASC NULLS FIRST ) '
841+ + ' FROM Account WITH USER_MODE ORDER BY Name ASC NULLS FIRST ' ;
842+
843+ Assert .areEqual (expected ,aQF .toSOQL ());
844+ }
845+
765846 private class CampaignMemberSelector extends fflib_SObjectSelector {
766847 public CampaignMemberSelector (DataAccess access ) {
767848 super (false , access );
0 commit comments