/// <summary> /// Seeds the Cosmos DB metadata container. /// </summary> private static async Task SeedDatabase(CosmosDbConnectionString cosmosDbConnectionString, CancellationToken cancellationToken) { // Check if data exists before seeding. var count = 0; var query = new QueryDefinition($"SELECT VALUE COUNT(1) FROM c"); var container = await GetContainerIfExists(MetadataContainerName); var resultSetIterator = container.GetItemQueryIterator <int>(query, requestOptions: new QueryRequestOptions() { MaxItemCount = 1 }); if (resultSetIterator.HasMoreResults) { var result = await resultSetIterator.ReadNextAsync(); if (result.Count > 0) { count = result.FirstOrDefault(); } } if (count == 0) { // Scale up the requested throughput (RU/s) for the metadata container prior to bulk import: WriteLineInColor($"No data currently exists in the {MetadataContainerName} container. Scaling up the container RU/s to 50,000 prior to bulk data insert...", ConsoleColor.Cyan); await ChangeContainerPerformance(container, 50000); WriteLineInColor("Container RU/s adjusted. Generating data to seed database...", ConsoleColor.Cyan); var bulkImporter = new BulkImporter(cosmosDbConnectionString); var vehicles = DataGenerator.GenerateVehicles().ToList(); var consignments = DataGenerator.GenerateConsignments(900).ToList(); var packages = DataGenerator.GeneratePackages(consignments.ToList()).ToList(); var trips = DataGenerator.GenerateTrips(consignments.ToList(), vehicles.ToList()).ToList(); WriteLineInColor("Generated data to seed database. Saving metadata to Cosmos DB...", ConsoleColor.Cyan); // Save vehicles: WriteLineInColor($"Adding {vehicles.Count()} vehicles...", ConsoleColor.Green); await bulkImporter.BulkImport(vehicles, DatabaseName, MetadataContainerName, cancellationToken, 1); // Save consignments: WriteLineInColor($"Adding {consignments.Count()} consignments...", ConsoleColor.Green); await bulkImporter.BulkImport(consignments, DatabaseName, MetadataContainerName, cancellationToken, 1); // Save packages: WriteLineInColor($"Adding {packages.Count()} packages...", ConsoleColor.Green); await bulkImporter.BulkImport(packages, DatabaseName, MetadataContainerName, cancellationToken, 4); // Save trips: WriteLineInColor($"Adding {trips.Count()} trips...", ConsoleColor.Green); await bulkImporter.BulkImport(trips, DatabaseName, MetadataContainerName, cancellationToken, 1); WriteLineInColor("Finished seeding Cosmos DB.", ConsoleColor.Cyan); // Scale down the requested throughput (RU/s) for the metadata container: await ChangeContainerPerformance(container, 15000); } else { WriteLineInColor("\nCosmos DB already contains data. Skipping database seeding step...", ConsoleColor.Yellow); } }
/// <summary> /// Cancels any non-completed trips and consignments. This is called when the user requests /// to generate new trips. There cannot be more than one active or pending trip associated /// with a vehicle at one time. /// </summary> /// <param name="container"></param> /// <returns></returns> private static async Task CancelNonCompletedTripsAndConsignments(Container container, BulkImporter bulkImporter, CancellationToken cancellationToken) { var trips = new List <Trip>(); var consignments = new List <Consignment>(); WriteLineInColor($"\nCanceling incomplete trips and consignments from Cosmos DB.", ConsoleColor.DarkCyan); var query = new QueryDefinition("SELECT * FROM c WHERE c.entityType = @entityType AND (c.status != @status AND c.status != @status2)") .WithParameter("@entityType", WellKnown.EntityTypes.Trip) .WithParameter("@status", WellKnown.Status.Completed) .WithParameter("@status2", WellKnown.Status.Canceled); var tripResults = container.GetItemQueryIterator <Trip>(query); while (tripResults.HasMoreResults) { foreach (var trip in await tripResults.ReadNextAsync(cancellationToken)) { trip.status = WellKnown.Status.Canceled; trips.Add(trip); } } query = new QueryDefinition("SELECT * FROM c WHERE c.entityType = @entityType AND (c.status != @status AND c.status != @status2)") .WithParameter("@entityType", WellKnown.EntityTypes.Consignment) .WithParameter("@status", WellKnown.Status.Completed) .WithParameter("@status2", WellKnown.Status.Canceled); var consignmentResults = container.GetItemQueryIterator <Consignment>(query); while (consignmentResults.HasMoreResults) { foreach (var consignment in await consignmentResults.ReadNextAsync(cancellationToken)) { consignment.status = WellKnown.Status.Canceled; consignments.Add(consignment); } } // Bulk update trips. await bulkImporter.BulkImport(trips, DatabaseName, MetadataContainerName, cancellationToken, 1); // Bulk update consignments. await bulkImporter.BulkImport(consignments, DatabaseName, MetadataContainerName, cancellationToken, 1); }