示例#1
0
        public void WhenSourceIsAccessed_LazyRelation_CallsRepository_WithBothSourceAndDestinationId()
        {
            // Arrange
            var    context          = new FakeFrameworkContext();
            var    providerGroup    = GroupedProviderMockHelper.GenerateProviderGroup(1, 0, 50, context);
            var    idRoot           = new Uri("oh-yeah://this-is-my-root/");
            var    groupUnitFactory = new GroupUnitFactory(providerGroup.Writers, idRoot, FakeHiveCmsManager.CreateFakeRepositoryContext(context), context);
            HiveId int1             = HiveId.ConvertIntToGuid(1);
            HiveId int2             = HiveId.ConvertIntToGuid(2);

            // Act & Assert
            using (var uow = groupUnitFactory.Create())
            {
                var lazyRelation = new LazyRelation <TypedEntity>(uow.Repositories, FixedRelationTypes.DefaultRelationType, int1, int2, 0);

                IReadonlyRelation <IRelatableEntity, IRelatableEntity> blah = lazyRelation;
                IRelationById blah2 = lazyRelation;

                Assert.False(lazyRelation.IsLoaded);
                var source = lazyRelation.Source;
                Assert.True(lazyRelation.IsLoaded);
                var dest = lazyRelation.Destination;

                Assert.NotNull(source);
                Assert.NotNull(dest);
            }
        }
示例#2
0
        /// <summary>
        /// Changes an existing relation's source, destination and ordinal
        /// </summary>
        /// <param name="session"></param>
        /// <param name="originalRelation"></param>
        /// <param name="newSourceId"></param>
        /// <param name="newDestinationId"></param>
        /// <param name="newOrdinal"></param>
        public static void ChangeRelation(this ICoreRelationsRepository session, IRelationById originalRelation, HiveId newSourceId, HiveId newDestinationId, int newOrdinal = int.MinValue)
        {
            session.RemoveRelation(originalRelation);
            var useOrdinal = newOrdinal == int.MinValue ? originalRelation.Ordinal : newOrdinal;

            session.AddRelation(new Relation(originalRelation.Type, newSourceId, newDestinationId, useOrdinal, originalRelation.MetaData.ToArray()));
        }
        public void RemoveRelation(IRelationById item, AbstractScopedCache repositoryScopedCache)
        {
            var sessionIdAsString = GetSessionId().ToString("n");

            using (DisposableTimer.TraceDuration <NhSessionHelper>("In RemoveRelation for session " + sessionIdAsString, "End RemoveRelation for session " + sessionIdAsString))
            {
                var relationType = GetOrCreateNodeRelationType(item.Type.RelationName, repositoryScopedCache);

                // Nh should handle this for us but got an error with mappings atm in SqlCe (APN 09/11/11)
                // Clear session cache to make sure it loads all of the tags in order to delete them all
                NhSession.Flush();

                // Clear the repository cache of this relation in case one has been added and then removed in the same unit of work
                var cacheKey = GenerateCacheKeyForRelation(item, relationType);
                repositoryScopedCache.InvalidateItems(cacheKey);

                var sourceIdValue      = (Guid)item.SourceId.Value;
                var destinationIdValue = (Guid)item.DestinationId.Value;

                var existingRelation = GetDbRelation(relationType.Alias, sourceIdValue, destinationIdValue).ToArray();

                if (existingRelation.Any())
                {
                    existingRelation.ForEach(x => NhSession.Delete(x));
                }
            }
        }
示例#4
0
        public bool EqualsIgnoringProviderId(IRelationById other)
        {
            if (ReferenceEquals(other, null))
            {
                return(false);
            }
            if (ReferenceEquals(other, this))
            {
                return(true);
            }

            var equals = true;

            if (Type != other.Type)
            {
                equals = false;
            }
            if (!SourceId.EqualsIgnoringProviderId(other.SourceId))
            {
                equals = false;
            }
            if (!DestinationId.EqualsIgnoringProviderId(other.DestinationId))
            {
                equals = false;
            }
            if (!MetaData.OrderBy(x => x.Key).SequenceEqual(other.MetaData.OrderBy(x => x.Key)))
            {
                equals = false;
            }

            return(equals);
        }
示例#5
0
        public void RemoveRelation(IRelationById item)
        {
            var relationByIds = GetRelationsTable();
            var countBefore   = relationByIds.Count;

            relationByIds.RemoveAll(item.Equals);
            var success = countBefore != relationByIds.Count;
        }
示例#6
0
 public void RemoveRelation(IRelationById item)
 {
     ExecuteInCancellableTask(item,
                              TaskTriggers.Hive.Relations.PreRelationRemoved,
                              TaskTriggers.Hive.Relations.PostRelationRemoved,
                              () => ChildSessions.RemoveRelation(item));
     ;
 }
        /// <summary>
        /// Returns a composite Id to be used for a relation
        /// </summary>
        /// <param name="relation"></param>
        /// <returns></returns>
        internal static string GetCompositeId(this IRelationById relation)
        {
            Mandate.ParameterNotEmpty(relation.SourceId, "relation.SourceId");
            Mandate.ParameterNotEmpty(relation.DestinationId, "relation.DestinationId");
            Mandate.ParameterNotEmpty(relation.SourceId.Value, "relation.SourceId.Value");
            Mandate.ParameterNotEmpty(relation.DestinationId.Value, "relation.SourceId.Value");
            Mandate.ParameterNotNull(relation.Type, "relation.Type");
            Mandate.ParameterNotNullOrEmpty(relation.Type.RelationName, "relation.Type.RelationName");

            return(relation.SourceId.Value + "," + relation.DestinationId.Value + "," + relation.Type.RelationName);
        }
示例#8
0
        /// <summary>
        /// Removes the relation.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="transaction"></param>
        public void PerformRemoveRelation(IRelationById item, ExamineTransaction transaction)
        {
            Mandate.ParameterNotNull(item, "item");

            var delete = new LinearHiveIndexOperation()
            {
                OperationType = IndexOperationType.Delete,
                Id            = new Lazy <string>(item.GetCompositeId)
            };

            transaction.EnqueueIndexOperation(delete);
        }
示例#9
0
 public void RemoveRelation(IRelationById item)
 {
     PerformRemoveRelation(item);
     Transaction.CacheFlushActions.Add(() =>
     {
         if (!ContextCacheAvailable())
         {
             return;
         }
         HiveContext.GenerationScopedCache.RemoveWhereKeyMatches <HiveRelationCacheKey>(x => x.EntityId.Value == item.SourceId.Value || x.EntityId.Value == item.DestinationId.Value);
     });
 }
 protected virtual void NotifyRelationCache(IRelationById item)
 {
     if (!ContextCacheAvailable())
     {
         return;
     }
     Transaction.CacheFlushActions.Add(
         () =>
     {
         HiveContext.GenerationScopedCache.RemoveWhereKeyMatches <HiveRelationCacheKey>(
             x => x.EntityId.Value == item.SourceId.Value || x.EntityId.Value == item.DestinationId.Value);
     });
 }
示例#11
0
 public static IRelationById CreateRelationByAbsoluteId(IRelationById relation, Uri root)
 {
     if (relation == null)
     {
         return(null);
     }
     return(new RelationById(
                new HiveId(root, relation.SourceId.ProviderId, relation.SourceId.Value),
                new HiveId(root, relation.DestinationId.ProviderId, relation.DestinationId.Value),
                relation.Type,
                relation.Ordinal,
                relation.MetaData.ToArray()));
 }
示例#12
0
 protected override void PerformRemoveRelation(IRelationById relation)
 {
     if (relation.Type.RelationName != FixedRelationTypes.DefaultRelationType.RelationName)
     {
         var sourceMd5     = relation.SourceId.Value.ToString().ToMd5();
         var destMd5       = relation.DestinationId.Value.ToString().ToMd5();
         var searchPattern = sourceMd5 + "-" + destMd5 + ".xml";
         if (Directory.Exists(Settings.RelationsStoragePath))
         {
             var files = Directory.GetFiles(Settings.RelationsStoragePath, searchPattern);
             foreach (var filePath in files)
             {
                 System.IO.File.Delete(filePath);
             }
         }
     }
 }
        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));
        }
        private static IReadonlyRelation <IRelatableEntity, IRelatableEntity> CreateLazyOrUseExistingRelation <T>(
            ICoreReadonlyRepository <T> readonlyRepository, IRelationById relationById) where T : class, IRelatableEntity
        {
            // Check if the repository has actually already eagerly loaded the relation in which case we can just return that
            var upCast = relationById as IReadonlyRelation <IRelatableEntity, IRelatableEntity>;

            if (upCast != null && upCast.Source != null && upCast.Destination != null)
            {
                return(upCast);
            }

            // Otherwise, return a LazyRelation to load on demand
            return(new LazyRelation <T>(
                       readonlyRepository,
                       relationById.Type,
                       relationById.SourceId,
                       relationById.DestinationId,
                       relationById.Ordinal,
                       relationById.MetaData.ToArray()));
        }
示例#15
0
 /// <summary>
 /// Updates a relation to be of a new relation type
 /// </summary>
 /// <param name="session"></param>
 /// <param name="originalRelation"></param>
 /// <param name="newRelationType"></param>
 public static void ChangeRelationType(this ICoreRelationsRepository session, IRelationById originalRelation, RelationType newRelationType)
 {
     session.RemoveRelation(originalRelation);
     session.AddRelation(new Relation(newRelationType, originalRelation.SourceId, originalRelation.DestinationId, originalRelation.Ordinal, originalRelation.MetaData.ToArray()));
 }
 public HiveRelationByIdPostActionEventArgs(IRelationById relation, AbstractScopedCache scopedCache)
     : base(scopedCache)
 {
     Relation = relation;
 }
示例#17
0
 protected override void PerformRemoveRelation(IRelationById item)
 {
     _helper.CacheHelper.RemoveRelation(item);
 }
 public void RemoveRelation(IRelationById item)
 {
     ChildSessions.RemoveRelation(item);
 }
 protected override void PerformRemoveRelation(IRelationById item)
 {
     Helper.PerformDelete(item.GetCompositeId(), ExamineTransaction);
 }
 internal static void RemoveRelation(this IEnumerable <ICoreRelationsRepository> session, IRelationById relation)
 {
     foreach (var relationsRepository in session)
     {
         relationsRepository.RemoveRelation(relation);
     }
 }
示例#21
0
 protected abstract void PerformRemoveRelation(IRelationById item);
示例#22
0
 protected override void PerformRemoveRelation(IRelationById item)
 {
     Helper.RemoveRelation(item, this.RepositoryScopedCache);
 }
示例#23
0
 private void ExecuteInCancellableTask(IRelationById entity, string preActionTaskTrigger, string postActionTaskTrigger, Action execution)
 {
     FrameworkContext.TaskManager.ExecuteInCancellableTask(this, entity, preActionTaskTrigger, postActionTaskTrigger, execution, x => new HiveRelationByIdPreActionEventArgs(x, UnitScopedCache), x => new HiveRelationByIdPostActionEventArgs(x, UnitScopedCache), FrameworkContext);
 }
 public void RemoveRelation(IRelationById item)
 {
     Transaction.EnsureBegun();
     PerformRemoveRelation(item);
 }
示例#25
0
 internal static IRelationById CreateRelationByIdWithProviderId(ProviderMetadata providerMetadata, IRelationById relation)
 {
     if (relation == null)
     {
         return(null);
     }
     return(new RelationById(
                CreateMappedProviderId(providerMetadata, relation.SourceId),
                CreateMappedProviderId(providerMetadata, relation.DestinationId),
                relation.Type,
                relation.Ordinal,
                relation.MetaData.ToArray()));
 }
 protected override void PerformRemoveRelation(IRelationById item)
 {
     return;
 }
示例#27
0
 protected override void PerformRemoveRelation(IRelationById item)
 {
     throw new NotImplementedException();
 }
 public HiveRelationByIdPostActionEventArgs(IRelationById relation, AbstractScopedCache scopedCache)
     : base(scopedCache)
 {
     Relation = relation;
 }
 public void RemoveRelation(IRelationById item)
 {
     PerformRemoveRelation(item);
 }
 private static string GenerateCacheKeyForRelation(IRelationById item, NodeRelationType nodeRelationType)
 {
     return(GenerateCacheKeyForRelation(nodeRelationType, item.SourceId, item.DestinationId));
 }