private QualitySpecification CreateQualitySpecificationCore(
            [NotNull] XmlDataQualityDocument document,
            [NotNull] string qualitySpecificationName,
            [NotNull] IEnumerable <DataSource> dataSources,
            bool ignoreConditionsForUnknownDatasets)
        {
            Assert.ArgumentNotNull(document, nameof(document));
            Assert.ArgumentNotNull(dataSources, nameof(dataSources));
            Assert.ArgumentCondition(document.GetAllQualitySpecifications().Any(),
                                     "The document must contain at least one quality specification");

            XmlDataQualityUtils.AssertUniqueWorkspaceIds(document);
            XmlDataQualityUtils.AssertUniqueTestDescriptorNames(document);
            XmlDataQualityUtils.AssertUniqueQualityConditionNames(document);
            XmlDataQualityUtils.AssertUniqueQualitySpecificationNames(document);
            XmlDataQualityUtils.AssertUniqueQualifiedCategoryNames(document);

            XmlDataQualityCategory  xmlSpecificationCategory;
            XmlQualitySpecification xmlQualitySpecification =
                XmlDataQualityUtils.FindXmlQualitySpecification(document,
                                                                qualitySpecificationName,
                                                                out xmlSpecificationCategory);

            Assert.ArgumentCondition(xmlQualitySpecification != null,
                                     "Specification '{0} not found in document",
                                     qualitySpecificationName);

            XmlDataQualityUtils.AssertUniqueElementNames(xmlQualitySpecification);

            IDictionary <XmlDataQualityCategory, DataQualityCategory> categoryMap =
                GetCategoryMap(document);

            IList <KeyValuePair <XmlQualityCondition, XmlDataQualityCategory> >
            referencedXmlConditionPairs =
                XmlDataQualityUtils.GetReferencedXmlQualityConditions(
                    document, new[] { xmlQualitySpecification })
                .ToList();

            IList <XmlQualityCondition> referencedXmlConditions =
                referencedXmlConditionPairs.Select(p => p.Key)
                .ToList();

            IList <XmlWorkspace> referencedXmlWorkspaces =
                XmlDataQualityUtils.GetReferencedWorkspaces(document,
                                                            referencedXmlConditions);

            IDictionary <string, Model> modelsByWorkspaceId = GetModelsByWorkspaceId(
                referencedXmlWorkspaces, dataSources, referencedXmlConditions);

            IDictionary <string, TestDescriptor> testDescriptorsByName =
                GetReferencedTestDescriptorsByName(referencedXmlConditions, document);

            var qualityConditions = new Dictionary <string, QualityCondition>(
                StringComparer.OrdinalIgnoreCase);

            Func <string, IList <Dataset> > getDatasetsByName = name => new List <Dataset>();

            foreach (
                KeyValuePair <XmlQualityCondition, XmlDataQualityCategory> pair in
                referencedXmlConditionPairs)
            {
                XmlQualityCondition    xmlCondition         = pair.Key;
                XmlDataQualityCategory xmlConditionCategory = pair.Value;

                DataQualityCategory conditionCategory = xmlConditionCategory != null
                                                                                ? categoryMap[xmlConditionCategory]
                                                                                : null;

                ICollection <XmlDatasetTestParameterValue> unknownDatasetParameters;
                QualityCondition qualityCondition = XmlDataQualityUtils.CreateQualityCondition(
                    xmlCondition,
                    testDescriptorsByName[xmlCondition.TestDescriptorName],
                    modelsByWorkspaceId,
                    getDatasetsByName,
                    conditionCategory,
                    ignoreConditionsForUnknownDatasets,
                    out unknownDatasetParameters);

                if (qualityCondition == null)
                {
                    Assert.True(ignoreConditionsForUnknownDatasets,
                                "ignoreConditionsForUnknownDatasets");
                    Assert.True(unknownDatasetParameters.Count > 0,
                                "Unexpected number of unknown datasets");

                    _msg.WarnFormat(
                        unknownDatasetParameters.Count == 1
                                                        ? "Quality condition '{0}' is ignored because the following dataset is not found: {1}"
                                                        : "Quality condition '{0}' is ignored because the following datasets are not found: {1}",
                        xmlCondition.Name,
                        XmlDataQualityUtils.ConcatenateUnknownDatasetNames(
                            unknownDatasetParameters,
                            modelsByWorkspaceId,
                            DataSource.AnonymousId));
                }
                else
                {
                    qualityConditions.Add(qualityCondition.Name, qualityCondition);
                }
            }

            DataQualityCategory specificationCategory =
                xmlSpecificationCategory != null
                                        ? categoryMap[xmlSpecificationCategory]
                                        : null;

            return(XmlDataQualityUtils.CreateQualitySpecification(
                       qualityConditions, xmlQualitySpecification, specificationCategory,
                       ignoreConditionsForUnknownDatasets));
        }
示例#2
0
        private void CanCreateQualitySpecificationCore()
        {
            var    locator     = TestDataLocator.Create("ProSuite", @"QA\TestData");
            string catalogPath = locator.GetPath("QATestData.mdb");

            var xmlCategory = new XmlDataQualityCategory {
                Name = "Category A"
            };
            var xmlSubCategory = new XmlDataQualityCategory {
                Name = "Category A.1"
            };
            var xmlSubSubCategory = new XmlDataQualityCategory {
                Name = "Category A.1.1"
            };
            var xmlSubSubCategory2 = new XmlDataQualityCategory {
                Name = "Category A.1.2"
            };

            xmlCategory.AddSubCategory(xmlSubCategory);
            xmlSubCategory.AddSubCategory(xmlSubSubCategory);
            xmlSubCategory.AddSubCategory(xmlSubSubCategory2);

            var xmlQCon = new XmlQualityCondition
            {
                Name = "MinArea",
                TestDescriptorName = _xmlTestDescriptorMinArea.Name
            };

            xmlQCon.ParameterValues.Add(new XmlDatasetTestParameterValue
            {
                TestParameterName = "polygonClass",
                Value             = "polygons",
                WorkspaceId       = _xmlWorkspace.ID
            });
            xmlQCon.ParameterValues.Add(new XmlScalarTestParameterValue
            {
                TestParameterName = "limit",
                Value             = "12.34"
            });

            var xmlQSpec = new XmlQualitySpecification {
                Name = "qspec"
            };

            xmlQSpec.Elements.Add(new XmlQualitySpecificationElement
            {
                QualityConditionName = xmlQCon.Name
            });

            var xmlDocument = new XmlDataQualityDocument();

            xmlDocument.AddCategory(xmlCategory);
            xmlDocument.AddWorkspace(_xmlWorkspace);
            //xmlDocument.AddQualitySpecification(xmlQSpec);
            //xmlDocument.AddQualityCondition(xmlQCon);
            xmlDocument.AddTestDescriptor(_xmlTestDescriptorMinArea);

            xmlSubCategory.AddQualitySpecification(xmlQSpec);
            xmlSubSubCategory.AddQualityCondition(xmlQCon);

            var modelFactory =
                new VerifiedModelFactory(CreateWorkspaceContext,
                                         new SimpleVerifiedDatasetHarvester());

            var factory = new XmlBasedQualitySpecificationFactory(
                modelFactory, new SimpleDatasetOpener(new MasterDatabaseDatasetContext()));

            var dataSource = new DataSource(_xmlWorkspace)
            {
                WorkspaceAsText = catalogPath
            };

            QualitySpecification qualitySpecification =
                factory.CreateQualitySpecification(xmlDocument, xmlQSpec.Name,
                                                   new[] { dataSource });

            Assert.NotNull(qualitySpecification.Category);
            Assert.AreEqual(xmlQSpec.Name, qualitySpecification.Name);
            Assert.AreEqual(1, qualitySpecification.Elements.Count);
            if (qualitySpecification.Category != null)
            {
                Assert.AreEqual(xmlSubCategory.Name, qualitySpecification.Category.Name);
                Assert.NotNull(qualitySpecification.Category.ParentCategory);
                if (qualitySpecification.Category.ParentCategory != null)
                {
                    Assert.AreEqual(xmlCategory.Name,
                                    qualitySpecification.Category.ParentCategory.Name);
                }

                Assert.AreEqual(2, qualitySpecification.Category.SubCategories.Count);
            }

            QualityCondition qualityCondition =
                qualitySpecification.Elements[0].QualityCondition;

            Assert.AreEqual(xmlQCon.Name, qualityCondition.Name);
            Assert.NotNull(qualityCondition.Category);
            if (qualityCondition.Category != null)
            {
                Assert.AreEqual(xmlSubSubCategory.Name, qualityCondition.Category.Name);
                Assert.NotNull(qualityCondition.Category.ParentCategory);
                if (qualityCondition.Category.ParentCategory != null)
                {
                    Assert.AreEqual(xmlSubCategory.Name,
                                    qualityCondition.Category.ParentCategory.Name);
                }
            }

            var value =
                (ScalarTestParameterValue)qualityCondition.GetParameterValues("limit")[0];

            Assert.AreEqual(12.34, value.GetValue(typeof(double)));
        }