/// <summary> /// Builds a set of tasks to perform the load. /// </summary> /// <returns>A sequence of tasks to execute.</returns> private static IEnumerable<ITask> BuildTasks() { List<ITask> tasks = new List<ITask>(); var targetFactory = Program.connectionFactories["target"]; if (Program.Options.FullLoad) { // Clean out the database. var cleanTask = new SequentialTask( "Clean Target Database", new ExecuteSqlTask("Truncate Facts", targetFactory, SqlQueries.TruncateFactsSql), new ExecuteSqlTask("Delete dimension data", targetFactory, SqlQueries.DeleteDimensionData)); tasks.Add(cleanTask); } var dimensionTasks = new List<ITask>(); if (Program.Options.FullLoad) { var currencyLoader = new CurrencyLoader(targetFactory); dimensionTasks.Add(currencyLoader.Build()); var dateLoader = new DateLoader(targetFactory); dimensionTasks.Add(dateLoader.Build()); var productLoader = new ProductLoader(targetFactory); Program.Disposables.Add(productLoader); dimensionTasks.Add(productLoader.Build()); } tasks.Add(new ParallelTask("Load Dimensions", dimensionTasks)); return tasks; }
/// <summary> /// Executes the loader task sequence. /// </summary> /// <remarks> /// Note: This executes the supplied list in sequence. If parallel /// execution is needed then create ParallelTasks in this list. /// </remarks> /// <param name="tasks">A sequence of tasks to execute.</param> /// <returns>A task representing the completion of this function.</returns> private static async Task ExecuteAsync(IEnumerable<ITask> tasks) { var mainTask = new SequentialTask("Main", tasks); var context = new TaskContext(Program.CancellationTokenSource); await mainTask.VerifyAsync(context); await mainTask.ExecuteAsync(context); }