示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
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);
        }
示例#4
0
        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);
        }
示例#5
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);
        }
示例#6
0
        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);
        }
示例#7
0
        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)));
        }
示例#8
0
        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);
        }
示例#9
0
        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;
            }
        }