Skip to content

Commit

Permalink
PRESIDECMS-535 Clear page + page type caches after editing a page, av…
Browse files Browse the repository at this point in the history
…oiding issues with child page caches not clearing leading to broken slugs, eventually
  • Loading branch information
DominicWatson committed Sep 7, 2016
1 parent 14594af commit d4e06b4
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 55 deletions.
116 changes: 61 additions & 55 deletions system/services/presideObjects/PresideObjectService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ component singleton=true autodoc=true displayName="Preside Object Service" {
}
}

_clearRelatedCaches(
clearRelatedCaches(
objectName = arguments.objectName
, filter = ""
, filterParams = {}
Expand Down Expand Up @@ -524,7 +524,7 @@ component singleton=true autodoc=true displayName="Preside Object Service" {
}
}

_clearRelatedCaches(
clearRelatedCaches(
objectName = arguments.objectName
, filter = preparedFilter.filter
, filterParams = preparedFilter.filterParams
Expand Down Expand Up @@ -617,7 +617,7 @@ component singleton=true autodoc=true displayName="Preside Object Service" {

result = _runSql( sql=sql, dsn=obj.dsn, params=preparedFilter.params, returnType="info" );

_clearRelatedCaches(
clearRelatedCaches(
objectName = arguments.objectName
, filter = preparedFilter.filter
, filterParams = preparedFilter.filterParams
Expand Down Expand Up @@ -1181,6 +1181,64 @@ component singleton=true autodoc=true displayName="Preside Object Service" {
return "textinput";
}

/**
* Clears related selectData caches
* for the given object and optional filters
*
* @autodoc
*/
public void function clearRelatedCaches(
required string objectName
, any filter = ""
, struct filterParams = {}
, boolean clearSingleRecordCaches = true
) {
var cacheMaps = _getCacheMaps();
var keysToClear = "";
var objIds = "";
var objId = "";

if ( StructKeyExists( cacheMaps, arguments.objectName ) ) {
keysToClear = StructKeyList( cacheMaps[ arguments.objectName ].__complexFilter );

if ( IsStruct( arguments.filter ) and StructKeyExists( arguments.filter, "id" ) ) {
objIds = arguments.filter.id;
} elseif ( StructKeyExists( arguments.filterParams, "id" ) ) {
objIds = arguments.filterParams.id;
}

if ( IsSimpleValue( objIds ) ) {
objIds = ListToArray( objIds );
}

if ( IsArray( objIds ) and ArrayLen( objIds ) ) {
for( objId in objIds ){
if ( StructKeyExists( cacheMaps[ arguments.objectName ], objId ) ) {
keysToClear = ListAppend( keysToClear, StructKeyList( cacheMaps[ arguments.objectName ][ objId ] ) );
StructDelete( cacheMaps[ arguments.objectName ], objId );
}
}
StructClear( cacheMaps[ arguments.objectName ].__complexFilter );
} elseif ( arguments.clearSingleRecordCaches ) {
for( objId in cacheMaps[ arguments.objectName ] ) {
if ( objId neq "__complexFilter" ) {
keysToClear = ListAppend( keysToClear, StructKeyList( cacheMaps[ arguments.objectName ][ objId ] ) );
}
}
StructDelete( cacheMaps, arguments.objectName );
}

if ( ListLen( keysToClear ) ) {
_getDefaultQueryCache().clearMulti( keysToClear );
}
}

var derivedFrom = getObjectAttribute( arguments.objectName, "derivedFrom", "" );
if ( Len( Trim( derivedFrom ) ) ) {
clearRelatedCaches( argumentCollection=arguments, objectName=derivedFrom );
}
}

// PRIVATE HELPERS
private void function _loadObjects() {
var objectPaths = _getAllObjectPaths();
Expand Down Expand Up @@ -1727,58 +1785,6 @@ component singleton=true autodoc=true displayName="Preside Object Service" {
}
}

private void function _clearRelatedCaches(
required string objectName
, required any filter
, required struct filterParams
, boolean clearSingleRecordCaches = true
) {
var cacheMaps = _getCacheMaps();
var keysToClear = "";
var objIds = "";
var objId = "";

if ( StructKeyExists( cacheMaps, arguments.objectName ) ) {
keysToClear = StructKeyList( cacheMaps[ arguments.objectName ].__complexFilter );

if ( IsStruct( arguments.filter ) and StructKeyExists( arguments.filter, "id" ) ) {
objIds = arguments.filter.id;
} elseif ( StructKeyExists( arguments.filterParams, "id" ) ) {
objIds = arguments.filterParams.id;
}

if ( IsSimpleValue( objIds ) ) {
objIds = ListToArray( objIds );
}

if ( IsArray( objIds ) and ArrayLen( objIds ) ) {
for( objId in objIds ){
if ( StructKeyExists( cacheMaps[ arguments.objectName ], objId ) ) {
keysToClear = ListAppend( keysToClear, StructKeyList( cacheMaps[ arguments.objectName ][ objId ] ) );
StructDelete( cacheMaps[ arguments.objectName ], objId );
}
}
StructClear( cacheMaps[ arguments.objectName ].__complexFilter );
} elseif ( arguments.clearSingleRecordCaches ) {
for( objId in cacheMaps[ arguments.objectName ] ) {
if ( objId neq "__complexFilter" ) {
keysToClear = ListAppend( keysToClear, StructKeyList( cacheMaps[ arguments.objectName ][ objId ] ) );
}
}
StructDelete( cacheMaps, arguments.objectName );
}

if ( ListLen( keysToClear ) ) {
_getDefaultQueryCache().clearMulti( keysToClear );
}
}

var derivedFrom = getObjectAttribute( arguments.objectName, "derivedFrom", "" );
if ( Len( Trim( derivedFrom ) ) ) {
_clearRelatedCaches( argumentCollection=arguments, objectName=derivedFrom );
}
}

private array function _parseSelectFields( required string objectName, required array selectFields ) {
_announceInterception( "preParseSelectFields", arguments );
var fields = arguments.selectFields;
Expand Down
3 changes: 3 additions & 0 deletions system/services/siteTree/SiteTreeService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,9 @@ component singleton=true {
, newData = data
);
}

_getPresideObjectService().clearRelatedCaches( "page" );
_getPresideObjectService().clearRelatedCaches( existingPage.page_type );
}

return updated;
Expand Down

0 comments on commit d4e06b4

Please sign in to comment.