private AreaSpecification GetDefaultAreaSpecification(
            [CanBeNull] string datasetName)
        {
            if (_areaSpecifications.Count == 0)
            {
                return(null);
            }

            // TODO make this more explicit

            AreaSpecification candidate = _areaSpecifications[0];

            if (candidate.HasPerimeter)
            {
                // it's not a default specification
                return(null);
            }

            // TODO REFACTORMODEL invalid use of class name
            if (datasetName != null && !candidate.IsVerifiedDataset(datasetName))
            {
                return(null);
            }

            // the first non-polygon area spec is used as default
            // if either the dataset name is not specified or if the
            // first area spec involves the specified dataset name.
            return(candidate);
        }
        private IEnumerable <AreaSpecification> GetIntersectedAreaSpecifications(
            [NotNull] IGeometry errorGeometry,
            [NotNull] QualityCondition qualityCondition,
            [NotNull] ICollection <InvolvedRow> involvedRows)
        {
            if (_areaSpecifications.Count == 0)
            {
                yield break;
            }

            var            returnedCount        = 0;
            int            totalCount           = _areaSpecifications.Count;
            IList <string> involvedDatasetNames = null;

            for (int index = totalCount - 1; index >= 0; index--)
            {
                AreaSpecification areaSpecification = _areaSpecifications[index];

                if (involvedDatasetNames == null)
                {
                    involvedDatasetNames =
                        involvedRows.Count != 0
                                                        ? involvedRows.Select(row => row.TableName).ToList()
                                                        : qualityCondition.GetDatasetParameterValues().Select(
                            dataset => dataset.Name).ToList();
                }

                if (!areaSpecification.IsAnyDatasetEditable(involvedDatasetNames))
                {
                    // none of the involved datasets is editable in the area specification
                    continue;
                }

                if (areaSpecification.Intersects(errorGeometry))
                {
                    returnedCount++;

                    // the area spec is relevant for the geometry
                    yield return(areaSpecification);
                }
            }

            if (returnedCount == 0)
            {
                // no area specification found so far

                AreaSpecification defaultAreaSpecification = GetDefaultAreaSpecification(null);
                if (defaultAreaSpecification != null)
                {
                    yield return(defaultAreaSpecification);
                }
            }
        }
            public bool IsWithin([NotNull] AreaSpecification areaSpecification)
            {
                // area spec has no polygon: false
                // shape is empty: false

                if (Shape == null)
                {
                    return(false);
                }

                if (!_ignoreCurrentTileRelation)
                {
                    switch (areaSpecification.CurrentTileRelation)
                    {
                    case TileRelation.Within:
                        if (FeatureIsWithinCurrentTile)
                        {
                            // feature is within tile, and tile is within area spec
                            // -> feature is within area spec
                            return(true);
                        }

                        break;

                    case TileRelation.Disjoint:
                        if (FeatureIsWithinCurrentTile)
                        {
                            // feature is within tile, and area spec is disjoint from tile
                            // -> feature is disjoint from area spec
                            return(false);
                        }

                        break;

                    case TileRelation.Unknown:
                    case TileRelation.PartialWithin:
                        // in all other cases, the relationship between feature and
                        // area specification will have to be calculated
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                // no shortcuts, the feature must be compared to the area specification polygon
                return(areaSpecification.Contains(Shape));
            }
        private List <AreaSpecification> CalculateAreaSpecifications(
            [NotNull] IFeature feature, bool ignoreTestPerimeter)
        {
            if (_areaSpecifications.Count == 0)
            {
                return(null);
            }

            var result = new List <AreaSpecification>();

            var featurePerimeterRelation = new FeaturePerimeterRelation(
                feature, _envelopeTemplate, !ignoreTestPerimeter ? _currentTile : null,
                ignoreCurrentTileRelation: ignoreTestPerimeter);

            // TODO REFACTORMODEL invalid use of class name
            string datasetName = GetDatasetName(feature).ToUpper();
            bool   belongsToVerifiedDataset = IsVerifiedDataset(datasetName);
            var    containingPrimaryAreaSpecificationFound = false;

            int areaSpecCount = _areaSpecifications.Count;

            for (int index = areaSpecCount - 1; index >= 0; index--)
            {
                AreaSpecification areaSpecification = _areaSpecifications[index];

                if (belongsToVerifiedDataset &&
                    areaSpecification.HasVerifiedDatasets() &&
                    !areaSpecification.IsVerifiedDataset(datasetName))
                {
                    // the area specification has involved datasets, but the (verified)
                    // dataset is not part of it --> skip this area specification

                    // BUT: the area specification may still be the primary specification, if
                    // the dataset is editable in the area specification (and the feature intersects)
                    // -> rearrange logic

                    continue;
                }

                // either the dataset is not (directly) involved in any quality condition (of all qspecs involved in the run)
                //   (could be indirect, e.g. feature class involved in topology or geometric network)
                // OR it IS involved (generally) AND it is involved in this area specification
                // OR the area specification has no involved datasets (??)

                if (featurePerimeterRelation.Intersects(areaSpecification))
                {
                    if (areaSpecification.IsEditableDataset(datasetName) &&
                        featurePerimeterRelation.IsWithin(areaSpecification))
                    {
                        containingPrimaryAreaSpecificationFound = true;
                    }

                    // the shape intersects the (defined) area specification polygon
                    result.Add(areaSpecification);
                }
            }

            if (!containingPrimaryAreaSpecificationFound)
            {
                AreaSpecification defaultAreaSpecification =
                    GetDefaultAreaSpecification(datasetName);
                if (defaultAreaSpecification != null)
                {
                    result.Add(defaultAreaSpecification);
                }
            }

            return(result);
        }