Recursition problem

This commit is contained in:
Mike Phares 2024-11-13 16:20:12 -07:00
parent 0505330ac5
commit 7e38c565f3
3 changed files with 96 additions and 60 deletions

View File

@ -214,16 +214,22 @@ public class ProcessData : IProcessData
results.Add(string.Empty); results.Add(string.Empty);
results.Add($"## {record.WorkItem.Title}"); results.Add($"## {record.WorkItem.Title}");
results.Add(string.Empty); results.Add(string.Empty);
if (record.Children is not null)
{
foreach (Record r in record.Children) foreach (Record r in record.Children)
results.Add($"- [{r.WorkItem.Id}]({url}{r.WorkItem.Id})"); results.Add($"- [{r.WorkItem.Id}]({url}{r.WorkItem.Id})");
}
results.Add(string.Empty); results.Add(string.Empty);
results.Add("```bash"); results.Add("```bash");
if (record.Children is not null)
{
foreach (Record r in record.Children) foreach (Record r in record.Children)
{ {
link = Path.Combine(jsonDirectory, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}"); link = Path.Combine(jsonDirectory, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}");
target = Path.Combine(iterationPathDirectory, r.WorkItem.WorkItemType, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}", r.WorkItem.Id.ToString()); target = Path.Combine(iterationPathDirectory, r.WorkItem.WorkItemType, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}", r.WorkItem.Id.ToString());
results.Add($"mklink /J \"{link}\" \"{target}\""); results.Add($"mklink /J \"{link}\" \"{target}\"");
} }
}
results.Add("```"); results.Add("```");
results.Add(string.Empty); results.Add(string.Empty);
return string.Join(Environment.NewLine, results); return string.Join(Environment.NewLine, results);
@ -236,6 +242,8 @@ public class ProcessData : IProcessData
string directory; string directory;
Record? childRecord; Record? childRecord;
ReadOnlyCollection<string> childrenDirectories; ReadOnlyCollection<string> childrenDirectories;
if (record.Children is not null)
{
foreach (Record r in record.Children) foreach (Record r in record.Children)
{ {
// if (record.WorkItem.Id == 110730) // if (record.WorkItem.Id == 110730)
@ -251,6 +259,7 @@ public class ProcessData : IProcessData
childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord); childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord);
results.AddRange(childrenDirectories); results.AddRange(childrenDirectories);
} }
}
return new(results); return new(results);
} }

View File

@ -261,7 +261,7 @@ public class ProcessData : IProcessData
results.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}"); results.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}");
results.Add(string.Empty); results.Add(string.Empty);
results.Add($"- [{record.WorkItem.Id}]({url}{record.WorkItem.Id})"); results.Add($"- [{record.WorkItem.Id}]({url}{record.WorkItem.Id})");
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
results.Add(string.Empty); results.Add(string.Empty);
else else
{ {
@ -300,6 +300,8 @@ public class ProcessData : IProcessData
string line; string line;
spaces.Add('\t'); spaces.Add('\t');
WorkItem workItem; WorkItem workItem;
if (record.Children is not null)
{
foreach (Record child in record.Children) foreach (Record child in record.Children)
{ {
workItem = child.WorkItem; workItem = child.WorkItem;
@ -307,6 +309,7 @@ public class ProcessData : IProcessData
lines.Add(line); lines.Add(line);
AppendLines(spaces, lines, child, condensed, sprintOnly); AppendLines(spaces, lines, child, condensed, sprintOnly);
} }
}
spaces.RemoveAt(0); spaces.RemoveAt(0);
} }
@ -357,6 +360,8 @@ public class ProcessData : IProcessData
workItem.State != "Closed" ? "[ ]" : "[x]"; workItem.State != "Closed" ? "[ ]" : "[x]";
private static void FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record, List<Record> results) private static void FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record, List<Record> results)
{
if (record.Children is not null)
{ {
foreach (Record r in record.Children) foreach (Record r in record.Children)
{ {
@ -366,6 +371,7 @@ public class ProcessData : IProcessData
FilterChildren(workItemTypes, r, results); FilterChildren(workItemTypes, r, results);
} }
} }
}
private static ReadOnlyCollection<Record> FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record) private static ReadOnlyCollection<Record> FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record)
{ {
@ -414,7 +420,7 @@ public class ProcessData : IProcessData
if (record.WorkItem.WorkItemType != workItemType) if (record.WorkItem.WorkItemType != workItemType)
continue; continue;
collection.Clear(); collection.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
records = FilterChildren(workItemTypes, record); records = FilterChildren(workItemTypes, record);
maxIterationPath = GetMaxIterationPath122508(records); maxIterationPath = GetMaxIterationPath122508(records);
@ -462,7 +468,7 @@ public class ProcessData : IProcessData
continue; continue;
collection.Clear(); collection.Clear();
violations.Clear(); violations.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
if (string.IsNullOrEmpty(record.WorkItem.Tags)) if (string.IsNullOrEmpty(record.WorkItem.Tags))
recordsNotMatching = new(new Record[] { record }); recordsNotMatching = new(new Record[] { record });
@ -521,7 +527,7 @@ public class ProcessData : IProcessData
continue; continue;
collection.Clear(); collection.Clear();
violations.Clear(); violations.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
records = FilterChildren(workItemTypes, record); records = FilterChildren(workItemTypes, record);
recordsNotMatching = GetWorkItemsNotMatching126169(record, records); recordsNotMatching = GetWorkItemsNotMatching126169(record, records);
@ -653,7 +659,7 @@ public class ProcessData : IProcessData
continue; continue;
collection.Clear(); collection.Clear();
violations.Clear(); violations.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
records = FilterChildren(workItemTypes, record); records = FilterChildren(workItemTypes, record);
recordsNotMatching = GetWorkItemsNotMatching123066(record, records); recordsNotMatching = GetWorkItemsNotMatching123066(record, records);
@ -691,7 +697,7 @@ public class ProcessData : IProcessData
continue; continue;
collection.Clear(); collection.Clear();
violations.Clear(); violations.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
records = FilterChildren(workItemTypes, record); records = FilterChildren(workItemTypes, record);
recordsNotMatching = GetWorkItemsNotMatching123067(record, records); recordsNotMatching = GetWorkItemsNotMatching123067(record, records);
@ -729,7 +735,7 @@ public class ProcessData : IProcessData
continue; continue;
collection.Clear(); collection.Clear();
violations.Clear(); violations.Clear();
if (record.Children.Length == 0) if (record.Children is null || record.Children.Length == 0)
continue; continue;
if (record.WorkItem.StartDate is null) if (record.WorkItem.StartDate is null)
continue; continue;

View File

@ -12,7 +12,7 @@ internal class Record
#nullable enable #nullable enable
[JsonConstructor] [JsonConstructor]
public Record(WorkItem workItem, WorkItem? parent, Record[] children, Record[] related, Record[] successors) public Record(WorkItem workItem, WorkItem? parent, Record[]? children, Record[]? related, Record[]? successors)
{ {
WorkItem = workItem; WorkItem = workItem;
Parent = parent; Parent = parent;
@ -23,9 +23,9 @@ internal class Record
[JsonPropertyName("WorkItem")] public WorkItem WorkItem { get; set; } [JsonPropertyName("WorkItem")] public WorkItem WorkItem { get; set; }
[JsonPropertyName("Parent")] public WorkItem? Parent { get; set; } [JsonPropertyName("Parent")] public WorkItem? Parent { get; set; }
[JsonPropertyName("Children")] public Record[] Children { get; set; } [JsonPropertyName("Children")] public Record[]? Children { get; set; }
[JsonPropertyName("Related")] public Record[] Related { get; set; } [JsonPropertyName("Related")] public Record[]? Related { get; set; }
[JsonPropertyName("Successors")] public Record[] Successors { get; set; } [JsonPropertyName("Successors")] public Record[]? Successors { get; set; }
internal static Record GetWithoutNesting(Record record, string? violation) internal static Record GetWithoutNesting(Record record, string? violation)
{ {
@ -65,25 +65,47 @@ internal class Record
private static Record Get(Record record, bool keepRelations) private static Record Get(Record record, bool keepRelations)
{ {
Record result; Record result;
Record[]? childRecords;
Record[]? relatedRecords;
Record[]? successorRecords;
List<Record> relationRecords;
WorkItem? parentWorkItem = keepRelations ? record.Parent : WorkItem.GetWithOutRelations(record.Parent); WorkItem? parentWorkItem = keepRelations ? record.Parent : WorkItem.GetWithOutRelations(record.Parent);
WorkItem? workItem = keepRelations ? record.WorkItem : WorkItem.GetWithOutRelations(record.WorkItem) ?? throw new Exception(); WorkItem? workItem = keepRelations ? record.WorkItem : WorkItem.GetWithOutRelations(record.WorkItem) ?? throw new Exception();
List<Record> childRecords = new(); if (record.Children is null)
List<Record> relatedRecords = new(); childRecords = null;
List<Record> successorRecords = new(); else
{
relationRecords = new();
foreach (Record r in record.Children) foreach (Record r in record.Children)
childRecords.Add(Get(r, keepRelations)); relationRecords.Add(Get(r, keepRelations));
childRecords = relationRecords.ToArray();
}
if (record.Related is null)
relatedRecords = null;
else
{
relationRecords = new();
foreach (Record r in record.Related) foreach (Record r in record.Related)
relatedRecords.Add(Get(r, keepRelations)); relationRecords.Add(Get(r, keepRelations));
relatedRecords = relationRecords.ToArray();
}
if (record.Successors is null)
successorRecords = null;
else
{
relationRecords = new();
foreach (Record r in record.Successors) foreach (Record r in record.Successors)
successorRecords.Add(Get(r, keepRelations)); relationRecords.Add(Get(r, keepRelations));
result = new(workItem, parentWorkItem, childRecords.ToArray(), relatedRecords.ToArray(), successorRecords.ToArray()); successorRecords = relationRecords.ToArray();
}
result = new(workItem, parentWorkItem, childRecords, relatedRecords, successorRecords);
return result; return result;
} }
internal static Record Get(WorkItem workItem, WorkItem? parent, ReadOnlyCollection<Record> children, ReadOnlyCollection<Record> related, ReadOnlyCollection<Record> successors, bool keepRelations) internal static Record Get(WorkItem workItem, WorkItem? parent, ReadOnlyCollection<Record>? children, ReadOnlyCollection<Record>? related, ReadOnlyCollection<Record>? successors, bool keepRelations)
{ {
Record result; Record result;
Record record = new(workItem, parent, children.ToArray(), related.ToArray(), successors.ToArray()); Record record = new(workItem, parent, children?.ToArray(), related?.ToArray(), successors?.ToArray());
result = Get(record, keepRelations); result = Get(record, keepRelations);
return result; return result;
} }
@ -96,9 +118,9 @@ internal class Record
WorkItem? parentWorkItem; WorkItem? parentWorkItem;
WorkItem? relationWorkItem; WorkItem? relationWorkItem;
List<WorkItem> collection = new(); List<WorkItem> collection = new();
ReadOnlyCollection<Record> childRecords; ReadOnlyCollection<Record>? childRecords;
ReadOnlyCollection<Record> relatedRecords; ReadOnlyCollection<Record>? relatedRecords;
ReadOnlyCollection<Record> successorRecords; ReadOnlyCollection<Record>? successorRecords;
if (workItem.Relations is not null && workItem.Relations.Length > 0) if (workItem.Relations is not null && workItem.Relations.Length > 0)
{ {
collection.Clear(); collection.Clear();
@ -115,17 +137,16 @@ internal class Record
collection = (from l in collection orderby l.State != "Closed", l.Id select l).ToList(); collection = (from l in collection orderby l.State != "Closed", l.Id select l).ToList();
foreach (WorkItem w in collection) foreach (WorkItem w in collection)
{ {
if (nests.Count > 99) if (nests.Count > 500)
break; break;
if (w.Parent is null) if (w.Parent is null)
parentWorkItem = null; parentWorkItem = null;
else else
_ = keyValuePairs.TryGetValue(w.Parent.Value, out parentWorkItem); _ = keyValuePairs.TryGetValue(w.Parent.Value, out parentWorkItem);
childRecords = GetKeyValuePairs(keyValuePairs, w, "Child", nests, keepRelations); // Forward childRecords = GetKeyValuePairs(keyValuePairs, w, "Child", nests, keepRelations); // Forward
// successorRecords = GetKeyValuePairs(keyValuePairs, w, "Successor", nests); // Forward relatedRecords = null; // GetKeyValuePairs(keyValuePairs, w, "Related", nests, keepRelations); // Related
successorRecords = new(Array.Empty<Record>()); successorRecords = null; // GetKeyValuePairs(keyValuePairs, w, "Successor", nests, keepRelations); // Forward
// predecessorRecords = GetKeyValuePairs(keyValuePairs, w, "Predecessor", nests); // Reverse // predecessorRecords = GetKeyValuePairs(keyValuePairs, w, "Predecessor", nests, keepRelations); // Reverse
relatedRecords = GetKeyValuePairs(keyValuePairs, w, "Related", nests, keepRelations); // Related
record = Get(w, parentWorkItem, childRecords, relatedRecords, successorRecords, keepRelations); record = Get(w, parentWorkItem, childRecords, relatedRecords, successorRecords, keepRelations);
results.Add(record); results.Add(record);
} }