CMN_queryProcessAnalyticsRecursively ------------------------------------ Inputs: 1. resultantData (Any Type) 2. report (Document) 3. totalCount (Number Integer) 4. additionalFilters (Any Type) 5. identifierField (Text) Description: This expression returns the resultant dataset by querying a portal report in batches where each batch size is of 10000. Until the completion of iterations, the rule calls itself, typically a recursive approach. resultantData: Initially pass null value to this, this is used across recursive calls to build a datasubset. totalCount: The number of total rows in the report. identifierField: Pass the field name (such as 'c0', 'c1' etc) and this should uniquely identify the row (For instance pp!id in Process report, tp!id in task report) in the report. Definition: if( ri!totalCount<=0, ri!resultantData, with( local!portalReportDataSubset: a!queryProcessAnalytics( report: ri!report, query: a!query( logicalExpression: if( rule!APN_isEmpty(ri!resultantData), if( rule!APN_isEmpty( ri!additionalFilters ), null, a!queryLogicalExpression( operator: "AND", filters: ri!additionalFilters ) ), a!queryLogicalExpression( operator: "AND", filters: { if( rule!APN_isEmpty( ri!additionalFilters ), rule!APN_queryFilter( ri!identifierField, "not in", index(ri!resultantData,ri!identifierField,{}) ), append( ri!additionalFilters, rule!APN_queryFilter( ri!identifierField, "not in", index(ri!resultantData,ri!identifierField,{}) ) ) ) } ) ), pagingInfo: a!pagingInfo( startIndex: 1, batchSize: 10000 ) ) ), rule!CMN_queryProcessAnalyticsRecursively( resultantData: if( local!portalReportDataSubset.totalCount = 0, ri!resultantData, append( ri!resultantData, local!portalReportDataSubset.data ) ), report: ri!report, totalCount: ri!totalCount - 10000 ) ) ) Output: Resultant dataset containing all the rows of portal report irrespective of its size.