using Flee.CalcEngine.InternalTypes; using Flee.InternalTypes; using Flee.PublicTypes; namespace Flee.CalcEngine.PublicTypes { public sealed class BatchLoader { private readonly IDictionary _myNameInfoMap; private readonly DependencyManager _myDependencies; internal BatchLoader() { _myNameInfoMap = new Dictionary(StringComparer.OrdinalIgnoreCase); _myDependencies = new DependencyManager(StringComparer.OrdinalIgnoreCase); } public void Add(string atomName, string expression, ExpressionContext context) { Utility.AssertNotNull(atomName, "atomName"); Utility.AssertNotNull(expression, "expression"); Utility.AssertNotNull(context, "context"); BatchLoadInfo info = new BatchLoadInfo(atomName, expression, context); _myNameInfoMap.Add(atomName, info); _myDependencies.AddTail(atomName); ICollection references = this.GetReferences(expression, context); foreach (string reference in references) { _myDependencies.AddTail(reference); _myDependencies.AddDepedency(reference, atomName); } } public bool Contains(string atomName) { return _myNameInfoMap.ContainsKey(atomName); } internal BatchLoadInfo[] GetBachInfos() { string[] tails = _myDependencies.GetTails(); Queue sources = _myDependencies.GetSources(tails); IList result = _myDependencies.TopologicalSort(sources); BatchLoadInfo[] infos = new BatchLoadInfo[result.Count]; for (int i = 0; i <= result.Count - 1; i++) { infos[i] = _myNameInfoMap[result[i]]; } return infos; } private ICollection GetReferences(string expression, ExpressionContext context) { IdentifierAnalyzer analyzer = context.ParseIdentifiers(expression); return analyzer.GetIdentifiers(context); } } }