using System; using System.Collections.Generic; using System.Linq; using Svrnty.CQRS.Abstractions.Discovery; namespace Svrnty.CQRS.Discovery; public sealed class QueryDiscovery : IQueryDiscovery { private readonly List _queryMetas; private readonly Dictionary _queriesByName; private readonly Dictionary _queriesByType; public QueryDiscovery(IEnumerable queryMetas) { // Materialize the enumerable to a list once _queryMetas = queryMetas.ToList(); // Build lookup dictionaries for O(1) access _queriesByName = new Dictionary(_queryMetas.Count); _queriesByType = new Dictionary(_queryMetas.Count); foreach (var meta in _queryMetas) { _queriesByName[meta.Name] = meta; _queriesByType[meta.QueryType] = meta; } } public IEnumerable GetQueries() => _queryMetas; public IQueryMeta FindQuery(string name) => _queriesByName.TryGetValue(name, out var meta) ? meta : null; public IQueryMeta FindQuery(Type queryType) => _queriesByType.TryGetValue(queryType, out var meta) ? meta : null; public bool QueryExists(string name) => _queriesByName.ContainsKey(name); public bool QueryExists(Type queryType) => _queriesByType.ContainsKey(queryType); }