| Quintiq file version 2.0 | 
| #parent: #root | 
| Method PostHandleResult ( | 
|   LibOpt_Task task, | 
|   RealVector kpi_pre | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     snapshot := this.LogKPI( task, Translations::LibOpt_SnapshotKPI_CommentPostHandleResult() ); | 
|      | 
|     if( isnull( this.RollbackKPI() ) ) | 
|     { | 
|       // Throw a warning if it has not been thrown before in this snapshot. | 
|       if( not isnull( kpi_pre ) ) | 
|       { | 
|         LibOpt_SnapshotWarning::Throw( task, Translations::LibOpt_Suboptimizer_NoRollbackKPI(), LibOpt_Issue::Severity_4_High() ); | 
|       } | 
|     } | 
|     else | 
|     { | 
|       kpi_post := this.RollbackKPI().GetKPI( task ); | 
|       should_rollback := this.ShouldRollback( kpi_pre, kpi_post ); | 
|          | 
|       if( should_rollback ) | 
|       { | 
|         // We copy the dataset after creating the post handle result snapshot, but before setting the snapshot.IsRolledBack() attribute to true.  | 
|         // This is to clearly indicate in the client that the data in the copied dataset is not rolled back. | 
|         LibOpt_DatasetCopyConditional::CopyDatasetConditionally( LibOpt_Suboptimizer::ComponentPosition_Rollback(), task, true );   | 
|       } | 
|        | 
|       // Store rollback KPI difference | 
|       if( task.Run().HasSnapshots() ) | 
|       { | 
|         LibOpt_SnapshotSuboptimizer::Create( task.Run(), kpi_pre, kpi_post, this.RollbackKPI(), should_rollback ); | 
|       } | 
|        | 
|       if( should_rollback ) | 
|       { | 
|         if( not isnull( snapshot ) ) | 
|         { | 
|           snapshot.IsRolledBack( true ); | 
|         } | 
|         this.Rollback( kpi_pre, kpi_post, task ); | 
|       } | 
|     } | 
|   *] | 
| } |