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); }
//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); } } } } }