Skip to content

Commit 824dda2

Browse files
committed
Extract duplicated GetPrimaryApplicability method to ApplicabilitySelector utility class
- Created new ApplicabilitySelector class in Elastic.Documentation.AppliesTo namespace - Removed duplicated GetPrimaryApplicability method from ApplicabilityRenderer and ApplicableToViewModel - Updated both classes to use the new utility class - Improves code reusability and reduces duplication
1 parent 2a6afcb commit 824dda2

File tree

3 files changed

+62
-83
lines changed

3 files changed

+62
-83
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using Elastic.Documentation.Configuration.Versions;
6+
7+
namespace Elastic.Documentation.AppliesTo;
8+
9+
/// <summary>
10+
/// Utility class for selecting the most relevant applicability from a collection of applicabilities.
11+
/// </summary>
12+
public static class ApplicabilitySelector
13+
{
14+
/// <summary>
15+
/// Selects the most relevant applicability for display: available versions first (highest version), then closest future version
16+
/// </summary>
17+
/// <param name="applicabilities">The collection of applicabilities to select from</param>
18+
/// <param name="versioningSystem">The versioning system to use for comparison</param>
19+
/// <returns>The most relevant applicability for display</returns>
20+
public static Applicability GetPrimaryApplicability(IEnumerable<Applicability> applicabilities, VersioningSystem versioningSystem)
21+
{
22+
var applicabilityList = applicabilities.ToList();
23+
var lifecycleOrder = new Dictionary<ProductLifecycle, int>
24+
{
25+
[ProductLifecycle.GenerallyAvailable] = 0,
26+
[ProductLifecycle.Beta] = 1,
27+
[ProductLifecycle.TechnicalPreview] = 2,
28+
[ProductLifecycle.Planned] = 3,
29+
[ProductLifecycle.Deprecated] = 4,
30+
[ProductLifecycle.Removed] = 5,
31+
[ProductLifecycle.Unavailable] = 6
32+
};
33+
34+
var availableApplicabilities = applicabilityList
35+
.Where(a => a.Version is null || a.Version is AllVersions || a.Version <= versioningSystem.Current)
36+
.ToList();
37+
38+
if (availableApplicabilities.Count != 0)
39+
{
40+
return availableApplicabilities
41+
.OrderByDescending(a => a.Version ?? new SemVersion(0, 0, 0))
42+
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
43+
.First();
44+
}
45+
46+
var futureApplicabilities = applicabilityList
47+
.Where(a => a.Version is not null && a.Version is not AllVersions && a.Version > versioningSystem.Current)
48+
.ToList();
49+
50+
if (futureApplicabilities.Count != 0)
51+
{
52+
return futureApplicabilities
53+
.OrderBy(a => a.Version!.CompareTo(versioningSystem.Current))
54+
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
55+
.First();
56+
}
57+
58+
return applicabilityList.First();
59+
}
60+
}

src/Elastic.Markdown/Myst/Components/ApplicabilityRenderer.cs

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -53,53 +53,14 @@ public ApplicabilityRenderData RenderCombinedApplicability(
5353
AppliesCollection allApplications)
5454
{
5555
var applicabilityList = applicabilities.ToList();
56-
var primaryApplicability = GetPrimaryApplicability(applicabilityList, versioningSystem);
56+
var primaryApplicability = ApplicabilitySelector.GetPrimaryApplicability(applicabilityList, versioningSystem);
5757

5858
var primaryRenderData = RenderApplicability(primaryApplicability, applicabilityDefinition, versioningSystem, allApplications);
5959
var combinedTooltip = BuildCombinedTooltipText(applicabilityList, applicabilityDefinition, versioningSystem);
6060

6161
return primaryRenderData with { TooltipText = combinedTooltip };
6262
}
6363

64-
private static Applicability GetPrimaryApplicability(List<Applicability> applicabilities, VersioningSystem versioningSystem)
65-
{
66-
var lifecycleOrder = new Dictionary<ProductLifecycle, int>
67-
{
68-
[ProductLifecycle.GenerallyAvailable] = 0,
69-
[ProductLifecycle.Beta] = 1,
70-
[ProductLifecycle.TechnicalPreview] = 2,
71-
[ProductLifecycle.Planned] = 3,
72-
[ProductLifecycle.Deprecated] = 4,
73-
[ProductLifecycle.Removed] = 5,
74-
[ProductLifecycle.Unavailable] = 6
75-
};
76-
77-
var availableApplicabilities = applicabilities
78-
.Where(a => a.Version is null || a.Version is AllVersions || a.Version <= versioningSystem.Current)
79-
.ToList();
80-
81-
if (availableApplicabilities.Count != 0)
82-
{
83-
return availableApplicabilities
84-
.OrderByDescending(a => a.Version ?? new SemVersion(0, 0, 0))
85-
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
86-
.First();
87-
}
88-
89-
var futureApplicabilities = applicabilities
90-
.Where(a => a.Version is not null && a.Version is not AllVersions && a.Version > versioningSystem.Current)
91-
.ToList();
92-
93-
if (futureApplicabilities.Count != 0)
94-
{
95-
return futureApplicabilities
96-
.OrderBy(a => a.Version!.CompareTo(versioningSystem.Current))
97-
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
98-
.First();
99-
}
100-
101-
return applicabilities.First();
102-
}
10364

10465
private static string BuildCombinedTooltipText(
10566
List<Applicability> applicabilities,

src/Elastic.Markdown/Myst/Components/ApplicableToViewModel.cs

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ private IEnumerable<ApplicabilityItem> CombineItemsByKey(List<ApplicabilityItem>
148148
new AppliesCollection(allApplicabilities.ToArray()));
149149

150150
// Select the closest version to current as the primary display
151-
var primaryApplicability = GetPrimaryApplicability(allApplicabilities, versioningSystem);
151+
var primaryApplicability = ApplicabilitySelector.GetPrimaryApplicability(allApplicabilities, versioningSystem);
152152

153153
return new ApplicabilityItem(
154154
Key: firstItem.Key,
@@ -159,47 +159,5 @@ private IEnumerable<ApplicabilityItem> CombineItemsByKey(List<ApplicabilityItem>
159159
});
160160

161161

162-
/// <summary>
163-
/// Selects the most relevant applicability for display: available versions first (highest version), then closest future version
164-
/// </summary>
165-
private static Applicability GetPrimaryApplicability(List<Applicability> applicabilities, VersioningSystem versioningSystem)
166-
{
167-
var lifecycleOrder = new Dictionary<ProductLifecycle, int>
168-
{
169-
[ProductLifecycle.GenerallyAvailable] = 0,
170-
[ProductLifecycle.Beta] = 1,
171-
[ProductLifecycle.TechnicalPreview] = 2,
172-
[ProductLifecycle.Planned] = 3,
173-
[ProductLifecycle.Deprecated] = 4,
174-
[ProductLifecycle.Removed] = 5,
175-
[ProductLifecycle.Unavailable] = 6
176-
};
177-
178-
var availableApplicabilities = applicabilities
179-
.Where(a => a.Version is null || a.Version is AllVersions || a.Version <= versioningSystem.Current)
180-
.ToList();
181-
182-
if (availableApplicabilities.Count != 0)
183-
{
184-
return availableApplicabilities
185-
.OrderByDescending(a => a.Version ?? new SemVersion(0, 0, 0))
186-
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
187-
.First();
188-
}
189-
190-
var futureApplicabilities = applicabilities
191-
.Where(a => a.Version is not null && a.Version is not AllVersions && a.Version > versioningSystem.Current)
192-
.ToList();
193-
194-
if (futureApplicabilities.Count != 0)
195-
{
196-
return futureApplicabilities
197-
.OrderBy(a => a.Version!.CompareTo(versioningSystem.Current))
198-
.ThenBy(a => lifecycleOrder.GetValueOrDefault(a.Lifecycle, 999))
199-
.First();
200-
}
201-
202-
return applicabilities.First();
203-
}
204162

205163
}

0 commit comments

Comments
 (0)