public QualityConditionObjectDatasetResolver( [NotNull] IWorkspaceContextLookup workspaceContextLookup) { Assert.ArgumentNotNull(workspaceContextLookup, nameof(workspaceContextLookup)); _workspaceContextLookup = workspaceContextLookup; }
GetRelationshipClassChainsToVerifiedFeatureClasses( [NotNull] IObjectDataset objectDataset, [NotNull] IWorkspaceContextLookup workspaceContextLookup, [CanBeNull] Predicate <VectorDataset> isRelevantVectorDataset, out bool hasAnyAssociationsToFeatureClasses) { return(GetRelationshipClassChainsToVerifiedFeatureClassesCore( objectDataset, new List <IRelationshipClass>(), workspaceContextLookup, isRelevantVectorDataset, out hasAnyAssociationsToFeatureClasses)); }
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); }