Skip to content

Commit 928ec86

Browse files
committed
Merge branch 'feature-PRESIDECMS-3001_deep-linked-selectdataview-relationships' into release-10.28.0
2 parents de84934 + 3a5158e commit 928ec86

File tree

8 files changed

+106
-13
lines changed

8 files changed

+106
-13
lines changed

system/services/presideObjects/RelationshipGuidance.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ component singleton=true {
461461
case "select-data-view":
462462
join.append({
463463
selectDataView = relationship.selectDataView
464-
, subQueryAlias = relationship.alias
464+
, subQueryAlias = joinAlias
465465
, subQueryColumn = relationship.pk
466466
, joinToTable = Len( currentAlias ) ? currentAlias : currentSource
467467
, joinToColumn = relationship.fk

tests/index.cfm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@
5454

5555
<p>Quick test excludes the following long-running tests. Click to run them individually:</p>
5656
<ul>
57-
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=integration.api.admin.AuditServiceTest">admin.AuditServiceTest</a></li>
58-
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=integration.api.admin.LoginServiceTest">admin.LoginServiceTest</a></li>
59-
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=integration.api.presideObjects.PresideObjectServiceTest">presideObjects.PresideObjectServiceTest</a></li>
60-
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=integration.api.security.CsrfProtectionServiceTest">security.CsrfProtectionServiceTest</a></li>
61-
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=integration.api.sitetree.SiteServiceTest">sitetree.SiteServiceTest</a></li>
57+
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=unit.api.admin.AuditServiceTest">admin.AuditServiceTest</a></li>
58+
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=unit.api.admin.LoginServiceTest">admin.LoginServiceTest</a></li>
59+
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=unit.api.presideObjects.PresideObjectServiceTest">presideObjects.PresideObjectServiceTest</a></li>
60+
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=unit.api.security.CsrfProtectionServiceTest">security.CsrfProtectionServiceTest</a></li>
61+
<li><a href="runtests.cfm?method=runRemote&directory=&testBundles=unit.api.sitetree.SiteServiceTest">sitetree.SiteServiceTest</a></li>
6262
</ul>
6363
</p>
6464
</section>

tests/resources/HelperObjects/PresideTestCase.cfc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<cfargument name="coldbox" type="any" required="false" />
5252
<cfargument name="msSqlUseVarcharMaxForText" type="boolean" required="false" default="false" />
5353
<cfargument name="throwOnLongTableName" type="boolean" required="false" default="false" />
54+
<cfargument name="delayInit" type="boolean" required="false" default="false" />
5455

5556
<cfscript>
5657
var key = "_presideObjectService" & Hash( SerializeJson( arguments ) );
@@ -87,7 +88,7 @@
8788
);
8889
var relationshipGuidance = new preside.system.services.presideObjects.relationshipGuidance(
8990
objectReader = objReader
90-
, selectDataViewService = createStub()
91+
, selectDataViewService = arguments.selectDataViewService
9192
);
9293
var presideObjectDecorator = new preside.system.services.presideObjects.presideObjectDecorator();
9394

@@ -129,7 +130,6 @@
129130
, reloadDb = false
130131
, throwOnLongTableName = arguments.throwOnLongTableName
131132
);
132-
request[ key ].postInit();
133133

134134
request[ key ] = getMockbox().createMock( object=request[ key ] );
135135

@@ -141,6 +141,10 @@
141141
request[ key ].$( "$getColdbox", coldbox );
142142
mockRequestContext.$( "showNonLiveContent", false );
143143
coldbox.$( "handlerExists", false );
144+
145+
if ( !arguments.delayInit ) {
146+
request[ key ].postInit();
147+
}
144148
}
145149

146150
request[ '_mostRecentPresideObjectFetch' ] = request[ key ];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<cfcomponent output="false" versioned="false">
2+
<cfproperty name="object_bs" relationship="one-to-many" relatedto="object_b" relationshipKey="object_a" />
3+
</cfcomponent>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<cfcomponent output="false" versioned="false">
2+
<cfproperty name="object_a" relationship="many-to-one" relatedto="object_a" />
3+
<cfproperty name="object_cs" relationship="one-to-many" relatedto="object_c" relationshipKey="object_b" />
4+
</cfcomponent>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<cfcomponent output="false" versioned="false">
2+
<cfproperty name="object_b" relationship="many-to-one" relatedTo="object_b" />
3+
<cfproperty name="object_ds" relationship="select-data-view" relatedTo="viewObjectD" relationshipKey="object_c" />
4+
</cfcomponent>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<cfcomponent output="false" versioned="false">
2+
<cfproperty name="object_c" type="string" sqltype="varchar" />
3+
<cfproperty name="value" type="numeric" sqltype="int" />
4+
</cfcomponent>

tests/unit/api/presideObjects/PresideObjectServiceTest.cfc

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3914,11 +3914,11 @@
39143914
bIds.append( poService.insertData( objectName="object_b", data={ label="b 2", lots_of_a="#aIds[2]#" }, insertManyToManyRecords=true ) );
39153915
cIds.append( poService.insertData( objectName="object_c", data={ label="c 1", obj_b=bIds[1] } ) );
39163916
cIds.append( poService.insertData( objectName="object_c", data={ label="c 2", obj_b=bIds[2] } ) );
3917-
3917+
39183918
var queryA = poService.selectData(
39193919
objectName = "object_a"
39203920
, filter = { label = "a 1" }
3921-
, selectFields = [ "id" ]
3921+
, selectFields = [ "id" ]
39223922
, getSqlAndParamsOnly = true
39233923
, formatSqlParams = true
39243924
);
@@ -3929,14 +3929,14 @@
39293929
, extraFilters = [ {
39303930
filter = sqlRunner.obfuscateSqlForPreside( "exists (#queryA.sql#) " )
39313931
} ]
3932-
, selectFields = [ "id" ]
3932+
, selectFields = [ "id" ]
39333933
, getSqlAndParamsOnly = true
39343934
, formatSqlParams = true
39353935
);
39363936

39373937
var params = queryA.params;
39383938
StructAppend( params, queryB.params, true );
3939-
3939+
39403940
var queryWithParams = poService.selectData(
39413941
objectName = "object_c"
39423942
, selectFields = [ "id" ]
@@ -3952,18 +3952,91 @@
39523952
</cfscript>
39533953
</cffunction>
39543954

3955+
<cffunction name="test111_selectData_shouldWorkWithDeepNestedSelectDataViews" returntype="void">
3956+
<cfscript>
3957+
var poService = _getService(
3958+
objectDirectories = [ "/tests/resources/PresideObjectService/objectsWithNestedSelectDataViews" ]
3959+
, delayInit = true
3960+
);
3961+
var sqlRunner = CreateMock( object=new preside.system.services.database.SqlRunner(
3962+
logger = _getTestLogger()
3963+
) );
3964+
3965+
mockSelectDataViewService.$( "getViewArgs", {
3966+
objectname = "object_d"
3967+
, selectFields = [ "object_c", "sum( value ) as total_value" ]
3968+
, groupBy = "object_c"
3969+
} );
3970+
mockSelectDataViewService.$( "$getPresideObjectService", poService );
3971+
poService.postInit();
3972+
3973+
var aIds = [];
3974+
var bIds = [];
3975+
var cIds = [];
3976+
var dIds = [];
3977+
3978+
poService.dbSync();
3979+
3980+
ArrayAppend( aIds, poService.insertData( objectName="object_a", data={ label="a 1" } ) );
3981+
ArrayAppend( aIds, poService.insertData( objectName="object_a", data={ label="a 2" } ) );
3982+
ArrayAppend( aIds, poService.insertData( objectName="object_a", data={ label="a 3" } ) );
3983+
ArrayAppend( bIds, poService.insertData( objectName="object_b", data={ label="b 1", object_a=aIds[1] } ) );
3984+
ArrayAppend( bIds, poService.insertData( objectName="object_b", data={ label="b 2", object_a=aIds[2] } ) );
3985+
ArrayAppend( bIds, poService.insertData( objectName="object_b", data={ label="b 3", object_a=aIds[3] } ) );
3986+
ArrayAppend( cIds, poService.insertData( objectName="object_c", data={ label="c 1", object_b=bIds[1] } ) );
3987+
ArrayAppend( cIds, poService.insertData( objectName="object_c", data={ label="c 2", object_b=bIds[2] } ) );
3988+
ArrayAppend( cIds, poService.insertData( objectName="object_c", data={ label="c 3", object_b=bIds[3] } ) );
3989+
ArrayAppend( cIds, poService.insertData( objectName="object_c", data={ label="c 4", object_b=bIds[3] } ) );
3990+
3991+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 1", object_c=cIds[1], value=5 } ) );
3992+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 2", object_c=cIds[1], value=9 } ) );
3993+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 3", object_c=cIds[2], value=8 } ) );
3994+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 4", object_c=cIds[2], value=4 } ) );
3995+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 5", object_c=cIds[3], value=3 } ) );
3996+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 6", object_c=cIds[3], value=1 } ) );
3997+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 7", object_c=cIds[4], value=15 } ) );
3998+
ArrayAppend( dIds, poService.insertData( objectName="object_d", data={ label="d 8", object_c=cIds[4], value=10 } ) );
3999+
4000+
var queryA = poService.selectData(
4001+
objectName = "object_a"
4002+
, selectFields = [ "object_a.label", "object_bs$object_cs$object_ds.total_value" ]
4003+
, filter = { "object_a.id" = aIds[1] }
4004+
);
4005+
4006+
var queryB = poService.selectData(
4007+
objectName = "object_a"
4008+
, selectFields = [ "object_a.label", "object_bs$object_cs$object_ds.total_value" ]
4009+
, filter = { "object_a.id" = aIds[2] }
4010+
);
4011+
4012+
var queryC = poService.selectData(
4013+
objectName = "object_a"
4014+
, selectFields = [ "object_a.label", "object_bs$object_cs$object_ds.total_value" ]
4015+
, filter = { "object_a.id" = aIds[3] }
4016+
);
4017+
4018+
super.assertEquals( queryA.total_value, 14, "Expected total value mismatch" );
4019+
super.assertEquals( queryB.total_value, 12, "Expected total value mismatch" );
4020+
super.assertEquals( queryC.recordCount, 2, "Expected record count mismatch" );
4021+
super.assertEquals( ArraySum( QueryColumnData( queryC, "total_value" ) ), 29, "Expected total value mismatch" );
4022+
</cfscript>
4023+
</cffunction>
4024+
39554025
<!--- private helpers --->
39564026
<cffunction name="_getService" access="private" returntype="any" output="false">
39574027
<cfargument name="objectDirectories" type="array" required="true" />
39584028
<cfargument name="defaultPrefix" type="string" required="false" default="ptest_" />
39594029
<cfargument name="throwOnLongTableName" type="boolean" required="false" />
4030+
<cfargument name="delayInit" type="boolean" required="false" />
39604031

39614032
<cfscript>
39624033
cachebox = _getCachebox( forceNewInstance = true );
39634034
mockColdbox = getMockbox().createEmptyMock( "preside.system.coldboxModifications.Controller" );
39644035
mockColdboxEvent = getMockbox().createStub();
39654036
mockInterceptorService = _getMockInterceptorService();
3966-
mockSelectDataViewService = getMockbox().createEmptyMock( "preside.system.services.presideObjects.PresideObjectSelectDataViewService" );
4037+
4038+
var selectDataViewService = new preside.system.services.presideObjects.PresideObjectSelectDataViewService();
4039+
mockSelectDataViewService = getMockbox().prepareMock( selectDataViewService );
39674040

39684041
mockColdboxEvent.$( "isAdminUser", true );
39694042
mockColdboxEvent.$( "getAdminUserId", "" );
@@ -3978,6 +4051,7 @@
39784051
, interceptorService = mockInterceptorService
39794052
, selectDataViewService = mockSelectDataViewService
39804053
, throwOnLongTableName = arguments.throwOnLongTableName ?: false
4054+
, delayInit = arguments.delayInit
39814055
)
39824056
</cfscript>
39834057
</cffunction>

0 commit comments

Comments
 (0)