Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 72 additions & 32 deletions system/services/rulesEngine/RulesEngineExpressionReaderService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@ component displayName="RulesEngine Expression Reader Service" {
*/
public struct function getExpressionsFromCfc( required string componentPath, required string rootPath ) {
var meta = getComponentMetadata( arguments.componentPath );
var feature = meta.feature ?: "";
var category = meta.expressionCategory ?: "default";
var contexts = ListToArray( meta.expressionContexts ?: "global" );
var tags = ListToArray( meta.expressionTags ?: "" );
var feature = _getExtendedMeta( meta, "feature" , "" );
var category = _getExtendedMeta( meta, "expressionCategory" , "default" );
var contexts = ListToArray( _getExtendedMeta( meta, "expressionContexts", "global" ) );
var tags = ListToArray( _getExtendedMeta( meta, "expressionTags" , "" ) );
var contextsEnabled = false;
var contextService = _getContextService();

Expand All @@ -114,37 +114,27 @@ component displayName="RulesEngine Expression Reader Service" {
return {};
}

var functions = meta.functions ?: [];
var functions = _getExtendedFunctionsMeta( meta );
var baseId = arguments.componentPath.replaceNoCase( rootPath, "" ).reReplace( "^\.", "" );
var filterObjects = [];
var filterObjects = ListToArray( functions.prepareFilters.objects ?: "" );
var expressions = {};

for( var func in functions ) {
if ( func.name == "evaluateExpression" ) {
expressions[ baseId ] = {
contexts = _getContextService().expandContexts( ListToArray( meta.expressionContexts ?: "global" ) )
, fields = getExpressionFieldsFromFunctionDefinition( func )
, filterObjects = filterObjects
, category = category
, tags = tags
, expressionHandler = "rules.expressions.#baseId#.evaluateExpression"
, filterHandler = filterObjects.len() ? "rules.expressions.#baseId#.prepareFilters" : ""
, labelHandler = "rules.expressions.#baseId#.getLabel"
, textHandler = "rules.expressions.#baseId#.getText"
, expressionHandlerArgs = {}
, filterHandlerArgs = {}
, labelHandlerArgs = {}
, textHandlerArgs = {}
};

} else if ( func.name == "prepareFilters" ) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was it your intention to remove prepareFilters completely?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original prepareFilters check is to ensure that the filterObjects function property is set in the expression after the evaluateExpression function is processed.

The current _getExtendedFunctionsMeta function returns a struct of function meta, for example

{
      prepareFilters     = { objects="user,contact", parameters=[] }
    , evaluateExpression = { parameters=[] }
}

So we can now do

var filterObjects = ListToArray( functions.prepareFilters.objects ?: "" );
...
expressions[ baseId ] = {
      filterObjects = filterObjects
    , filterHandler = filterObjects.len() ? "rules.expressions.#baseId#.prepareFilters" : ""
    ...
};

filterObjects = ListToArray( func.objects ?: "" );
if ( StructKeyExists( expressions, baseId ) ) {
expressions[ baseId ].filterObjects = filterObjects;
expressions[ baseId ].filterHandler = "rules.expressions.#baseId#.prepareFilters";
break;
}
}
if ( StructKeyExists( functions, "evaluateExpression" ) ) {
expressions[ baseId ] = {
contexts = _getContextService().expandContexts( contexts )
, fields = getExpressionFieldsFromFunctionDefinition( functions.evaluateExpression )
, filterObjects = filterObjects
, category = category
, tags = tags
, expressionHandler = "rules.expressions.#baseId#.evaluateExpression"
, filterHandler = filterObjects.len() ? "rules.expressions.#baseId#.prepareFilters" : ""
, labelHandler = "rules.expressions.#baseId#.getLabel"
, textHandler = "rules.expressions.#baseId#.getText"
, expressionHandlerArgs = {}
, filterHandlerArgs = {}
, labelHandlerArgs = {}
, textHandlerArgs = {}
};
}

return expressions;
Expand Down Expand Up @@ -256,6 +246,56 @@ component displayName="RulesEngine Expression Reader Service" {
return "text";
}

private any function _getExtendedMeta( required struct metaData, required string key, any defaultValue ){
if ( StructKeyExists( arguments.metaData, arguments.key ) ) {
return arguments.metadata[ arguments.key ];
}

if ( StructKeyExists( arguments.metaData, "extends" ) ) {
return _getExtendedMeta( arguments.metaData.extends, arguments.key, arguments.defaultValue );
}

return arguments.defaultValue;
}

private struct function _getExtendedFunctionsMeta( required struct metaData ){
var extendedFunctions = {};
var metaDataFunctions = arguments.metaData.functions ?: [];

for ( var func in metaDataFunctions ) {
extendedFunctions[ func.name ] = Duplicate( func );
}

if ( StructKeyExists( arguments.metaData, "extends" ) ) {
var parentFunctions = _getExtendedFunctionsMeta( arguments.metaData.extends );

for ( var parentFunctionName in parentFunctions ) {
if ( StructKeyExists( extendedFunctions, parentFunctionName ) ) {
var extendedFunc = extendedFunctions[ parentFunctionName ];
var parentFunc = parentFunctions[ parentFunctionName ];

StructAppend( extendedFunc, parentFunc, false );

for ( var parentParam in parentFunc.parameters ) {
var extendedParamIndex = ArrayFind( extendedFunc.parameters, function( param ){
return param.name == parentParam.name;
} );

if ( extendedParamIndex ) {
StructAppend( extendedFunc.parameters[ extendedParamIndex ], parentParam, false )
} else {
ArrayAppend( extendedFunc.parameters, parentParam );
}
}
} else {
extendedFunctions[ parentFunctionName ] = parentFunctions[ parentFunctionName ];
}
}
}

return extendedFunctions;
}

// GETTERS AND SETTERS
private any function _getContextService() {
return _contextService;
Expand Down
1 change: 1 addition & 0 deletions tests/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ web.config
testbox
testresults*.html
.cfconfig.json
server-presidetests.json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a biggy but I don't think this should be in this ticket.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is now removed alongside with the server-presidetests.json file

Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ component extends="resources.HelperObjects.PresideBddTestCase" {
var meta = GetComponentMetadata( cfc );
var dummyDefs = { test=CreateUUId() };

service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( meta.functions[1] ).$results( dummyDefs );
service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( Duplicate( meta.functions[1] ) ).$results( dummyDefs );

var expressions = service.getExpressionsFromCfc( componentPath=cfc, rootPath=rootPath );

Expand Down Expand Up @@ -93,7 +93,7 @@ component extends="resources.HelperObjects.PresideBddTestCase" {
var meta = GetComponentMetadata( cfc );
var dummyDefs = { test=CreateUUId() };

service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( meta.functions[1] ).$results( dummyDefs );
service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( Duplicate( meta.functions[1] ) ).$results( dummyDefs );

var expressions = service.getExpressionsFromCfc( componentPath=cfc, rootPath=rootPath );

Expand All @@ -107,7 +107,7 @@ component extends="resources.HelperObjects.PresideBddTestCase" {
var meta = GetComponentMetadata( cfc );
var dummyDefs = { test=CreateUUId() };

service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( meta.functions[1] ).$results( dummyDefs );
service.$( "getExpressionFieldsFromFunctionDefinition" ).$args( Duplicate( meta.functions[1] ) ).$results( dummyDefs );

var expressions = service.getExpressionsFromCfc( componentPath=cfc, rootPath=rootPath );

Expand Down
Loading