public async Task InsertAndGet() { // create tables string runId = RunId.GenerateTestRunId(); StorageManager storageManager = new StorageManager(TestConstants.AzureStorageConnectionString, TableNames.TableType.DiffMetadata, runId); await storageManager.CreateTables(); // create a bogus diff metadata entity DiffMetadataEntity entity = new DiffMetadataEntity() { RunId = runId, RegionId = "abcd", AgencyId = "1234", RecordType = RecordType.Route.ToString(), AddedCount = 50, UpdatedCount = 75, DeletedCount = 1, ResurrectedCount = 5 }; // stick it into store List <DiffMetadataEntity> entities = new List <DiffMetadataEntity>(); entities.Add(entity); await storageManager.DiffMetadataStore.Insert(entities); // get it from the store IEnumerable <DiffMetadataEntity> retrievedEntities1 = storageManager.DiffMetadataStore.Get(runId); // clean up await storageManager.DiffMetadataStore.Delete(runId); // get it from the store again IEnumerable <DiffMetadataEntity> retrievedEntities2 = storageManager.DiffMetadataStore.Get(runId); // check the retrieved records Assert.IsNotNull(retrievedEntities1); Assert.AreEqual(retrievedEntities1.Count(), entities.Count); Assert.IsNull(retrievedEntities2); Assert.AreEqual(entity.RunId, retrievedEntities1.First().RunId); Assert.AreEqual(entity.RegionId, retrievedEntities1.First().RegionId); Assert.AreEqual(entity.AgencyId, retrievedEntities1.First().AgencyId); Assert.AreEqual(entity.RecordType, retrievedEntities1.First().RecordType); Assert.AreEqual(entity.AddedCount, retrievedEntities1.First().AddedCount); Assert.AreEqual(entity.UpdatedCount, retrievedEntities1.First().UpdatedCount); Assert.AreEqual(entity.DeletedCount, retrievedEntities1.First().DeletedCount); Assert.AreEqual(entity.ResurrectedCount, retrievedEntities1.First().ResurrectedCount); }
/// <summary> /// Compares downloaded OBA routes to published OBA routes for a single region and stores a diff /// </summary> /// <param name="downloadedRoutes">list of routes downloaded from OBA servers</param> /// <param name="publishedRoutes">list of routes published to Embedded Social</param> /// <param name="diffStorage">interface to diff data</param> /// <param name="diffMetadataStorage">inteface to diff metadata</param> /// <param name="regionId">uniquely identifies the region</param> /// <param name="agencyId">uniquely identifies the agency</param> /// <param name="runId">uniquely identifies a run of the service</param> /// <returns>task that computes and stores a diff of routes</returns> private static async Task DiffAndStore(IEnumerable <RouteEntity> downloadedRoutes, IEnumerable <RouteEntity> publishedRoutes, StorageManager diffStorage, StorageManager diffMetadataStorage, string regionId, string agencyId, string runId) { // create empty lists of the four different types of changes to be published List <RouteEntity> newRoutes = new List <RouteEntity>(); List <RouteEntity> updatedRoutes = new List <RouteEntity>(); List <RouteEntity> deletedRoutes = new List <RouteEntity>(); List <RouteEntity> resurrectedRoutes = new List <RouteEntity>(); // in the common case, most route information will not change. // so, start by removing those items that are common to both considering their relevant content IEnumerable <RouteEntity> unchangedRoutes = downloadedRoutes.Intersect(publishedRoutes.Where(r => r.RowState != DataRowState.Delete.ToString()), new RouteEqualityComparerByChecksum()); downloadedRoutes = downloadedRoutes.Except(unchangedRoutes, new RouteEqualityComparerById()); publishedRoutes = publishedRoutes.Except(unchangedRoutes, new RouteEqualityComparerById()); // new routes are those in downloadedRoutes but not in publishedRoutes when solely considering route Ids newRoutes = downloadedRoutes.Except(publishedRoutes, new RouteEqualityComparerById()).ToList(); // deleted routes are those in publishedRoutes but not in downloadedRoutes when solely considering routeIds, // and are not already marked as deleted in publishedRoutes deletedRoutes = publishedRoutes.Except(downloadedRoutes, new RouteEqualityComparerById()).Where(r => r.RowState != DataRowState.Delete.ToString()).ToList(); // resurrected routes are those in publishedRoutes that are marked as deleted but are in downloadedRoutes when solely considering routeIds resurrectedRoutes = downloadedRoutes.Intersect(publishedRoutes.Where(r => r.RowState == DataRowState.Delete.ToString()), new RouteEqualityComparerById()).ToList(); // updated routes : first get the routes that are in common by Id that have not been resurrected, // then pick those who's contents are different updatedRoutes = downloadedRoutes.Intersect(publishedRoutes.Where(r => r.RowState != DataRowState.Delete.ToString()), new RouteEqualityComparerById()).ToList(); updatedRoutes = updatedRoutes.Except(publishedRoutes, new RouteEqualityComparerByChecksum()).ToList(); // set the appropriate datarowstate values newRoutes.ForEach(r => r.RowState = DataRowState.Create.ToString()); updatedRoutes.ForEach(r => r.RowState = DataRowState.Update.ToString()); deletedRoutes.ForEach(r => r.RowState = DataRowState.Delete.ToString()); resurrectedRoutes.ForEach(r => r.RowState = DataRowState.Resurrect.ToString()); // write to diff table await diffStorage.RouteStore.Insert(newRoutes); await diffStorage.RouteStore.Insert(updatedRoutes); await diffStorage.RouteStore.Insert(deletedRoutes); await diffStorage.RouteStore.Insert(resurrectedRoutes); // write to metadata table DiffMetadataEntity metadata = new DiffMetadataEntity { RunId = runId, RegionId = regionId, AgencyId = agencyId, RecordType = RecordType.Route.ToString(), AddedCount = newRoutes.Count, UpdatedCount = updatedRoutes.Count, DeletedCount = deletedRoutes.Count, ResurrectedCount = resurrectedRoutes.Count }; await diffMetadataStorage.DiffMetadataStore.Insert(new List <DiffMetadataEntity> { metadata }); }