Quintiq file version 2.0
|
#parent: #root
|
StaticMethod Send (LibOpt_Task task, Boolean require_finalized) as stream[JSON]
|
{
|
TextBody:
|
[*
|
component := task.Component();
|
|
reactive_calls := LibOpt_CurrentTransaction::GetSpawnedReactiveCalls();
|
result := task.Send();
|
|
// Call DoFinalize if no reactive call has been made.
|
// If there are also no breakpoints or dataset copies on this component, then 'task' is deleted in DoFinalize, without calling any reactive quill. This improves performance.
|
if( reactive_calls = LibOpt_CurrentTransaction::GetSpawnedReactiveCalls() or task.Run().InOneTransaction() )
|
{
|
// When a breakpoint is set on the finalize position of this component or when a dataset copy is set on any position in this component,
|
// then a reactive call will be made (if task.Run().InOneTransaction() = false).
|
// This reactive call implies that reactive_calls = LibOpt_CurrentTransaction::GetSpawnedReactiveCalls() will be false for the component upstream.
|
// The component upstream will therefore not enter this if-block (but instead the else if block will be entered).
|
// That upstream component will therefore wait until the stream of this component has been executed.
|
result := result->Merge( component.DoFinalize( task ) ); // Note: result->Merge() is not actually a reactive call, so it is fine to use it if task.Run().InOneTransaction() = true.
|
}
|
// If there are reactive calls, call DoFinalize only if it is required, so we use fewer transactions.
|
else if( require_finalized )
|
{
|
result := LibOpt_TaskTransporterReactive::AppendFinalize( task, result );
|
}
|
|
return result;
|
*]
|
}
|