public void CSVExportHelper_MultiMachines() { var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); // Due to site\machineList and events\machineList being different entities // the first created on machine create, the 2nd the first time events are accessed // For this test we need to create both machines before accessing any events. // This is ok, because in reality, when a machine is added, it generates a machineChangedEvent, // which will re-create the event\machineList with the new machine. var machine1 = siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var machine2 = siteModel.Machines.CreateNew("Test Machine 2", "", MachineType.CarryAllScraper, DeviceTypeEnum.SNM941, false, Guid.NewGuid()); var startTime1 = DateTime.UtcNow.AddHours(-5); var endTime1 = startTime1.AddHours(4.5); siteModel.MachinesTargetValues[machine1.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startTime1, ProductionEventType.StartEvent); siteModel.MachinesTargetValues[machine1.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endTime1, ProductionEventType.EndEvent); var startTime2 = DateTime.UtcNow.AddHours(-7); var endTime2 = startTime2.AddHours(2); siteModel.MachinesTargetValues[machine2.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startTime2, ProductionEventType.StartEvent); siteModel.MachinesTargetValues[machine2.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endTime2, ProductionEventType.EndEvent); var startEndDate = CSVExportHelper.GetDateRange(siteModel, null); startEndDate.startUtc.Should().Be(startTime2); startEndDate.endUtc.Should().Be(endTime1); }
public void CSVExportHelper_MachineNamesMulti_NoneAvailable() { var machineNames = new[] { "Test Machine 4", "Test Machine 0" }; var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); var mappedMachines = CSVExportHelper.MapRequestedMachines(siteModel, machineNames); mappedMachines.Count.Should().Be(0); }
public void CSVExportHelper_MachineHasNoEvents() { var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var startEndDate = CSVExportHelper.GetDateRange(siteModel, null); startEndDate.startUtc.Should().Be(Consts.MAX_DATETIME_AS_UTC); startEndDate.endUtc.Should().Be(Consts.MIN_DATETIME_AS_UTC); }
public void CSVExportHelper_MachineNamesMulti_NoneRequested() { var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); siteModel.Machines.CreateNew("Test Machine 2", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); siteModel.Machines.CreateNew("Test Machine 3", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var mappedMachines = CSVExportHelper.MapRequestedMachines(siteModel, null); mappedMachines.Count.Should().Be(0); }
public void CSVExportHelper_MachineNames_Success() { var machineNames = new[] { "Test Machine 1" }; var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); var machine1 = siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var mappedMachines = CSVExportHelper.MapRequestedMachines(siteModel, machineNames); mappedMachines.Count.Should().Be(1); mappedMachines[machine1.InternalSiteModelMachineIndex].Uid.Should().Be(machine1.ID); mappedMachines[machine1.InternalSiteModelMachineIndex].InternalSiteModelMachineIndex.Should().Be(machine1.InternalSiteModelMachineIndex); mappedMachines[machine1.InternalSiteModelMachineIndex].Name.Should().Be(machine1.Name); }
public void CSVExportHelper_StartEndDate() { var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); var machine = siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var startTime = DateTime.UtcNow.AddHours(-5); var endTime = startTime.AddHours(2); siteModel.MachinesTargetValues[machine.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startTime, ProductionEventType.StartEvent); siteModel.MachinesTargetValues[machine.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endTime, ProductionEventType.EndEvent); var startEndDate = CSVExportHelper.GetDateRange(siteModel, null); startEndDate.startUtc.Should().Be(startTime); startEndDate.endUtc.Should().Be(endTime); }
protected override async Task <ContractExecutionResult> ProcessAsyncEx <T>(T item) { var request = CastRequestObjectTo <CompactionCSVExportRequest>(item); var siteModel = GetSiteModel(request.ProjectUid); if (request.CoordType == CoordType.LatLon && siteModel.CSIBLoaded == false) { log.LogError($"#Out# CSVExportExecutor. CoordinateType of LatLong requested, but CSIB not found : Project: {request.ProjectUid} Filename: {request.FileName}"); throw CreateServiceException <CSVExportExecutor> (HttpStatusCode.InternalServerError, ContractExecutionStatesEnum.InternalProcessingError, RequestErrorStatus.ExportInvalidCSIB); } var filter = ConvertFilter(request.Filter, siteModel); var startEndDate = CSVExportHelper.GetDateRange(siteModel, request.Filter); filter.AttributeFilter.StartTime = startEndDate.Item1; filter.AttributeFilter.EndTime = startEndDate.Item2; var tRexRequest = new CSVExportRequest(); var csvExportRequestArgument = AutoMapperUtility.Automapper.Map <CSVExportRequestArgument>(request); csvExportRequestArgument.MappedMachines = CSVExportHelper.MapRequestedMachines(siteModel, request.MachineNames); csvExportRequestArgument.Filters = new FilterSet(filter); var response = await tRexRequest.ExecuteAsync(csvExportRequestArgument); if (response == null || response.ResultStatus != RequestErrorStatus.OK) { log.LogError($"CSVExportExecutor unable to process request. Project: {request.ProjectUid} Filename: {request.FileName} Response: {response?.ResultStatus.ToString()}"); throw CreateServiceException <CSVExportExecutor> (HttpStatusCode.InternalServerError, ContractExecutionStatesEnum.InternalProcessingError, response?.ResultStatus ?? RequestErrorStatus.FailedToConfigureInternalPipeline); } var s3FileTransfer = new S3FileTransfer(TransferProxyType.Temporary); return(new CompactionExportResult(s3FileTransfer.GeneratePreSignedUrl(response.fileName))); }
public void CSVExportHelper_DateRangeFromFilter() { var filter = new Productivity3D.Filter.Abstractions.Models.Filter( DateTime.SpecifyKind(new DateTime(2019, 1, 10), DateTimeKind.Utc), null, "", "", new List <MachineDetails>(), null, null, null, null, null, null ); var filterResult = new FilterResult(null, filter, null, null, null, null, null, null, null); var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(DITagFileFixture.NewSiteModelGuid, true); var machine = siteModel.Machines.CreateNew("Test Machine 1", "", MachineType.Dozer, DeviceTypeEnum.SNM940, false, Guid.NewGuid()); var startTime = DateTime.UtcNow.AddHours(-5); var endTime = startTime.AddHours(2); siteModel.MachinesTargetValues[machine.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startTime, ProductionEventType.StartEvent); siteModel.MachinesTargetValues[machine.InternalSiteModelMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endTime, ProductionEventType.EndEvent); var startEndDate = CSVExportHelper.GetDateRange(siteModel, filterResult); filter.StartUtc.Should().NotBeNull(); startEndDate.startUtc.Should().Be(filter.StartUtc.Value); startEndDate.endUtc.Should().Be(endTime); }
public HttpResponseMessage Get([FromUri] string leagueName, [FromUri] string culture = null) { try { logger.Info($"Get alltime CSV for league: {leagueName}"); CheckLeagueRole(User, leagueName); CultureInfo cultureInfo = null; if (string.IsNullOrEmpty(culture) == false) { cultureInfo = CultureInfo.GetCultureInfo(culture); } if (culture == null) { cultureInfo = CultureInfo.InvariantCulture; } var stream = new MemoryStream(); var exportHelper = new CSVExportHelper() { Delimiter = '\t', UseAttributeNames = true, Culture = cultureInfo }; // get statistics data from data provider var databaseName = GetDatabaseNameFromLeagueName(leagueName); var csvStatisticRows = new List <StatisticRowCSV>(); using (var dbContext = CreateDbContext(databaseName)) { // quick and dirty db access | hardcoded ids! var leagueSetId = 3; var heSetId = 7; var mapper = new DTOMapper(dbContext); dbContext.Configuration.LazyLoadingEnabled = false; // preload data from db var leagueSet = dbContext.Set <LeagueStatisticSetEntity>() .Where(x => x.Id == leagueSetId) .Include(x => x.StatisticSets) .FirstOrDefault(); var heSet = dbContext.Set <LeagueStatisticSetEntity>() .Where(x => x.Id == heSetId) .Include(x => x.StatisticSets) .FirstOrDefault(); var statisticSetIds = dbContext.Set <StatisticSetEntity>().Local.Select(x => x.Id); // driver statistic rows dbContext.Set <DriverStatisticRowEntity>() .Where(x => statisticSetIds.Contains(x.StatisticSetId)) .Include(x => x.Member.Team) .Load(); var seasonIds = leagueSet.StatisticSets .Concat(heSet.StatisticSets) .OfType <SeasonStatisticSetEntity>() .Select(x => x.SeasonId); dbContext.ChangeTracker.DetectChanges(); foreach (var row in leagueSet.DriverStatistic) { var csvRow = new StatisticRowCSV(); mapper.MapToDriverStatisticRowDTO(row, csvRow); var heRow = heSet.DriverStatistic.SingleOrDefault(x => x.MemberId == row.MemberId); if (heRow != null) { csvRow.HeTitles = heRow.Titles; } csvRow.Name = row.Member.Fullname; csvRow.IRacingId = row.Member.IRacingId; csvRow.TeamName = row.Member.Team?.Name; csvStatisticRows.Add(csvRow); } // check for last champions var lastChamp = leagueSet.StatisticSets .OfType <SeasonStatisticSetEntity>() .Where(x => x.IsSeasonFinished) .OrderBy(x => x.EndDate) .LastOrDefault()?.DriverStatistic .Where(x => x.CurrentSeasonPosition > 0) .OrderBy(x => x.CurrentSeasonPosition) .FirstOrDefault()?.Member; var lastHeChamp = heSet.StatisticSets .OfType <SeasonStatisticSetEntity>() .Where(x => x.IsSeasonFinished) .OrderBy(x => x.EndDate) .LastOrDefault()?.DriverStatistic .Where(x => x.CurrentSeasonPosition > 0) .OrderBy(x => x.CurrentSeasonPosition) .FirstOrDefault()?.Member; if (csvStatisticRows.Any(x => x.MemberId == lastChamp.MemberId)) { csvStatisticRows.Single(x => x.MemberId == lastChamp.MemberId).IsCurrentChamp = true; } if (csvStatisticRows.Any(x => x.MemberId == lastHeChamp.MemberId)) { csvStatisticRows.Single(x => x.MemberId == lastHeChamp.MemberId).IsCurrentHeChamp = true; } } foreach (var row in csvStatisticRows) { // calculate driver rating var rating = CalcDriverRank(row); row.DriverRank = rating.ToString(); row.RankValue = (int)rating.GetValueOrDefault(); // calculate fair play rating row.FairPlayRating = CalculateFairplayRating(row); } exportHelper.WriteToStream(stream, csvStatisticRows); string filename = "AllTimeStats.csv"; var result = new HttpResponseMessage(System.Net.HttpStatusCode.OK); stream.Position = 0; result.Content = new StreamContent(stream); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = filename; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentLength = stream.Length; logger.Info($"Send data - ${filename}"); return(result); } catch (Exception e) { logger.Error("Error in get Statistic CSV", e); throw e; } }