Skip to content

Commit d4791c5

Browse files
jschick04NikTilton
authored andcommitted
De-duplicate the ordered enabled columns to keep export headers unique
1 parent ff48415 commit d4791c5

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

src/EventLogExpert.Runtime/LogTable/LogTableState.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,19 @@ public IReadOnlyList<ColumnName> GetOrderedEnabledColumns(ILogTableColumnDefault
8383
.ToHashSet();
8484

8585
var order = ColumnOrder.IsEmpty ? columnDefaults.ColumnOrder : ColumnOrder;
86-
var ordered = order.Where(enabledColumns.Contains).ToList();
87-
var present = ordered.ToHashSet();
86+
87+
HashSet<ColumnName> present = [];
88+
List<ColumnName> ordered = [];
89+
90+
// De-duplicate while preserving first occurrence: a persisted ColumnOrder may contain duplicates
91+
// that would otherwise become duplicate export headers (rejected by TabularExportWriter).
92+
foreach (var column in order)
93+
{
94+
if (enabledColumns.Contains(column) && present.Add(column))
95+
{
96+
ordered.Add(column);
97+
}
98+
}
8899

89100
// Append any enabled column missing from the active order (e.g. enabled but absent from a persisted
90101
// ColumnOrder) so it is never silently dropped from the table or an export.

tests/Unit/EventLogExpert.Runtime.Tests/LogTable/LogTableStateExportTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,25 @@ public void GetOrderedEnabledColumns_AppendsEnabledColumnsMissingFromOrder()
3434
Assert.Equal(2, ordered.Count);
3535
}
3636

37+
[Fact]
38+
public void GetOrderedEnabledColumns_DuplicateOrderAndMissingEnabledColumn_DeduplicatesThenAppends()
39+
{
40+
var state = new LogTableState
41+
{
42+
Columns = ImmutableDictionary<ColumnName, bool>.Empty
43+
.Add(ColumnName.Source, true)
44+
.Add(ColumnName.EventId, true),
45+
ColumnOrder = [ColumnName.Source, ColumnName.Source]
46+
};
47+
48+
var ordered = state.GetOrderedEnabledColumns(new ColumnDefaults());
49+
50+
// Source deduplicated to one entry; EventId (enabled, absent from the order) appended from defaults.
51+
Assert.Equal(ColumnName.Source, ordered[0]);
52+
Assert.Contains(ColumnName.EventId, ordered);
53+
Assert.Equal(2, ordered.Count);
54+
}
55+
3756
[Fact]
3857
public void GetOrderedEnabledColumns_FiltersToEnabled_InColumnOrder()
3958
{
@@ -51,4 +70,21 @@ public void GetOrderedEnabledColumns_FiltersToEnabled_InColumnOrder()
5170
ColumnName[] expected = [ColumnName.EventId, ColumnName.Source];
5271
Assert.Equal(expected, ordered);
5372
}
73+
74+
[Fact]
75+
public void GetOrderedEnabledColumns_WithDuplicatesInColumnOrder_DeduplicatesPreservingFirstOccurrence()
76+
{
77+
var state = new LogTableState
78+
{
79+
Columns = ImmutableDictionary<ColumnName, bool>.Empty
80+
.Add(ColumnName.Source, true)
81+
.Add(ColumnName.EventId, true),
82+
ColumnOrder = [ColumnName.Source, ColumnName.EventId, ColumnName.Source]
83+
};
84+
85+
var ordered = state.GetOrderedEnabledColumns(new ColumnDefaults());
86+
87+
ColumnName[] expected = [ColumnName.Source, ColumnName.EventId];
88+
Assert.Equal(expected, ordered);
89+
}
5490
}

0 commit comments

Comments
 (0)