Beispiel #1
0
 public void AddExceptionStatistics(IExceptionStatistics statistics)
 {
     foreach (IVerificationReportBuilder builder in _reportBuilders)
     {
         builder.AddExceptionStatistics(statistics);
     }
 }
        private static void LogResults(
            [NotNull] IEnumerable <QualitySpecificationElement> qualitySpecificationElements,
            [NotNull] IssueProcessor issueProcessor,
            int qualityConditionCount, int datasetCount,
            bool fulfilled, bool cancelled,
            [CanBeNull] IExceptionStatistics exceptionStatistics)
        {
            using (_msg.IncrementIndentation("Quality verification finished"))
            {
                _msg.InfoFormat("Number of verified datasets: {0:N0}", datasetCount);
                using (_msg.IncrementIndentation("Number of verified quality conditions: {0:N0}",
                                                 qualityConditionCount))
                {
                    LogVerifiedConditions(qualitySpecificationElements,
                                          issueProcessor,
                                          exceptionStatistics);
                }

                _msg.InfoFormat("Warning count: {0:N0}", issueProcessor.WarningCount);
                _msg.InfoFormat("Error count: {0:N0}", issueProcessor.ErrorCount);

                if (issueProcessor.RowsWithStopConditionsCount > 0)
                {
                    _msg.WarnFormat("Number of features with stop errors: {0:N0}",
                                    issueProcessor.RowsWithStopConditionsCount);
                }

                if (exceptionStatistics != null &&
                    exceptionStatistics.TablesWithNonUniqueKeys.Count > 0)
                {
                    _msg.WarnFormat(
                        "Number of tables with non-unique keys referenced by exception objects: {0}",
                        exceptionStatistics.TablesWithNonUniqueKeys.Count);
                }

                if (cancelled)
                {
                    _msg.Warn("The quality verification was cancelled");
                }
                else if (fulfilled)
                {
                    _msg.Info("The quality specification is fulfilled");
                }
                else
                {
                    _msg.Warn("The quality specification is not fulfilled");
                }
            }
        }
Beispiel #3
0
        private static XmlExceptionStatistics CreateExceptionStatistics(
            [NotNull] IExceptionStatistics statistics,
            [NotNull] IEnumerable <QualitySpecificationElement> verifiedQualityConditions)
        {
            var result =
                new XmlExceptionStatistics
            {
                DataSource = WorkspaceUtils.GetWorkspaceDisplayText(
                    statistics.Workspace),
                ExceptionCount                         = statistics.ExceptionCount,
                ExceptionObjectCount                   = statistics.ExceptionObjectCount,
                InactiveExceptionObjectCount           = statistics.InactiveExceptionObjectCount,
                UnusedExceptionObjectCount             = statistics.UnusedExceptionObjectCount,
                ExceptionObjectsUsedMultipleTimesCount =
                    statistics.ExceptionObjectsUsedMultipleTimesCount
            };

            foreach (QualitySpecificationElement element in verifiedQualityConditions)
            {
                IQualityConditionExceptionStatistics conditionStatistics =
                    statistics.GetQualityConditionStatistics(
                        element.QualityCondition);

                if (conditionStatistics != null)
                {
                    result.AddQualityConditionExceptions(
                        CreateQualityConditionExceptionStatistics(conditionStatistics));
                }
            }

            foreach (ITable table in statistics.TablesWithNonUniqueKeys)
            {
                result.AddTableWithNonUniqueKeys(
                    CreateTableWithNonUniqueKeys(table,
                                                 statistics.GetNonUniqueKeys(table)));
            }

            return(result);
        }
        private static void LogVerifiedConditions(
            [NotNull] IEnumerable <QualitySpecificationElement> qualitySpecificationElements,
            [NotNull] IssueProcessor issueProcessor,
            [CanBeNull] IExceptionStatistics exceptionStatistics)
        {
            List <QualitySpecificationElement> elementsWithNoCategory;
            Dictionary <DataQualityCategory, List <QualitySpecificationElement> >
            elementsByCategory =
                GetElementsByCategory(qualitySpecificationElements,
                                      out elementsWithNoCategory);

            var categories = new List <DataQualityCategory>(elementsByCategory.Keys);

            categories.Sort(new DataQualityCategoryComparer());

            foreach (DataQualityCategory category in categories)
            {
                using (_msg.IncrementIndentation("Category '{0}':", category.Name))
                {
                    List <QualitySpecificationElement> elementsForCategory =
                        elementsByCategory[category];

                    elementsForCategory.Sort(CompareElements);

                    LogElements(elementsForCategory, issueProcessor, exceptionStatistics);
                }
            }

            if (elementsWithNoCategory.Count > 0)
            {
                using (_msg.IncrementIndentation("No category:"))
                {
                    elementsWithNoCategory.Sort(CompareElements);

                    LogElements(elementsWithNoCategory, issueProcessor, exceptionStatistics);
                }
            }
        }
        private static void LogElements(
            [NotNull] IEnumerable <QualitySpecificationElement> qualitySpecificationElements,
            [NotNull] IssueProcessor issueProcessor,
            [CanBeNull] IExceptionStatistics exceptionStatistics)
        {
            foreach (QualitySpecificationElement element in qualitySpecificationElements)
            {
                QualityCondition qualityCondition = element.QualityCondition;

                int exceptionCount;
                int issueCount = issueProcessor.GetIssueCount(qualityCondition,
                                                              out exceptionCount);

                var sb = new StringBuilder(qualityCondition.Name);

                if (issueCount > 0)
                {
                    sb.AppendFormat(element.AllowErrors
                                                                ? " - warnings: {0}"
                                                                : " - errors: {0}",
                                    issueCount);
                }

                if (exceptionCount > 0)
                {
                    sb.AppendFormat(" - exceptions: {0}", exceptionCount);
                }

                if (issueCount > 0)
                {
                    _msg.Warn(sb.ToString());
                }
                else
                {
                    _msg.Info(sb.ToString());
                }

                if (exceptionStatistics != null)
                {
                    IQualityConditionExceptionStatistics conditionStatistics =
                        exceptionStatistics.GetQualityConditionStatistics(qualityCondition);

                    if (conditionStatistics != null)
                    {
                        if (conditionStatistics.UnknownTableNames.Count > 0)
                        {
                            using (_msg.IncrementIndentation())
                            {
                                _msg.Warn(
                                    "Exception objects were ignored for this condition due to unknown table names:");
                                foreach (string tableName in conditionStatistics.UnknownTableNames)
                                {
                                    _msg.WarnFormat(
                                        "- {0}: used in {1} exception object(s)",
                                        tableName,
                                        conditionStatistics
                                        .GetExceptionObjectsInvolvingUnknownTableName(
                                            tableName).Count);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #6
0
 public void AddExceptionStatistics(IExceptionStatistics statistics)
 {
     _exceptionStatistics = statistics;
 }
        private bool Verify([NotNull] QualitySpecification qualitySpecification,
                            double tileSize,
                            [NotNull] string directory,
                            IssueRepositoryType issueRepositoryType,
                            [NotNull] IEnumerable <KeyValuePair <string, string> > properties,
                            [CanBeNull] XmlVerificationOptions verificationOptions,
                            [CanBeNull] AreaOfInterest areaOfInterest,
                            [CanBeNull] ITrackCancel trackCancel,
                            out int errorCount,
                            out int warningCount,
                            out int exceptionCount,
                            out int unusedExceptionObjectCount,
                            out int rowCountWithStopConditions)
        {
            Model primaryModel = StandaloneVerificationUtils.GetPrimaryModel(qualitySpecification);

            Assert.NotNull(primaryModel, "no primary model found for quality specification");

            // TODO disable quality conditions based on primaryModel and DatasetTestParameterValue.UsedAsReferenceData?
            // TODO this would probably require an explicit identification of the primary data source
            XmlVerificationReportBuilder xmlReportBuilder = GetReportBuilder();
            var statisticsBuilder = new IssueStatisticsBuilder();

            var datasetsCollector = new InvolvedDatasetsCollector();

            var service = new StandaloneQualityVerificationService(
                new MultiReportBuilder(xmlReportBuilder,
                                       statisticsBuilder,
                                       datasetsCollector),
                (context) => new SimpleDatasetOpener(context));

            // This context excludes geometric networks, terrains, topology, etc.:
            var datasetContext  = new MasterDatabaseDatasetContext();
            var datasetResolver =
                new QualityConditionObjectDatasetResolver(
                    new MasterDatabaseWorkspaceContextLookup());

            string issueWorkspaceName =
                VerificationOptionUtils.GetIssueWorkspaceName(verificationOptions);
            string verificationReportFileName =
                VerificationOptionUtils.GetXmlReportFileName(verificationOptions);

            ISpatialReference spatialReference =
                primaryModel.SpatialReferenceDescriptor?.SpatialReference;

            var  issueGdbWritten = false;
            bool fulfilled;

            List <string> htmlReportFilePaths;
            List <string> specificationReportFilePaths;
            string        gdbPath = null;

            Func <IObjectDataset, string> getKeyField =
                StandaloneVerificationUtils.GetKeyFieldLookupFunction(verificationOptions);

            ExceptionObjectRepository exceptionObjectRepository =
                StandaloneVerificationUtils.PrepareExceptionRepository(
                    qualitySpecification, datasetContext, datasetResolver, areaOfInterest,
                    verificationOptions);

            using (IIssueRepository issueRepository =
                       ExternalIssueRepositoryUtils.GetIssueRepository(
                           directory, issueWorkspaceName, spatialReference, issueRepositoryType,
                           addExceptionFields: true))
            {
                fulfilled = service.Verify(qualitySpecification, datasetContext, datasetResolver,
                                           issueRepository, exceptionObjectRepository, tileSize,
                                           getKeyField,
                                           areaOfInterest, trackCancel,
                                           out errorCount,
                                           out warningCount,
                                           out rowCountWithStopConditions);

                if (issueRepository != null)
                {
                    issueGdbWritten = true;

                    gdbPath = ((IWorkspace)issueRepository.FeatureWorkspace).PathName;

                    _msg.InfoFormat("Issues written to {0}", gdbPath);

                    issueRepository.CreateIndexes(GetForSubProcess(trackCancel),
                                                  ignoreErrors: true);
                }

                using (_msg.IncrementIndentation("Documenting verification results..."))
                {
                    XmlVerificationReport verificationReport = GetVerificationReport(
                        xmlReportBuilder, qualitySpecification, properties);

                    string verificationReportPath = Path.Combine(directory,
                                                                 verificationReportFileName);
                    XmlUtils.Serialize(verificationReport, verificationReportPath);

                    _msg.InfoFormat("Verification report written to {0}", verificationReportPath);

                    IssueStatistics issueStatistics = statisticsBuilder.IssueStatistics;

                    if (issueRepository != null)
                    {
                        var issueStatisticsWriter =
                            new IssueStatisticsWriter(issueRepository.FeatureWorkspace);

                        issueStatisticsWriter.WriteStatistics(issueStatistics);

                        if (spatialReference != null &&
                            areaOfInterest != null &&
                            !areaOfInterest.IsEmpty)
                        {
                            var aoiWriter =
                                new AreaOfInterestWriter(issueRepository.FeatureWorkspace);
                            aoiWriter.WriteAreaOfInterest(areaOfInterest, spatialReference);
                        }
                    }

                    specificationReportFilePaths =
                        StandaloneVerificationUtils.WriteQualitySpecificationReport(
                            qualitySpecification, directory, _qualitySpecificationTemplatePath,
                            verificationOptions);

                    htmlReportFilePaths = StandaloneVerificationUtils.WriteHtmlReports(
                        qualitySpecification, directory, issueStatistics, verificationReport,
                        verificationReportFileName, _htmlReportTemplatePath, verificationOptions,
                        issueGdbWritten ? gdbPath : null,
                        null, specificationReportFilePaths);
                }
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();

            if (htmlReportFilePaths.Count > 0)
            {
                using (_msg.IncrementIndentation(htmlReportFilePaths.Count == 1
                                                                         ? "Html report:"
                                                                         : "Html reports:"))
                {
                    foreach (string path in htmlReportFilePaths)
                    {
                        _msg.Info(path);
                    }
                }
            }

            if (specificationReportFilePaths.Count > 0)
            {
                using (_msg.IncrementIndentation(specificationReportFilePaths.Count == 1
                                                                         ? "Quality specification report:"
                                                                         : "Quality specification reports:"))
                {
                    foreach (string path in specificationReportFilePaths)
                    {
                        _msg.Info(path);
                    }
                }
            }

            if (exceptionObjectRepository != null)
            {
                IExceptionStatistics stats = exceptionObjectRepository.ExceptionStatistics;
                exceptionCount             = stats.ExceptionCount;
                unusedExceptionObjectCount = stats.UnusedExceptionObjectCount;
            }
            else
            {
                exceptionCount             = 0;
                unusedExceptionObjectCount = 0;
            }

            return(fulfilled);
        }
 public void AddExceptionStatistics(IExceptionStatistics statistics)
 {
     IssueStatistics.IncludeUsedExceptions(statistics.GetUsedExceptions());
 }
 public void AddExceptionStatistics(IExceptionStatistics statistics)
 {
 }