/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. */ using System.IO; using QuantConnect.Logging; using QuantConnect.Interfaces; using QuantConnect.Configuration; using System; namespace QuantConnect.Lean.Engine.DataFeeds { /// /// A data provider that will check the processed data folder first /// public class ProcessedDataProvider : IDataProvider, IDisposable { private readonly DefaultDataProvider _defaultDataProvider; private readonly string _processedDataDirectory; /// /// Ignored /// public event EventHandler NewDataRequest; /// /// Creates a new instance /// public ProcessedDataProvider() { _defaultDataProvider = new(); _processedDataDirectory = Config.Get("processed-data-directory") ?? string.Empty; Log.Trace($"ProcessedDataProvider(): processed data directory to use {_processedDataDirectory}, exists: {Directory.Exists(_processedDataDirectory)}"); } /// /// Retrieves data from disc to be used in an algorithm /// /// A string representing where the data is stored /// A of the data requested public Stream Fetch(string key) { Stream result = null; // we will try the processed data folder first if (_processedDataDirectory.Length != 0 && key.StartsWith(Globals.DataFolder, StringComparison.OrdinalIgnoreCase)) { result = _defaultDataProvider.Fetch(Path.Combine(_processedDataDirectory, key.Remove(0, Globals.DataFolder.Length).TrimStart('/', '\\'))); if (result != null) { Log.Trace($"ProcessedDataProvider.Fetch({key}): fetched from processed data directory"); } } // fall back to existing data folder path return result ?? _defaultDataProvider.Fetch(key); } /// /// Disposes of resources /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// Disposes of the internal data provider /// protected virtual void Dispose(bool disposing) { if (disposing) { _defaultDataProvider.Dispose(); } } } }