예제 #1
0
        public void TestNonUniqueIntegers()
        {
            IFieldsEdit fields = new FieldsClass();

            fields.AddField(FieldUtils.CreateOIDField());
            fields.AddField(FieldUtils.CreateField("Unique",
                                                   esriFieldType.esriFieldTypeInteger));
            ITable table = TestWorkspaceUtils.CreateSimpleTable(_pgdbWorkspace, "NonUnique",
                                                                fields);

            for (var i = 0; i < 10; i++)
            {
                IRow row = table.CreateRow();
                row.set_Value(1, i);
                row.Store();
            }

            // create error values
            {
                IRow row = table.CreateRow();
                row.set_Value(1, 5);
                row.Store();
            }
            IRow errorRow = table.CreateRow();

            errorRow.set_Value(1, 5);
            errorRow.Store();
            {
                IRow row = table.CreateRow();
                row.set_Value(1, 7);
                row.Store();
            }
            IRow validRow = table.CreateRow();

            validRow.set_Value(1, 12);
            validRow.Store();

            foreach (bool forceInMemoryTableSort in new[] { true, false })
            {
                // init Test
                var test = new QaUnique(table, "Unique")
                {
                    ForceInMemoryTableSorting = forceInMemoryTableSort
                };

                // Run global test
                var runner = new QaTestRunner(test);
                runner.Execute();
                Assert.AreEqual(5, runner.Errors.Count);                 // each non unique row is reported

                // Run valid row
                runner = new QaTestRunner(test);
                runner.Execute(new[] { validRow });
                AssertUtils.NoError(runner);

                // Run error row
                runner = new QaTestRunner(test);
                runner.Execute(new[] { errorRow });
                Assert.AreEqual(3, runner.Errors.Count);                 // '5' exists in 3 rows

                // Run combined
                runner = new QaTestRunner(test);
                runner.Execute(new[] { validRow, errorRow });
                Assert.AreEqual(3, runner.Errors.Count);
            }
        }
예제 #2
0
        private static void CanDetectNtoMUnique([NotNull] IFeatureWorkspace workspace)
        {
            const string uniqueFieldName     = "FIELD_UNIQUE";
            const string foreignKeyFieldName = "FOREIGN_KEY_FIELD";

            ITable tableOrig;
            {
                IFieldsEdit fields = new FieldsClass();
                fields.AddField(FieldUtils.CreateOIDField());
                fields.AddField(FieldUtils.CreateField(uniqueFieldName,
                                                       esriFieldType.esriFieldTypeInteger));
                ITable table = TestWorkspaceUtils.CreateSimpleTable(workspace, "RelateUnique1",
                                                                    fields,
                                                                    null);
                tableOrig = table;
            }
            ITable tableRel;
            {
                IFieldsEdit fields = new FieldsClass();
                fields.AddField(FieldUtils.CreateOIDField());
                fields.AddField(FieldUtils.CreateField(foreignKeyFieldName,
                                                       esriFieldType.esriFieldTypeInteger));
                ITable table = TestWorkspaceUtils.CreateSimpleTable(workspace, "RelateUnique2",
                                                                    fields,
                                                                    null);
                tableRel = table;
            }
            IRelationshipClass rel = TestWorkspaceUtils.CreateSimpleMNRelationship(
                workspace, "NToMRelTable", tableOrig, tableRel, uniqueFieldName,
                foreignKeyFieldName);

            {
                ((IWorkspaceEdit)workspace).StartEditing(false);
                for (var i = 0; i < 10; i++)
                {
                    IRow row = tableOrig.CreateRow();
                    row.set_Value(1, i);
                    row.Store();
                }

                for (var i = 0; i < 10; i++)
                {
                    IRow row = tableRel.CreateRow();
                    row.set_Value(1, i);
                    row.Store();
                    rel.CreateRelationship((IObject)tableOrig.GetRow(i + 1),
                                           (IObject)row);
                }

                ((IWorkspaceEdit)workspace).StopEditing(true);
            }

            ITable relTab = TableJoinUtils.CreateQueryTable(rel, JoinType.InnerJoin);

            foreach (bool forceInMemoryTableSort in new[] { true, false })
            {
                var test = new QaUnique(relTab, "RelateUnique1." + uniqueFieldName)
                {
                    ForceInMemoryTableSorting = forceInMemoryTableSort
                };

                var runner = new QaTestRunner(test);
                runner.Execute();
                AssertUtils.NoError(runner);
            }
        }
예제 #3
0
        public void CanTranslateSql()
        {
            IFeatureClass      fc;
            ITable             table;
            IRelationshipClass rc;

            CreateTestWorkspace(
                "CanTranslateSql_master", "fc", "table", "rc",
                out fc, out table, out rc);

            IFeatureClass      fc_child;
            ITable             table_child;
            IRelationshipClass rc_child;
            IFeatureWorkspace  childWorkspace = CreateTestWorkspace(
                "CanTranslateSql_child", "fc_child", "table_child", "rc_child",
                out fc_child, out table_child, out rc_child);

            IRow t = table_child.CreateRow();

            t.Value[table_child.FindField("TEXT")] = "table";             // same as table name
            int pk = t.OID;

            t.Store();

            IFeature f = fc_child.CreateFeature();

            f.Value[fc_child.FindField("FKEY")] = pk;
            f.Shape = GeometryFactory.CreatePoint(100, 200);
            f.Store();

            var model = new SimpleModel("model", fc);

            ModelVectorDataset vectorDataset = model.AddDataset(
                new ModelVectorDataset(DatasetUtils.GetName(fc)));
            ModelTableDataset tableDataset = model.AddDataset(
                new ModelTableDataset(DatasetUtils.GetName(table)));

            AttributeHarvestingUtils.HarvestAttributes(
                vectorDataset, ModelElementUtils.GetMasterDatabaseWorkspaceContext(vectorDataset));
            AttributeHarvestingUtils.HarvestAttributes(
                tableDataset, ModelElementUtils.GetMasterDatabaseWorkspaceContext(tableDataset));

            ObjectAttribute fkAttribute = vectorDataset.GetAttribute("FKEY");
            ObjectAttribute pkAttribute = tableDataset.GetAttribute(table.OIDFieldName);

            Assert.NotNull(fkAttribute);
            Assert.NotNull(pkAttribute);

            Association association =
                model.AddAssociation(new ForeignKeyAssociation(DatasetUtils.GetName(rc),
                                                               AssociationCardinality.OneToMany,
                                                               fkAttribute, pkAttribute));

            var childWorkspaceContext = new SimpleWorkspaceContext(
                model, childWorkspace,
                new[]
            {
                new WorkspaceDataset("fc_child", null, vectorDataset),
                new WorkspaceDataset("table_child", null, tableDataset),
            },
                new[]
            {
                new WorkspaceAssociation("rc_child", null, association)
            });

            var clsDesc = new ClassDescriptor(typeof(QaRelConstraint));
            var tstDesc = new TestDescriptor("RelConstraint", clsDesc);
            QualityCondition condition = new QualityCondition("fc_table_constraints", tstDesc);

            QualityConditionParameterUtils.AddParameterValue(condition, "relationTables", vectorDataset);
            QualityConditionParameterUtils.AddParameterValue(condition, "relationTables", tableDataset);
            QualityConditionParameterUtils.AddParameterValue(condition, "relation", "rc");
            QualityConditionParameterUtils.AddParameterValue(condition, "join", JoinType.InnerJoin);
            QualityConditionParameterUtils.AddParameterValue(condition, "constraint",
                                                             "(fc.OBJECTID = 1 AND table.OBJECTID = 1) AND (table.TEXT = 'table')");

            var factory = new QaRelConstraint {
                Condition = condition
            };
            ITest test = factory.CreateTests(new SimpleDatasetOpener(childWorkspaceContext))[0];

            var runner = new QaContainerTestRunner(1000, test);

            runner.Execute(GeometryFactory.CreateEnvelope(0, 0, 1000, 1000));

            AssertUtils.NoError(runner);
        }