Пример #1
0
        public async Task Test_CellPassesRequest_NoLiftAnalysisOrFilter()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var baseTime  = DateTime.UtcNow;
            var siteModel = BuildModelForSingleCellLiftAnalysis(baseTime);

            var request  = new CellPassesRequest_ClusterCompute();
            var arg      = CreateRequestArgument(siteModel);
            var response = await request.ExecuteAsync(arg, new SubGridSpatialAffinityKey(SubGridSpatialAffinityKey.DEFAULT_SPATIAL_AFFINITY_VERSION_NUMBER_TICKS, arg.ProjectID, arg.OTGCellX, arg.OTGCellY));

            //No lift analysis means the cell passes should be treated as one layer
            response.Should().NotBeNull();
            response.ReturnCode.Should().Be(CellPassesReturnCode.DataFound);
            response.CellPasses.Count.Should().Be(10);

            for (var idx = 0; idx < 10; idx++)
            {
                var mockModifier   = idx + 1;
                var expectedTime   = baseTime.AddMinutes(mockModifier);
                var expectedHeight = 1.0f + mockModifier * 0.5f;
                var expectedCcv    = (short)(10 + 10 * mockModifier);

                var cellPass = response.CellPasses[idx];
                cellPass.LastPassValidCCV.Should().Be(expectedCcv);
                cellPass.LastPassTime.Should().Be(expectedTime);
                cellPass.Height.Should().Be(expectedHeight);
                cellPass.LayersCount.Should().Be(1);
            }
        }
Пример #2
0
        public async Task <CellPassesResponse> ExecuteAsync(CellPassesRequestArgument_ApplicationService arg)
        {
            var result = new CellPassesResponse()
            {
                ReturnCode = CellPassesReturnCode.Error
            };

            if (arg.Filters?.Filters != null && arg.Filters.Filters.Length > 0)
            {
                // Prepare the filters for use in cell passes operations. Failure to prepare any filter results in this request terminating
                if (!arg.Filters.Filters.Select(x => FilterUtilities.PrepareFilterForUse(x, arg.ProjectID)).All(x => x == RequestErrorStatus.OK))
                {
                    return(new CellPassesResponse {
                        ReturnCode = CellPassesReturnCode.FailedToPrepareFilter
                    });
                }
            }

            var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(arg.ProjectID);

            if (siteModel == null)
            {
                _log.LogError($"Failed to locate site model {arg.ProjectID}");
                return(result);
            }

            if (!arg.CoordsAreGrid)
            {
                //WGS84 coords need to be converted to NEE
                var pointToConvert = new XYZ(arg.Point.X, arg.Point.Y, 0);
                arg.Point       = DIContext.Obtain <ICoreXWrapper>().LLHToNEE(siteModel.CSIB(), pointToConvert.ToCoreX_XYZ(), CoreX.Types.InputAs.Radians).ToTRex_XYZ();
                result.Northing = arg.Point.Y;
                result.Easting  = arg.Point.X;
            }

            var existenceMap = siteModel.ExistenceMap;

            // Determine the on-the-ground cell
            siteModel.Grid.CalculateIndexOfCellContainingPosition(arg.Point.X,
                                                                  arg.Point.Y,
                                                                  out var otgCellX,
                                                                  out var otgCellY);

            if (!existenceMap[otgCellX >> SubGridTreeConsts.SubGridIndexBitsPerLevel, otgCellY >> SubGridTreeConsts.SubGridIndexBitsPerLevel])
            {
                result.ReturnCode = CellPassesReturnCode.NoDataFound;
                return(result);
            }

            var computeArg      = new CellPassesRequestArgument_ClusterCompute(arg.ProjectID, arg.Point, otgCellX, otgCellY, arg.Filters);
            var requestCompute  = new CellPassesRequest_ClusterCompute();
            var affinityKey     = new SubGridSpatialAffinityKey(SubGridSpatialAffinityKey.DEFAULT_SPATIAL_AFFINITY_VERSION_NUMBER_TICKS, arg.ProjectID, otgCellX, otgCellY);
            var responseCompute = await requestCompute.ExecuteAsync(computeArg, affinityKey);

            result.ReturnCode = responseCompute.ReturnCode;
            result.CellPasses = responseCompute.CellPasses;

            return(result);
        }
Пример #3
0
        public async Task Test_CellPassesRequest_ClusterCompute_Execute_EmptySiteModel()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();

            var request  = new CellPassesRequest_ClusterCompute();
            var arg      = CreateRequestArgument(siteModel);
            var response = await request.ExecuteAsync(arg, new SubGridSpatialAffinityKey());

            response.Should().NotBeNull();
            response.ReturnCode.Should().Be(CellPassesReturnCode.NoDataFound);
        }
Пример #4
0
        public async Task Test_CellPassesRequest_WithLiftFilter(int layerId)
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var baseTime  = DateTime.UtcNow;
            var siteModel = BuildModelForSingleCellLiftAnalysis(baseTime);

            var request         = new CellPassesRequest_ClusterCompute();
            var arg             = CreateRequestArgument(siteModel);
            var attributeFilter = new CellPassAttributeFilter {
                HasLayerStateFilter = true, LayerState = LayerState.On, HasLayerIDFilter = true, LayerID = layerId
            };

            arg.Filters = new FilterSet(new CombinedFilter {
                AttributeFilter = attributeFilter, SpatialFilter = new CellSpatialFilter()
            });
            var response = await request.ExecuteAsync(arg, new SubGridSpatialAffinityKey(SubGridSpatialAffinityKey.DEFAULT_SPATIAL_AFFINITY_VERSION_NUMBER_TICKS, arg.ProjectID, arg.OTGCellX, arg.OTGCellY));

            //There should be one layer with 5 cell passes. The other layer and its cell passes should be excluded.
            response.Should().NotBeNull();
            response.ReturnCode.Should().Be(CellPassesReturnCode.DataFound);
            response.CellPasses.Count.Should().Be(5);

            for (var idx = 0; idx < 5; idx++)
            {
                var mockModifier   = idx + (layerId == LAYER_ID1 ? 1 : 6);
                var expectedTime   = baseTime.AddMinutes(mockModifier);
                var expectedHeight = 1.0f + mockModifier * 0.5f;
                var expectedCcv    = (short)(10 + 10 * mockModifier);

                var cellPass = response.CellPasses[idx];
                cellPass.LastPassValidCCV.Should().Be(expectedCcv);
                cellPass.LastPassTime.Should().Be(expectedTime);
                cellPass.Height.Should().Be(expectedHeight);
                cellPass.LayersCount.Should().Be(1);
            }
        }
Пример #5
0
        public async Task Test_CellPassesRequest_ClusterCompute_ExecuteData()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var baseTime  = DateTime.UtcNow;
            var siteModel = BuildTestSiteModel(baseTime, count: expectedCount);

            var request  = new CellPassesRequest_ClusterCompute();
            var arg      = CreateRequestArgument(siteModel);
            var response = await request.ExecuteAsync(arg, new SubGridSpatialAffinityKey(SubGridSpatialAffinityKey.DEFAULT_SPATIAL_AFFINITY_VERSION_NUMBER_TICKS, arg.ProjectID, arg.OTGCellX, arg.OTGCellY));

            response.Should().NotBeNull();
            response.ReturnCode.Should().Be(CellPassesReturnCode.DataFound);
            response.CellPasses.Count.Should().Be(expectedCount);

            for (var idx = 0; idx < expectedCount; idx++)
            {
                var mockModifier         = idx + 1;
                var expectedTime         = baseTime.AddMinutes(mockModifier);
                var expectedHeight       = 1.0f + mockModifier * 0.5f;
                var expectedCcv          = (short)(10 + 10 * mockModifier);
                var expectedMachineSpeed = (ushort)(650 + mockModifier);
                var expectedMdp          = (short)(20 + 20 * mockModifier);
                var expectedLayerID      = (ushort)(idx % 5);

                var cellPass = response.CellPasses[idx];
                cellPass.LastPassValidCCV.Should().Be(expectedCcv);
                cellPass.LastPassTime.Should().Be(expectedTime);
                cellPass.Height.Should().Be(expectedHeight);
                cellPass.MachineSpeed.Should().Be(expectedMachineSpeed);
                cellPass.LastPassValidMDP.Should().Be(expectedMdp);
                cellPass.LayerID.Should().Be(expectedLayerID);

                cellPass.GPSAccuracy.Should().Be(GPSAccuracy.Fine);
                cellPass.GPSTolerance.Should().Be(20);
            }
        }
Пример #6
0
        public void Test_CellPassesRequest_ClusterCompute_Creation()
        {
            var request = new CellPassesRequest_ClusterCompute();

            request.Should().NotBeNull();
        }