Beispiel #1
0
        protected virtual void FlushTempStorage()
        {
            List <EntityContext> nextFlushEntities = new List <EntityContext>();

            do
            {
                foreach (EntityContext entityContext in nextFlushEntities)
                {
                    List <IPersistentStorage> storage      = _setup.GetPersistentStorages(entityContext.Description);
                    IFlushStrategy            flushTrigger = _setup.GetFlushTrigger(entityContext.Description);

                    flushTrigger.SetNextFlushCount(entityContext);
                    flushTrigger.SetNextReleaseCount(entityContext);

                    if (entityContext.Description.InsertToPersistentStorageBeforeUse)
                    {
                        _setup.TemporaryStorage.GenerateStorageIds(entityContext, storage);
                    }

                    _setup.TemporaryStorage.FlushToPersistent(entityContext, storage);
                }

                _setup.TemporaryStorage.WaitAllTasks();

                nextFlushEntities = _entityContexts.Values
                                    .Where(x => x.EntityProgress.ReleasedCount < x.EntityProgress.CurrentCount)
                                    .ToList();
            } while (nextFlushEntities.Count > 0);

            _setup.TemporaryStorage.WaitAllTasks();
        }
        //Flush required checks
        public virtual bool CheckIsFlushRequired(EntityContext entityContext)
        {
            EntityProgress progress          = entityContext.EntityProgress;
            bool           isFlushInProgress = progress.IsFlushInProgress();

            if (isFlushInProgress)
            {
                return(false);
            }

            //NextReleaseCount will be used by child entities to check if they still can generate from this parent
            IFlushStrategy flushTrigger = _generatorSetup.GetFlushTrigger(entityContext.Description);

            flushTrigger.SetNextReleaseCount(entityContext);

            //when all entities are generated also should flush
            bool isFlushRequired = flushTrigger.IsFlushRequired(entityContext);
            bool isCompleted     = progress.CurrentCount >= progress.TargetCount;

            if (isCompleted)
            {
                isFlushRequired = true;
            }
            if (!isFlushRequired)
            {
                //if flush is not required NextFlushCount should not be updated
                //isFlushInProgress is using NextFlushCount
                return(isFlushRequired);
            }

            //update next flush count
            flushTrigger.SetNextFlushCount(entityContext);

            //add to flush candidates if will be used by dependent children
            bool hasDependentChild = FindChildThatCanGenerate(entityContext, true) != null;

            if (hasDependentChild)
            {
                _flushCandidates.Add(entityContext);
            }

            return(isFlushRequired);
        }
Beispiel #3
0
        //Generation prestart checks
        /// <summary>
        /// Validate that all required parameters were set for each entity or among default parameters.
        /// </summary>
        /// <param name="entityDescriptions"></param>
        public virtual void CheckGeneratorSetupComplete(Dictionary <Type, IEntityDescription> entityDescriptions)
        {
            ISupervisor supervisor = _generatorSetup.Supervisor;

            if (supervisor == null)
            {
                throw new ArgumentNullException(nameof(_generatorSetup.Supervisor));
            }

            foreach (IEntityDescription description in entityDescriptions.Values)
            {
                string msgFormat = $"Entity description [{description.Type}] did not have {{0}} configured and {nameof(GeneratorSetup)} {{1}} was not provided";

                IQuantityProvider quantityProvider = description.QuantityProvider
                                                     ?? _generatorSetup.DefaultQuantityProvider;
                if (quantityProvider == null)
                {
                    string defName = nameof(_generatorSetup.DefaultFlushStrategy);
                    string msg     = string.Format(msgFormat
                                                   , nameof(description.QuantityProvider), defName);
                    throw new ArgumentNullException(defName, msg);
                }

                IGenerator generator = description.Generator
                                       ?? _generatorSetup.DefaultGenerator;
                if (generator == null)
                {
                    string defName = nameof(_generatorSetup.DefaultFlushStrategy);
                    string msg     = string.Format(msgFormat
                                                   , nameof(description.QuantityProvider), defName);
                    throw new ArgumentNullException(defName, msg);
                }

                List <IPersistentStorage> persistentStorages = description.PersistentStorages
                                                               ?? _generatorSetup.DefaultPersistentStorages;
                if (persistentStorages == null || persistentStorages.Count == 0)
                {
                    string defName = nameof(_generatorSetup.DefaultPersistentStorages);
                    string msg     = string.Format(msgFormat
                                                   , nameof(description.PersistentStorages), defName);
                    throw new ArgumentNullException(defName, msg);
                }

                IFlushStrategy insertTrigger = description.FlushTrigger
                                               ?? _generatorSetup.DefaultFlushStrategy;
                if (insertTrigger == null)
                {
                    string defName = nameof(_generatorSetup.DefaultFlushStrategy);
                    string msg     = string.Format(msgFormat
                                                   , nameof(description.FlushTrigger), defName);
                    throw new ArgumentNullException(defName, msg);
                }

                if (description.Required != null)
                {
                    foreach (RequiredEntity required in description.Required)
                    {
                        ISpreadStrategy spreadStrategy = required.SpreadStrategy
                                                         ?? _generatorSetup.DefaultSpreadStrategy;
                        if (spreadStrategy == null)
                        {
                            string defName = nameof(_generatorSetup.DefaultSpreadStrategy);
                            string msg     = $"Entity description [{description.Type}] with required type [{required.Type}] did not have {nameof(RequiredEntity.SpreadStrategy)} configured and {nameof(GeneratorSetup)} {defName} was not provided";
                            throw new ArgumentNullException(defName, msg);
                        }
                    }
                }
            }
        }