internal static IEnumerable <IRelationById> GetDescendentRelations(this IEnumerable <IReadonlyProviderRelationsRepository> session, HiveId ancestorId, Uri idRoot, RelationType relationType = null)
        {
            var totalOutput = new HashSet <IRelationById>();

            foreach (var readonlyRelationsRepository in session)
            {
                if (readonlyRelationsRepository.CanReadRelations)
                {
                    readonlyRelationsRepository.GetDescendentRelations(ancestorId, relationType)
                    .SkipWhile(SkipAndMergeRelationsFromProviders(readonlyRelationsRepository.ProviderMetadata, totalOutput))
                    .ForEach(x => totalOutput.Add(x));
                }
            }
            return(totalOutput.Distinct().Select(x => GroupSessionHelper.CreateRelationByAbsoluteId(x, idRoot)));
        }
        internal static IRelationById FindRelation(this IEnumerable <IReadonlyProviderRelationsRepository> sessions, HiveId sourceId, HiveId destinationId, Uri idRoot, RelationType relationType = null)
        {
            IRelationById result = null;

            foreach (var readonlyRelationsRepository in sessions)
            {
                if (readonlyRelationsRepository.CanReadRelations)
                {
                    result = readonlyRelationsRepository.FindRelation(sourceId, destinationId, relationType);
                }
                if (result != null)
                {
                    break;
                }
            }
            return(GroupSessionHelper.CreateRelationByAbsoluteId(result, idRoot));
        }
        internal static IEnumerable <IRelationById> GetAncestorRelations(this IEnumerable <IReadonlyProviderRelationsRepository> allProviderRepositories, HiveId descendentId, Uri idRoot, RelationType relationType = null)
        {
            var totalOutput = new HashSet <IRelationById>();

            foreach (var relationsRepository in allProviderRepositories)
            {
                if (relationsRepository.CanReadRelations)
                {
                    var provider  = relationsRepository;
                    var relations = relationsRepository.RepositoryScopedCache.GetOrCreateTyped("rprr_GetAncestorRelations_" + descendentId + (relationType != null ? relationType.RelationName : "any_relationtype"),
                                                                                               () => provider.GetAncestorRelations(descendentId, relationType).ToArray());

                    relations
                    .SkipWhile(SkipAndMergeRelationsFromProviders(relationsRepository.ProviderMetadata, totalOutput))
                    .ForEach(x => totalOutput.Add(x));
                }
            }
            return(totalOutput.Distinct().Select(x => GroupSessionHelper.CreateRelationByAbsoluteId(x, idRoot)));
        }