Skip to content

Commit bdb5264

Browse files
committed
perf: only initialize map node nodes on demand
Signed-off-by: Vincent Biret <[email protected]>
1 parent f58aad2 commit bdb5264

File tree

1 file changed

+11
-20
lines changed

1 file changed

+11
-20
lines changed

src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,12 @@ namespace Microsoft.OpenApi.Reader
1818
internal class MapNode : ParseNode, IEnumerable<PropertyNode>
1919
{
2020
private readonly JsonObject _node;
21-
private Dictionary<string, PropertyNode>? _nodes;
2221

23-
private void EnsureNodesIsInitialized()
22+
private PropertyNode GetPropertyNodeFromJsonNode(string key, JsonNode? node)
2423
{
25-
if (_nodes is null)
26-
{
27-
_nodes = _node.Where(p => p.Value is not null).OfType<KeyValuePair<string, JsonNode>>().ToDictionary(p => p.Key, p => new PropertyNode(Context, p.Key, p.Value), StringComparer.Ordinal);
28-
if (_node.Where(p => p.Value is null).ToArray() is { Length: > 0 } nullNodes)
29-
{
30-
_nodes.AddRange(nullNodes.Select(p => new KeyValuePair<string, PropertyNode>(p.Key, new PropertyNode(Context, p.Key, JsonNullSentinel.JsonNull))));
31-
}
32-
}
24+
return node is null ?
25+
new PropertyNode(Context, key, JsonNullSentinel.JsonNull) :
26+
new PropertyNode(Context, key, node);
3327
}
3428

3529
public MapNode(ParsingContext context, JsonNode node) : base(
@@ -47,14 +41,10 @@ public PropertyNode? this[string key]
4741
{
4842
get
4943
{
50-
if (_node.ContainsKey(key))
51-
{
52-
EnsureNodesIsInitialized();
53-
if (_nodes!.TryGetValue(key, out var propertyNode))
54-
{
55-
return propertyNode;
56-
}
57-
}
44+
if (_node.TryGetPropertyValue(key, out var value))
45+
{
46+
return GetPropertyNodeFromJsonNode(key, value);
47+
}
5848

5949
return null;
6050
}
@@ -142,10 +132,11 @@ public override Dictionary<string, HashSet<T>> CreateArrayMap<T>(Func<ValueNode,
142132
return nodes.ToDictionary(kvp => kvp.key, kvp => kvp.values);
143133
}
144134

135+
private List<PropertyNode>? _nodes;
145136
public IEnumerator<PropertyNode> GetEnumerator()
146137
{
147-
EnsureNodesIsInitialized();
148-
return _nodes!.Values.GetEnumerator();
138+
_nodes ??= _node.Select(p => GetPropertyNodeFromJsonNode(p.Key, p.Value)).ToList();
139+
return _nodes.GetEnumerator();
149140
}
150141

151142
IEnumerator IEnumerable.GetEnumerator()

0 commit comments

Comments
 (0)