/// <summary>
        /// Initializes a new instance of the <see cref="QualityErrorRepositoryBase"/> class.
        /// </summary>
        /// <param name="verificationContext">The model context.</param>
        /// <param name="testsByQualityCondition">The dictionary of tests by quality condition.
        /// It can be empty in case the <see cref="AddError"/> method is never used and the
        /// <see cref="VerifiedQualityConditions"/> property is set.</param>
        /// <param name="datasetResolver">The dataset resolver.</param>
        /// <param name="qualityConditionRepository">The quality condition repository.</param>
        protected QualityErrorRepositoryBase(
            [NotNull] IVerificationContext verificationContext,
            [NotNull] Dictionary <QualityCondition, IList <ITest> > testsByQualityCondition,
            [NotNull] IQualityConditionObjectDatasetResolver datasetResolver,
            [NotNull] IQualityConditionRepository qualityConditionRepository)
        {
            Assert.ArgumentNotNull(verificationContext, nameof(verificationContext));
            Assert.ArgumentNotNull(testsByQualityCondition, nameof(testsByQualityCondition));
            Assert.ArgumentNotNull(datasetResolver, nameof(datasetResolver));
            Assert.ArgumentNotNull(qualityConditionRepository,
                                   nameof(qualityConditionRepository));

            _verificationContext     = verificationContext;
            _testsByQualityCondition = testsByQualityCondition;

            IssueDatasets = new QualityErrorRepositoryDatasets(_verificationContext);

            VerifiedQualityConditions = testsByQualityCondition.Keys;

            _userName = EnvironmentUtils.UserDisplayName;

            _datasetResolver            = datasetResolver;
            _qualityConditionRepository = qualityConditionRepository;

            int gdbMajorRelease =
                ((IGeodatabaseRelease)
                 verificationContext.PrimaryWorkspaceContext.Workspace).MajorVersion + 7;

            _isPre10Geodatabase = gdbMajorRelease < 10;
        }
Exemple #2
0
        public BackgroundVerificationResult(
            [CanBeNull] IClientIssueMessageCollector resultIssueCollector,
            [NotNull] IDomainTransactionManager domainTransactions,
            [NotNull] IQualityVerificationRepository qualityVerificationRepository,
            [NotNull] IQualityConditionRepository qualityConditionRepository)
        {
            _resultIssueCollector = resultIssueCollector;

            _domainTransactions            = domainTransactions;
            _qualityVerificationRepository = qualityVerificationRepository;
            _qualityConditionRepository    = qualityConditionRepository;
        }
Exemple #3
0
        public static IEnumerable <IRow> GetInvolvedRows(
            [NotNull] IErrorObject errorObject,
            [NotNull] IModelContext modelContext,
            [NotNull] IQualityConditionRepository qualityConditionRepository)
        {
            Assert.ArgumentNotNull(errorObject, nameof(errorObject));
            Assert.ArgumentNotNull(modelContext, nameof(modelContext));

            var datasetResolver = new QualityConditionObjectDatasetResolver(modelContext);

            return(GetInvolvedRows(errorObject, modelContext, qualityConditionRepository,
                                   datasetResolver));
        }
Exemple #4
0
        public BackgroundVerificationRun(
            [NotNull] VerificationRequest verificationRequest,
            [NotNull] IDomainTransactionManager domainTransactions,
            [NotNull] IQualityVerificationRepository qualityVerificationRepository,
            [NotNull] IQualityConditionRepository qualityConditionRepository,
            CancellationTokenSource cancellationTokenSource)
        {
            VerificationRequest            = verificationRequest;
            _domainTransactions            = domainTransactions;
            _qualityVerificationRepository = qualityVerificationRepository;
            _qualityConditionRepository    = qualityConditionRepository;
            _cancellationTokenSource       = cancellationTokenSource;

            Progress = new QualityVerificationProgressTracker
            {
                CancellationTokenSource = cancellationTokenSource
            };
        }
Exemple #5
0
        public static IList <IFeature> GetInvolvedOrRelatedFeatures(
            [NotNull] IObject errorObject,
            [NotNull] IDatasetLookup datasetLookup,
            [NotNull] IModelContext modelContext,
            [NotNull] IQualityConditionRepository qualityConditionRepository)
        {
            Assert.ArgumentNotNull(errorObject, nameof(errorObject));
            Assert.ArgumentNotNull(datasetLookup, nameof(datasetLookup));
            Assert.ArgumentNotNull(modelContext, nameof(modelContext));

            var list = new List <IFeature>();

            IErrorDataset errorTable = GetErrorDataset(errorObject, datasetLookup);

            IErrorObject errorRow = CreateErrorObject(errorObject, errorTable, null);

            foreach (
                IRow involvedRow in
                GetInvolvedRows(errorRow, modelContext, qualityConditionRepository))
            {
                var feature = involvedRow as IFeature;

                if (feature != null)
                {
                    list.Add(feature);
                }
                else
                {
                    list.AddRange(GetDerivedTableGeometryFeatures((IObject)involvedRow,
                                                                  datasetLookup,
                                                                  modelContext));
                }
            }

            return(list);
        }
Exemple #6
0
        private static IEnumerable <IRow> GetInvolvedRows(
            [NotNull] IErrorObject errorObject,
            [NotNull] IDatasetContext datasetContext,
            [NotNull] IQualityConditionRepository qualityConditionRepository,
            [NotNull] IQualityConditionObjectDatasetResolver datasetResolver)
        {
            IList <InvolvedRow> involved = RowParser.Parse(errorObject.RawInvolvedObjects);

            QualityCondition qualityCondition = GetQualityCondition(errorObject,
                                                                    qualityConditionRepository);

            if (qualityCondition == null)
            {
                yield break;
            }

            foreach (KeyValuePair <string, IList <int> > pair in
                     GetInvolvedObjectIDsByTableName(involved))
            {
                string      tableName = pair.Key;
                IList <int> objectIDs = pair.Value;

                IObjectDataset dataset =
                    datasetResolver.GetDatasetByInvolvedRowTableName(tableName, qualityCondition);
                if (dataset == null)
                {
                    continue;
                }

                ITable table;
                try
                {
                    table = datasetContext.OpenTable(dataset);
                }
                catch (Exception e)
                {
                    _msg.WarnFormat("Error getting involved rows for table {0}: {1}", tableName,
                                    e.Message);
                    continue;
                }

                if (table == null)
                {
                    continue;
                }

                IEnumerable <IRow> rows = TryGetRows(table, objectIDs);

                if (rows == null)
                {
                    // error already logged in TryGetRows()
                    continue;
                }

                foreach (IRow row in rows)
                {
                    if (GdbObjectUtils.IsDeleted(row))
                    {
                        // don't return deleted rows
                        continue;
                    }

                    yield return(row);
                }
            }
        }
        private static IEnumerable <QualityCondition> GetActiveQualityConditions(
            [NotNull] IQualityConditionRepository repository,
            bool requireReferenceFromQualitySpecification)
        {
            Assert.ArgumentNotNull(repository, nameof(repository));

            Stopwatch watch = _msg.DebugStartTiming("Getting active quality conditions");
            var       count = 0;

            IDictionary <int, int> referenceCounts;

            if (requireReferenceFromQualitySpecification)
            {
                _msg.DebugFormat(
                    "Getting number of referencing quality specifications per quality condition");
                referenceCounts = repository.GetReferencingQualitySpecificationCount();
            }
            else
            {
                referenceCounts = null;
            }

            _msg.DebugFormat("Reading all quality conditions (with parameter values)");

            const bool fetchParameterValues = true;

            foreach (
                QualityCondition qualityCondition in repository.GetAll(fetchParameterValues))
            {
                if (UsesDeletedDatasets(qualityCondition))
                {
                    _msg.DebugFormat("Quality condition {0} {1} references deleted datasets",
                                     qualityCondition.Name, qualityCondition.Id);

                    // don't include the quality condition since it uses at least one deleted datasets
                    continue;
                }

                if (requireReferenceFromQualitySpecification)
                {
                    Assert.NotNull(referenceCounts, "referenceCounts");

                    int  referenceCount;
                    bool isReferenced = referenceCounts.TryGetValue(qualityCondition.Id,
                                                                    out referenceCount) &&
                                        referenceCount > 0;

                    if (!isReferenced)
                    {
                        _msg.DebugFormat(
                            "Quality condition {0} {1} is not referenced by any quality specification",
                            qualityCondition.Name, qualityCondition.Id);

                        // don't include the quality condition since it is not referenced by any quality specification
                        continue;
                    }
                }

                // the quality condition is "active"
                count++;
                yield return(qualityCondition);
            }

            _msg.DebugStopTiming(watch, "Returned {0} active quality conditions", count);
        }