/// <summary> /// Asynchronous method for running a batch index creation job against a database /// </summary> /// <param name="progressCallBack">callback method for reporting on the progress of the job</param> /// <returns>A task which returns a completed IndexBuildReport covering all of the indexes found in the assembly</returns> public Task<IndexBuildReport> RunAsync(IndexBuildCommand buildInstructions, Action<IndexBuildResult> progressCallBack) { //Load our indexes var indexes = GetIndexesFromLoadedAssemblies(); var tasks = new List<Task<IndexBuildResult>>(); foreach (var index in indexes) { var indexInstance = (AbstractIndexCreationTask)Activator.CreateInstance(index); tasks.Add(BuildIndexAsync(indexInstance, progressCallBack)); } if (buildInstructions.DropInactiveVersionedIndexes) { var versionedIndexes = GetVersionedIndexesFromLoadedAssemblies(); foreach (var indexType in versionedIndexes) { var index = (AbstractIndexCreationTask)Activator.CreateInstance(indexType); var nonVersionedIndexName = ((IVersionedIndex)index).GetIndexNameWithoutVersion(); var inactiveIndexes = _documentStore.DatabaseCommands .GetStatistics() .Indexes .Where(x => x.Name.StartsWith(nonVersionedIndexName) && x.Name.Equals(index.IndexName) == false ).ToList(); foreach (var indexToDrop in inactiveIndexes) { tasks.Add(DropIndexAsync(indexToDrop.Name, progressCallBack)); } } } return Task.Factory.ContinueWhenAll(tasks.ToArray(), cont => { var buildReport = new IndexBuildReport() { BuildResults = tasks.Select(x => x.Result).ToList() }; return buildReport; }); }
/// <summary> /// Asynchronous method for running a batch index creation job against a database /// </summary> /// <param name="progressCallBack">callback method for reporting on the progress of the job</param> /// <returns>A task which returns a completed IndexBuildReport covering all of the indexes found in the assembly</returns> public Task<IndexBuildReport> RunAsync(Action<IndexBuildResult> progressCallBack) { //Load our indexes var indexes = GetIndexesFromLoadedAssemblies(); var tasks = new List<Task<IndexBuildResult>>(); foreach (var index in indexes) { var indexInstance = (AbstractIndexCreationTask)Activator.CreateInstance(index); tasks.Add(BuildIndexAsync(indexInstance, progressCallBack)); } return Task.Factory.ContinueWhenAll(tasks.ToArray(), cont => { var buildReport = new IndexBuildReport() { BuildResults = tasks.Select(x => x.Result).ToList() }; return buildReport; }); }