private Dataset GetDatasetByModelNameCore(
            [NotNull] string modelName,
            [NotNull] QualityCondition qualityCondition)
        {
            List <Dataset> parameterDatasets =
                qualityCondition.GetDatasetParameterValues().ToList();

            // search first for directly involved dataset
            foreach (Dataset dataset in parameterDatasets)
            {
                if (string.Equals(dataset.Name, modelName,
                                  StringComparison.OrdinalIgnoreCase))
                {
                    return(dataset);
                }
            }

            // if not found: search for other dataset in same workspace context as one of the directly involved datasets
            // (-> base datasets for topology, geometric network, terrain, etc.)
            foreach (Dataset involvedDataset in parameterDatasets)
            {
                IWorkspaceContext workspaceContext =
                    _workspaceContextLookup.GetWorkspaceContext(involvedDataset);
                if (workspaceContext == null)
                {
                    // TODO assertion exception?
                    continue;
                }

                Dataset dataset = workspaceContext.GetDatasetByModelName(modelName);
                if (dataset != null)
                {
                    return(dataset);
                }
            }

            return(null);            // not found
        }
Beispiel #2
0
        GetRelationshipClassChainsToVerifiedFeatureClassesCore(
            [NotNull] IObjectDataset objectDataset,
            [NotNull] ICollection <IRelationshipClass> precedingRelationshipClasses,
            [NotNull] IWorkspaceContextLookup workspaceContextLookup,
            [CanBeNull] Predicate <VectorDataset> isRelevantVectorDataset,
            out bool hasAnyAssociationsToFeatureClasses)
        {
            var result = new List <IList <IRelationshipClass> >();

            var relClassesToFeatureClasses = new List <IRelationshipClass>();
            var associationEndsToTables    = new List <AssociationEnd>();

            IWorkspaceContext workspaceContext = null;

            hasAnyAssociationsToFeatureClasses = false;

            foreach (AssociationEnd associationEnd in objectDataset.GetAssociationEnds())
            {
                ObjectDataset oppositeDataset = associationEnd.OppositeDataset;

                var oppositeVectorDataset = oppositeDataset as VectorDataset;
                if (oppositeVectorDataset != null)
                {
                    if (associationEnd.Association.NotUsedForDerivedTableGeometry)
                    {
                        continue;
                    }

                    hasAnyAssociationsToFeatureClasses = true;

                    if (isRelevantVectorDataset != null &&
                        !isRelevantVectorDataset(oppositeVectorDataset))
                    {
                        continue;
                    }

                    if (workspaceContext == null)
                    {
                        workspaceContext =
                            workspaceContextLookup.GetWorkspaceContext(objectDataset);
                        Assert.NotNull(workspaceContext,
                                       "Unable to determine workspace context for dataset {0}",
                                       objectDataset);
                    }

                    IRelationshipClass relationshipClass =
                        workspaceContext.OpenRelationshipClass(associationEnd.Association);

                    if (relationshipClass != null)
                    {
                        relClassesToFeatureClasses.Add(relationshipClass);
                    }
                }
                else if (oppositeDataset is TableDataset)
                {
                    associationEndsToTables.Add(associationEnd);
                }
            }

            if (relClassesToFeatureClasses.Count > 0)
            {
                foreach (IRelationshipClass relClass in relClassesToFeatureClasses)
                {
                    result.Add(new List <IRelationshipClass>(precedingRelationshipClasses)
                    {
                        relClass
                    });
                }
            }
            else
            {
                foreach (AssociationEnd associationEndToTable in associationEndsToTables)
                {
                    if (workspaceContext == null)
                    {
                        workspaceContext =
                            workspaceContextLookup.GetWorkspaceContext(objectDataset);
                        Assert.NotNull(workspaceContext,
                                       "Unable to determine workspace context for dataset {0}",
                                       objectDataset);
                    }

                    IRelationshipClass relClassToTable =
                        workspaceContext.OpenRelationshipClass(associationEndToTable.Association);
                    if (relClassToTable == null)
                    {
                        continue;
                    }

                    if (precedingRelationshipClasses.Contains(relClassToTable))
                    {
                        continue;
                    }

                    var relClassChainToTable =
                        new List <IRelationshipClass>(precedingRelationshipClasses)
                    {
                        relClassToTable
                    };

                    bool hasAnyIndirectAssociationsToFeatureClasses;
                    ICollection <IList <IRelationshipClass> > indirectRelClassChains =
                        GetRelationshipClassChainsToVerifiedFeatureClassesCore(
                            associationEndToTable.OppositeDataset,
                            relClassChainToTable,
                            workspaceContextLookup,
                            isRelevantVectorDataset,
                            out hasAnyIndirectAssociationsToFeatureClasses);

                    if (hasAnyIndirectAssociationsToFeatureClasses)
                    {
                        hasAnyAssociationsToFeatureClasses = true;
                    }

                    result.AddRange(indirectRelClassChains);

                    // TODO REVISE: use only the first association end to a table which leads to a verified feature class
                    if (indirectRelClassChains.Count > 0)
                    {
                        break;
                    }
                }
            }

            return(result);
        }