| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetRunsForCleanup (Number expected_new_runs) remote as owning LibOpt_Runs | 
| { | 
|   Description: 'Get all the runs that are eligible for cleanup.' | 
|   TextBody: | 
|   [* | 
|     // Select all runs eligible for deletion | 
|     // We have chosen not to exclude the runs with `AutoCleanupEnabled` = false. | 
|     // The reason for this is that if we have many runs and the youngest run is not protected, | 
|     // it is still removed by "the maximum number of runs" rule, while it may not if we would | 
|     // have taken `AutoCleanupEnabled` = false into account here. | 
|     // At the bottom of this method we will still filter on `AutoCleanupEnabled`. | 
|     // If you do not agree with this implementation, update `LibOpt_Run.CanAutoCleanUp` to | 
|     // also return false if `AutoCleanupEnabled` = false. | 
|     runs := selectset( this, Run, run, run.CanAutoCleanUp() ); | 
|      | 
|     to_delete := construct( LibOpt_Runs ); | 
|      | 
|     // Clean up according to the runs age | 
|     if( this.IsAutoCleanupRunsOnRunAge() ) | 
|     { | 
|       time := DateTime::Now(); | 
|       to_delete := to_delete.Union( selectset( runs, Elements, run, time - run.FinishedOn() > this.MaxRunAge() ) ); | 
|     } | 
|      | 
|     // Clean up according to the amount of runs | 
|     if( this.IsAutoCleanupRunsOnNrOfRuns() ) | 
|     { | 
|       // Calculate the amount of runs we expect to have after the new runs are created and the current ones up for deletion are deleted. | 
|       run_size := runs.Size() - to_delete.Size() + expected_new_runs; | 
|        | 
|       runs_to_take := maxvalue( 0, run_size - this.MaxNrOfRuns() ); | 
|       to_delete := to_delete.Union( selectsortedset( runs.Difference( to_delete ), Elements, run, true, | 
|                                                      run.FinishedOn(), | 
|                                                      run.RunNr() ).SelectFirst( runs_to_take ) ); | 
|     } | 
|      | 
|     // Filter on the runs that are allowed to be automatically cleaned up | 
|     return selectset( to_delete, Elements, run, run.AutoCleanupEnabled() ); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Extensible' } | 
| } |