lazhen
2025-01-09 8afe90b633046db39042aada36b88193062f8cff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Quintiq file version 2.0
#parent: #root
StaticMethod Transform (LibOpt_Task task, LibOpt_ScopeElements from, LibOpt_ScopeElements to)
{
  Description:
  [*
    Update the `LibOpt_Scopes` that contain all elements in the set of `from` and are the input of one of the ancestors of the supplied `LibOpt_Task`, with the set of `to`.
    If one of the `LibOpt_Scopes` contain only a partial subset of `from`, an error will be thrown.
    We strongly advice against using this method, as this makes the execution of the optimizer less transparent.
    However, we realize there are good reasons to do so, for example, when an order is split or two orders are merged, the same needs to happen to the `LibOpt_ScopeElements`.
  *]
  TextBody:
  [*
    to_from := to.Difference( from );
    from_to := from.Difference( to );
    
    safeguard := 5000;
    while( not isnull( task )
           and safeguard > 0 )
    {
      scope := task.Scope();
      from_set := selectvalues( from, Elements, from_elem, true, scope.Contains( from_elem ) ).Unique();
      if( from_set.Size() > 1 )
      {
        // Throw an error when a subset of the from is in the Scope.
        set    := selectvalues( from, Elements, e, true,                       e.Identifier() ).ToString( ', ' );
        subset := selectvalues( from, Elements, e, task.Scope().Contains( e ), e.Identifier() ).ToString( ', ' );
        not_in_scope := selectvalues( from, Elements, e, not task.Scope().Contains( e ), e.Identifier() ).ToString( ', ' );
        error( Translations::LibOpt_ScopeElement_Transform_ScopeContainsSubset( subset, set, not_in_scope ) );
      }
      else if( from_set.Size() = 0 or
               from_set.Element( 0 ) )
      {
        // Add new elements
        scope.Add( to_from );
        
        // Remove elements
        scope.Remove( from_to );
      }
      
      task := task.Parent();
      safeguard--;
    }
  *]
}