Esempio n. 1
0
        protected virtual Dictionary <Type, object> GetRequiredEntities()
        {
            var result = new Dictionary <Type, object>();

            foreach (RequiredEntity requiredEntity in EntityContext.Description.Required)
            {
                Type          parent = requiredEntity.Type;
                EntityContext parentEntityContext = _entityContexts[parent];

                ISpreadStrategy spreadStrategy    = _setup.GetSpreadStrategy(EntityContext.Description, requiredEntity);
                long            parentEntityIndex = spreadStrategy.GetParentIndex(parentEntityContext, EntityContext);

                object parentEntity = _setup.TemporaryStorage.Select(parentEntityContext, parentEntityIndex);
                result.Add(parent, parentEntity);
            }

            return(result);
        }
        protected virtual bool CheckChildCanGenerate(EntityContext child,
                                                     EntityContext parent, bool onlyCheckCanGenerate)
        {
            Type            typeToFlush    = parent.Type;
            RequiredEntity  requiredParent = child.Description.Required.First(x => x.Type == typeToFlush);
            ISpreadStrategy spreadStrategy = _generatorSetup.GetSpreadStrategy(child.Description, requiredParent);

            //check if child can still use parent entities from temporary storage to generate
            bool canGenerateMore = spreadStrategy.CanGenerateFromParentNextReleaseCount(parent, child);

            if (onlyCheckCanGenerate)
            {
                return(canGenerateMore);
            }

            //check if child is not a flush candidate itself
            bool childIsFlushCandidate = _flushCandidates.Contains(child);

            return(!childIsFlushCandidate && canGenerateMore);
        }
        protected virtual void AddRequiredParentsRecursive(EntityContext child, Stack <OrderIterationType> generationOrder)
        {
            if (child.Description.Required == null)
            {
                return;
            }

            foreach (RequiredEntity requiredEntity in child.Description.Required)
            {
                EntityContext   parent         = _entityContexts[requiredEntity.Type];
                ISpreadStrategy spreadStrategy = _generatorSetup.GetSpreadStrategy(child.Description, requiredEntity);

                long parentRequiredCount = spreadStrategy.GetNextIterationParentCount(parent, child);
                long parentNewItemsCount = parentRequiredCount - parent.EntityProgress.CurrentCount;

                bool added = PushQueueItem(generationOrder, requiredEntity.Type, parentNewItemsCount);
                if (added)
                {
                    AddRequiredParentsRecursive(parent, generationOrder);
                }
            }
        }
Esempio n. 4
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);
                        }
                    }
                }
            }
        }