@@ -151,16 +151,11 @@ await _taskExecutionStatsCollection.UpdateOneAsync(o =>
151151
152152 public async Task < IEnumerable < ExecutionStats > > GetStatsAsync ( DateTime startTime , DateTime endTime , int PageSize = 10 , int PageNumber = 1 , string workflowId = "" , string taskId = "" )
153153 {
154- startTime = startTime . ToUniversalTime ( ) ;
154+ CreateFilter ( startTime , endTime , workflowId , taskId , out var builder , out var filter ) ;
155155
156- var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
157- var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
156+ filter &= builder . Where ( GetExecutedTasksFilter ( ) ) ;
158157
159- var result = await _taskExecutionStatsCollection . Find ( T =>
160- T . StartedUTC >= startTime &&
161- T . StartedUTC <= endTime . ToUniversalTime ( ) &&
162- ( workflowNull || T . WorkflowId == workflowId ) &&
163- ( taskIdNull || T . TaskId == taskId ) )
158+ var result = await _taskExecutionStatsCollection . Find ( filter )
164159 . Limit ( PageSize )
165160 . Skip ( ( PageNumber - 1 ) * PageSize )
166161 . ToListAsync ( ) ;
@@ -222,33 +217,52 @@ public async Task<long> GetStatsStatusCountAsync(DateTime startTime, DateTime en
222217 }
223218
224219 public async Task < long > GetStatsCountAsync ( DateTime startTime , DateTime endTime , Expression < Func < ExecutionStats , bool > > ? statusFilter = null , string workflowId = "" , string taskId = "" )
220+ {
221+ CreateFilter ( startTime , endTime , workflowId , taskId , out var builder , out var filter ) ;
222+
223+ if ( statusFilter is not null )
224+ {
225+ filter &= builder . Where ( statusFilter ) ;
226+ }
227+
228+ return await _taskExecutionStatsCollection . CountDocumentsAsync ( filter ) ;
229+ }
230+
231+ private static void CreateFilter ( DateTime startTime , DateTime endTime , string workflowId , string taskId , out FilterDefinitionBuilder < ExecutionStats > builder , out FilterDefinition < ExecutionStats > filter )
225232 {
226233 var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
227234 var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
228235
229- var builder = Builders < ExecutionStats > . Filter ;
230- var filter = builder . Empty ;
231-
236+ builder = Builders < ExecutionStats > . Filter ;
237+ filter = builder . Empty ;
232238 filter &= builder . Where ( t => t . StartedUTC >= startTime . ToUniversalTime ( ) ) ;
233239 filter &= builder . Where ( t => t . StartedUTC <= endTime . ToUniversalTime ( ) ) ;
234240 filter &= builder . Where ( t => workflowNull || t . WorkflowId == workflowId ) ;
235241 filter &= builder . Where ( t => taskIdNull || t . TaskId == taskId ) ;
236- if ( statusFilter is not null )
237- {
238- filter &= builder . Where ( statusFilter ) ;
239- }
242+ }
240243
241- return await _taskExecutionStatsCollection . CountDocumentsAsync ( filter ) ;
244+ /// <summary>
245+ /// Gets filter for tasks that have ran to completion.
246+ /// </summary>
247+ /// <returns></returns>
248+ public static Expression < Func < ExecutionStats , bool > > GetExecutedTasksFilter ( )
249+ {
250+ var dispatched = TaskExecutionStatus . Dispatched . ToString ( ) ;
251+ var created = TaskExecutionStatus . Created . ToString ( ) ;
252+ var accepted = TaskExecutionStatus . Accepted . ToString ( ) ;
253+
254+ return t => t . Status != dispatched && t . Status != created && t . Status != accepted ;
242255 }
243256
257+
244258 public async Task < long > GetStatsTotalCompleteExecutionsCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
245259 {
246260 var dispatched = TaskExecutionStatus . Dispatched . ToString ( ) ;
247261 var created = TaskExecutionStatus . Created . ToString ( ) ;
248262 var accepted = TaskExecutionStatus . Accepted . ToString ( ) ;
249263 Expression < Func < ExecutionStats , bool > > statusFilter = t => t . Status != dispatched && t . Status != created && t . Status != accepted ;
250264
251- return await GetStatsCountAsync ( startTime , endTime , statusFilter , workflowId , taskId ) ;
265+ return await GetStatsCountAsync ( startTime , endTime , GetExecutedTasksFilter ( ) , workflowId , taskId ) ;
252266 }
253267
254268 public async Task < long > GetStatsStatusSucceededCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
@@ -265,16 +279,11 @@ public async Task<long> GetStatsStatusFailedCountAsync(DateTime startTime, DateT
265279
266280 public async Task < ( double avgTotalExecution , double avgArgoExecution ) > GetAverageStats ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
267281 {
268- var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
269- var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
282+ CreateFilter ( startTime , endTime , workflowId , taskId , out var builder , out var filter ) ;
283+ filter &= builder . Where ( t => t . Status == TaskExecutionStatus . Succeeded . ToString ( ) ) ;
270284
271285 var test = await _taskExecutionStatsCollection . Aggregate ( )
272- . Match ( T =>
273- T . StartedUTC >= startTime . ToUniversalTime ( ) &&
274- T . StartedUTC <= endTime . ToUniversalTime ( ) &&
275- ( workflowNull || T . WorkflowId == workflowId ) &&
276- ( taskIdNull || T . TaskId == taskId ) &&
277- T . Status == TaskExecutionStatus . Succeeded . ToString ( ) )
286+ . Match ( filter )
278287 . Group ( g => new { g . Version } , r => new
279288 {
280289 avgTotalExecution = r . Average ( x => ( x . DurationSeconds ) ) ,
0 commit comments