Merge pull request #6341 from elsa-workflows/task/restore-descendants-util

Restore methods for traversing activity execution context hierarchy
This commit is contained in:
Sipke Schoorstra 2025-01-27 16:03:53 +01:00 committed by GitHub
commit a2efe5a941
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -183,20 +183,6 @@ public static partial class ActivityExecutionContextExtensions
return portProperty.GetCustomAttribute<PortAttribute>()?.Name ?? portProperty.Name;
}
/// <summary>
/// Returns a flattened list of the current context's ancestors.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetAncestors(this ActivityExecutionContext context)
{
var current = context.ParentActivityExecutionContext;
while (current != null)
{
yield return current;
current = current.ParentActivityExecutionContext;
}
}
/// <summary>
/// Send a signal up the current hierarchy of ancestors.
/// </summary>
@ -314,6 +300,68 @@ public static partial class ActivityExecutionContextExtensions
return null;
}
/// <summary>
/// Returns a flattened list of the current context's ancestors.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetAncestors(this ActivityExecutionContext context)
{
var current = context.ParentActivityExecutionContext;
while (current != null)
{
yield return current;
current = current.ParentActivityExecutionContext;
}
}
/// <summary>
/// Returns a flattened list of the current context's descendants.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetDescendents(this ActivityExecutionContext context)
{
var children = context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context).ToList();
foreach (var child in children)
{
yield return child;
foreach (var descendent in GetDescendents(child))
yield return descendent;
}
}
/// <summary>
/// Returns a flattened list of the current context's immediate active children.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetActiveChildren(this ActivityExecutionContext context)
{
return context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context);
}
/// <summary>
/// Returns a flattened list of the current context's immediate children.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetChildren(this ActivityExecutionContext context)
{
return context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context);
}
/// <summary>
/// Returns a flattened list of the current context's descendants.
/// </summary>
public static IEnumerable<ActivityExecutionContext> GetDescendants(this ActivityExecutionContext context)
{
var children = context.WorkflowExecutionContext.ActivityExecutionContexts.Where(x => x.ParentActivityExecutionContext == context).ToList();
foreach (var child in children)
{
yield return child;
foreach (var descendant in child.GetDescendants())
yield return descendant;
}
}
internal static bool GetHasEvaluatedProperties(this ActivityExecutionContext context) => context.TransientProperties.TryGetValue<bool>("HasEvaluatedProperties", out var value) && value;
internal static void SetHasEvaluatedProperties(this ActivityExecutionContext context) => context.TransientProperties["HasEvaluatedProperties"] = true;