public QualityConditionObjectDatasetResolver(
            [NotNull] IWorkspaceContextLookup workspaceContextLookup)
        {
            Assert.ArgumentNotNull(workspaceContextLookup, nameof(workspaceContextLookup));

            _workspaceContextLookup = workspaceContextLookup;
        }
Example #2
0
 GetRelationshipClassChainsToVerifiedFeatureClasses(
     [NotNull] IObjectDataset objectDataset,
     [NotNull] IWorkspaceContextLookup workspaceContextLookup,
     [CanBeNull] Predicate <VectorDataset> isRelevantVectorDataset,
     out bool hasAnyAssociationsToFeatureClasses)
 {
     return(GetRelationshipClassChainsToVerifiedFeatureClassesCore(
                objectDataset,
                new List <IRelationshipClass>(),
                workspaceContextLookup,
                isRelevantVectorDataset,
                out hasAnyAssociationsToFeatureClasses));
 }
Example #3
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);
        }