示例#1
0
        // TODO: Is this a static Utils class? Or does each IAttributes implementation have
        // its specific AttributeHarvester? Or will there be a DatasetHarvester/ModelHarvester
        // that can create instances of this class (for the right IAttributes implementation)
        // in order to more loosely couple them with the domain classes?

        //private readonly IAttributes _attributeContainer;

        //public AttributeHarvester(IAttributes attributeContainer)
        //{
        //	_attributeContainer = attributeContainer;
        //}

        #region AttributedAssociation Attribute harvesting

        public static void HarvestAttributes([NotNull] AttributedAssociation attributedAssociation)
        {
            // TODO: support for configurator?

            attributedAssociation.ClearAttributeMaps();

            using (_msg.IncrementIndentation(
                       "Harvesting attributes for attributed association {0}", attributedAssociation.Name))
            {
                const bool         allowAlways       = true;
                IRelationshipClass relationshipClass =
                    ModelElementUtils.TryOpenFromMasterDatabase(attributedAssociation, allowAlways);
                Assert.NotNull(relationshipClass,
                               "Relationship class not found in model master database: {0}",
                               attributedAssociation.Name);
                var table = (ITable)relationshipClass;

                IList <IField> fields = DatasetUtils.GetFields(table);

                for (var fieldIndex = 0; fieldIndex < fields.Count; fieldIndex++)
                {
                    IField field = fields[fieldIndex];

                    AddOrUpdateAttribute(attributedAssociation, field, fieldIndex);
                }

                DeleteAttributesNotInList(attributedAssociation, fields);

                attributedAssociation.ClearAttributeMaps();
            }
        }
示例#2
0
        /// <summary>
        /// Reads the object types from the geodatabase.
        /// </summary>
        public static void HarvestObjectTypes([NotNull] ObjectDataset objectDataset)
        {
            IWorkspaceContext workspaceContext =
                ModelElementUtils.GetMasterDatabaseWorkspaceContext(objectDataset);

            Assert.NotNull(workspaceContext, "The master database is not accessible");

            IObjectClass objectClass = workspaceContext.OpenObjectClass(objectDataset);

            Assert.NotNull(objectClass, "Unable to open object class {0}", objectDataset.Name);

            HarvestObjectTypes(objectDataset, objectClass);
        }
示例#3
0
        public static void HarvestAttributes(
            [NotNull] ObjectDataset objectDataset,
            [CanBeNull] IWorkspaceContext workspaceContext  = null,
            [CanBeNull] IAttributeConfigurator configurator = null)
        {
            if (workspaceContext == null)
            {
                workspaceContext =
                    ModelElementUtils.GetMasterDatabaseWorkspaceContext(objectDataset);
            }

            Assert.NotNull(workspaceContext, "The master database is not accessible");

            IObjectClass objectClass = workspaceContext.OpenObjectClass(objectDataset);

            Assert.NotNull(objectClass, "Unable to open object class {0}", objectDataset.Name);

            HarvestAttributes(objectDataset, configurator, objectClass);
        }
        public string GetRelationshipClassName(string associationName, Model model)
        {
            if (InnerModelContext is IQueryTableContext queryTableContext)
            {
                return(queryTableContext.GetRelationshipClassName(associationName, model));
            }

            Association association = ModelElementUtils.GetAssociationFromStoredName(
                associationName, model, ignoreUnknownAssociation: true);

            if (association == null)
            {
                return(null);
            }

            IRelationshipClass relClass = InnerModelContext.OpenRelationshipClass(association);

            return(relClass == null ? null : DatasetUtils.GetName(relClass));
        }
示例#5
0
        public static IObjectClass OpenFromDefaultDatabase(
            [NotNull] IObjectDataset objectDataset)
        {
            Assert.ArgumentNotNull(objectDataset, nameof(objectDataset));

            IWorkspaceContext masterDbContext =
                ModelElementUtils.GetMasterDatabaseWorkspaceContext(objectDataset);

            Assert.NotNull(masterDbContext,
                           "The model master database for dataset {0} is not accessible",
                           objectDataset.Name);

            IObjectClass result = masterDbContext.OpenObjectClass(objectDataset);

            Assert.NotNull(result, "Object class {0} not found in master database",
                           objectDataset.Name);

            return(result);
        }
示例#6
0
        private bool TryGetArgumentValue(
            [NotNull] TestParameter parameter,
            [NotNull] IOpenDataset datasetContext,
            [CanBeNull] ICollection <TableConstraint> tableConstraints,
            [CanBeNull] out object value)
        {
            if (Condition == null)
            {
                value = null;
                return(false);
            }

            var valuesForParameter = new List <object>();

            var parameterValueList = new List <DatasetTestParameterValue>();

            foreach (TestParameterValue parameterValue in Condition.ParameterValues)
            {
                if (!Equals(parameterValue.TestParameterName, parameter.Name))
                {
                    continue;
                }

                object valueForParameter = GetValue(parameterValue, parameter, datasetContext);

                valuesForParameter.Add(valueForParameter);

                // add value to list anyway,
                // correct type is checked at the end of parameterIndex Loop
                parameterValueList.Add(parameterValue as DatasetTestParameterValue);
            }

            if (valuesForParameter.Count == 0 && !parameter.IsConstructorParameter)
            {
                value = null;
                return(false);
            }

            value = GetArgumentValue(parameter, valuesForParameter);

            // if correct type, add to dataSetList
            if (tableConstraints != null &&
                valuesForParameter.Count > 0 &&
                valuesForParameter[0] is ITable)
            {
                foreach (DatasetTestParameterValue datasetParameterValue in parameterValueList)
                {
                    Dataset dataset =
                        Assert.NotNull(datasetParameterValue.DatasetValue, "dataset is null");

                    var table = (ITable)datasetContext.OpenDataset(
                        dataset, Assert.NotNull(datasetParameterValue.DataType));

                    Assert.NotNull(table, "Dataset not found in current context: {0}",
                                   dataset.Name);

                    DdxModel dataModel = dataset.Model;

                    bool useCaseSensitiveSql = dataModel != null &&
                                               ModelElementUtils.UseCaseSensitiveSql(
                        table, dataModel.SqlCaseSensitivity);

                    tableConstraints.Add(new TableConstraint(
                                             table, datasetParameterValue.FilterExpression,
                                             useCaseSensitiveSql));
                }
            }

            return(true);
        }
        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);
        }