/// <summary> /// Modifie les données d'un SelectorInstance. Les données sont d'abord sauvées, puis le SelectorInstance passe en Act et en Constraints. /// </summary> /// <param name="selectorInstanceId">Id du SelectorInstance</param> /// <param name="values">Valeurs à modifier</param> /// <remarks>Les valeurs à modifier sont au format suivant : {id de la cellule}:{nouvelle valeur}</remarks> /// <returns>Message à modifier</returns> public async Task <HttpResponseMessageResult> SaveData(long selectorInstanceId, IEnumerable <KeyValuePair <long, double> > values) { // Création de la transaction using (IDbContextTransaction transaction = UnitOfWork.GetDbContext().Database.BeginTransaction()) { SessionStatsHelper.HttpHitSaveDBTransaction(transaction, _serviceProvider); // Recherche du selectorInstance List <SelectorInstance> lstSelectInst = await UnitOfWork.GetDbContext().SelectorInstance .Where(si => si.Id == selectorInstanceId) .Include(si => si.SelectorConfig) .Include(si => si.WorkflowInstance) .ThenInclude(wfi => wfi.WorkflowConfig) .ToAsyncEnumerable() .ToList(); SelectorInstance selectorInstance = lstSelectInst.FirstOrDefault(); if (selectorInstance == null) { throw new WrongParameterException($"SelectorEngine.SaveData: bad SelectorInstance Id ({selectorInstanceId})."); } // On pousse les valeurs volatiles vers les futures valeurs. HttpResponseMessageResult res = await SelectorInstanceDomain.PushVolatileToFuture(selectorInstance); // Passage aux étapes suivantes UnitOfWork.SelectorInstanceRepository.PrepareUpdateForObject(selectorInstance); res.Append(await NextStep(selectorInstance, selectorInstance.WorkflowInstance, SelectorStateEnum.Init, values)); transaction.Commit(); return(res); } }
/// <summary> /// Enregistre les valeurs modifiées dans la table temporaire correspondant au SelectorInstance donné. /// </summary> /// <param name="selectIns">SelectorInstance</param> /// <param name="wfInst">WorkflowInstance</param> /// <param name="values">Valeurs à modifier</param> /// <returns>Message de retour</returns> public async Task <HttpResponseMessageResult> SaveDataInTemporyTable(SelectorInstance selectIns, WorkflowInstance wfInst, IEnumerable <KeyValuePair <long, double> > values) { // Transaction IDbContextTransaction transaction = SessionStatsHelper.HttpHitGetDBTransaction(_serviceProvider); if (transaction == null) { throw new DatabaseException("GridConfigurationDomain.SaveDataInTemporyTable: impossible to retrieve transaction connexion."); } IEnumerable <string> cols = await GetColumnsFromGridConfiguration(selectIns, wfInst); StringBuilder qryUpdate = new StringBuilder(); string nomTable = cols.ElementAt(0); // le 1er élément est le nom de la table temporaire qryUpdate.AppendLine($"UPDATE {nomTable}"); qryUpdate.AppendLine($"SET "); StringBuilder qryCase = new StringBuilder(); foreach (KeyValuePair <long, double> kvp in values) { qryCase.AppendLine($"WHEN {kvp.Key} THEN '{kvp.Value.ToString(CultureInfo.InvariantCulture)}'"); } foreach (string col in cols.Where(c => c.EndsWith("_ID"))) { string colVal = col.Substring(0, col.IndexOf("_ID")) + "_VAL"; qryUpdate.AppendLine($"{colVal} = "); qryUpdate.AppendLine($"CASE {col}"); qryUpdate.Append(qryCase); qryUpdate.AppendLine($"ELSE {colVal}"); qryUpdate.AppendLine("END,"); } // Nettoyage qryUpdate.SkipComma(); // Exécution de la requete de création de table temporaire. int nbrQry = await ExecSqlHelper.ExecuteNonQueryTransactionAsync(qryUpdate.ToString(), transaction); return(new HttpResponseMessageResult() { IsSuccess = nbrQry > 0 }); }
/// <summary> /// Créé la table temporaire pour un selectorInstance, selon la configuration de grid définie pour le WorkflowConfig lié. /// </summary> /// <param name="selectorInstance">Instance du SelectorInstance</param> /// <param name="wfInstance">Instance du WorkflowInstance</param> /// <returns>Message de retour</returns> public async Task <HttpResponseMessageResult> CreateDataTableDB(SelectorInstance selectorInstance, WorkflowInstance wfInstance) { // Transaction IDbContextTransaction transaction = SessionStatsHelper.HttpHitGetDBTransaction(_serviceProvider); if (transaction == null) { throw new DatabaseException("GridConfigurationDomain.CreateDataTableDB: impossible to retrieve transaction connexion."); } HttpResponseMessageResult res = new HttpResponseMessageResult() { IsSuccess = true }; // On récupére la configuration de l'opérateur List <GridConfig> lstGridConf = await UnitOfWork.GetDbContext().GridConfig .Include(gc => gc.ColumnDimensions) .ThenInclude(gdc => gdc.Values) .Include(gc => gc.RowDimensions) .ThenInclude(gdc => gdc.Values) .Include(gc => gc.FixedDimensions) .ThenInclude(gdc => gdc.Values) .Include(gc => gc.WorkflowConfig) .Where(gc => gc.WorkflowConfig.Id == wfInstance.WorkflowConfig.Id) .AsNoTracking() .ToAsyncEnumerable() .ToList(); GridConfig gridConf = lstGridConf.FirstOrDefault(); if (gridConf == null) { throw new SequenceException($"GridConfigurationDomain.CreateDataTableDB: no grid configuration for WorkflowConfig ({wfInstance.WorkflowConfig.Id})."); } // Construction de la requête StringBuilder query = new StringBuilder(); string nomTable = string.Format(Constant.TEMPLATE_TEMPORARY_TABLENAME, selectorInstance.Id.ToString()); List <string> nomCols = new List <string>(); IEnumerable <DistributionDimensionGrid> lstDistCols = GenerateDistribution(gridConf.ColumnDimensions); query.AppendLine($"CREATE TABLE {nomTable}("); query.AppendLine("ID bigint IDENTITY(1,1) NOT NULL,"); foreach (GridDimensionConfig fixes in gridConf.FixedDimensions.OrderBy(c => c.Order)) { string nomCol = ((int)fixes.InternalName).ToString(); query.AppendLine($"Dim{nomCol} nvarchar(max) NULL,"); nomCols.Add($"Dim{nomCol}"); } foreach (GridDimensionConfig row in gridConf.RowDimensions.OrderBy(r => r.Order)) { string nomCol = ((int)row.InternalName).ToString(); query.AppendLine($"Dim{nomCol} nvarchar(max) NULL,"); nomCols.Add($"Dim{nomCol}"); } foreach (DistributionDimensionGrid ddg in lstDistCols) { query.AppendLine($"{ddg.ColumnName}_ID bigint NOT NULL,"); query.AppendLine($"{ddg.ColumnName}_VAL float NOT NULL,"); nomCols.Add($"{ddg.ColumnName}_ID"); nomCols.Add($"{ddg.ColumnName}_VAL"); } query.SkipComma(); query.AppendLine(")"); // Exécution de la requete de création de table temporaire. int nbrQry = await ExecSqlHelper.ExecuteNonQueryTransactionAsync(query.ToString(), transaction); // Insertion des données dans la table temporaire. StringBuilder qryInsert = new StringBuilder(); qryInsert.AppendLine($"INSERT INTO {nomTable} ("); foreach (string nomCol in nomCols) { qryInsert.AppendLine($"{nomCol},"); } // Nettoyage qryInsert.SkipComma(); qryInsert.AppendLine(")"); qryInsert.AppendLine("SELECT "); List <string> groupedCols = new List <string>(); foreach (GridDimensionConfig fixes in gridConf.FixedDimensions.OrderBy(c => c.Order)) { string nomCol = fixes.InternalName.ToString(); qryInsert.AppendLine($"{nomCol},"); groupedCols.Add(nomCol); } foreach (GridDimensionConfig row in gridConf.RowDimensions.OrderBy(r => r.Order)) { string nomCol = row.InternalName.ToString(); qryInsert.AppendLine($"{nomCol},"); groupedCols.Add(nomCol); } foreach (DistributionDimensionGrid ddg in lstDistCols) { StringBuilder sbQry = new StringBuilder(); foreach (KeyValuePair <InternalNameDimension, string> pair in ddg.Selection) { if (sbQry.Length > 0) { sbQry.Append(" AND "); } sbQry.Append($"{pair.Key.ToString()} = '{pair.Value}'"); } qryInsert.AppendLine("MAX("); qryInsert.AppendLine("CASE"); qryInsert.Append("WHEN "); qryInsert.Append(sbQry); qryInsert.AppendLine(" THEN ID"); qryInsert.AppendLine("ELSE 0"); qryInsert.AppendLine("END"); qryInsert.AppendLine($"),"); qryInsert.AppendLine("MAX("); qryInsert.AppendLine("CASE"); qryInsert.Append("WHEN "); qryInsert.Append(sbQry); qryInsert.AppendLine(" THEN CurrentValue"); qryInsert.AppendLine("ELSE 0"); qryInsert.AppendLine("END"); qryInsert.AppendLine($"),"); } // Nettoyage qryInsert.SkipComma(); qryInsert.AppendLine("FROM ValueObject"); // Jointure avec la table de liaison qryInsert.AppendLine("WHERE ID IN ("); qryInsert.AppendLine($"SELECT ValueObjectId FROM SelectorInstanceValueObject WHERE SelectorInstanceId = {selectorInstance.Id} "); qryInsert.AppendLine(")"); qryInsert.Append("GROUP BY "); groupedCols.Reverse(); // Inverser pour la clause GROUP BY foreach (string grpCol in groupedCols) { qryInsert.Append($"{grpCol},"); } // Nettoyage qryInsert.SkipComma(); nbrQry = await ExecSqlHelper.ExecuteNonQueryTransactionAsync(qryInsert.ToString(), transaction); return(res); }
/// <summary> /// This method permits to open and start the workflow /// </summary> /// <param name="workflowConfig">WorkflowConfig Id</param> /// <param name="dataSet">DataSet Id</param> public async Task <HttpResponseMessageResult> Open(long workflowConfigId, long dataSetId, long idUserSet) { // Création de la transaction using (IDbContextTransaction transaction = UnitOfWork.GetDbContext().Database.BeginTransaction()) { SessionStatsHelper.HttpHitSaveDBTransaction(transaction, _serviceProvider); // On récupére les entités WorkflowConfig wfConf = await UnitOfWork.GetDbContext().WorkflowConfig .Include(wf => wf.SelectorConfig) .ThenInclude(sc => sc.Criterias) .ThenInclude(c => c.Dimension) .Include(wf => wf.SelectorConfig) .ThenInclude(sc => sc.Modifiers) .ThenInclude(c => c.Dimension) .Include(wf => wf.SelectorConfig) .ThenInclude(sc => sc.Validators) .ThenInclude(c => c.Dimension) .Include(wf => wf.SelectorConfig) .ThenInclude(sc => sc.ModifyCriterias) .ThenInclude(c => c.Dimension) .Include(wf => wf.WorkflowDimension) .ThenInclude(wd => wd.Dimension) .Where(wf => wf.Id == workflowConfigId) .AsNoTracking() .ToAsyncEnumerable() .FirstOrDefault(); DataSet dtSet = await UnitOfWork.GetDbContext().DataSet .Include(d => d.DataSetDimensions) .Where(d => d.Id == dataSetId) .AsNoTracking() .ToAsyncEnumerable() .FirstOrDefault(); UserSet usrSet = await UnitOfWork.GetDbContext().UserSet .Where(u => u.Id == idUserSet) .AsNoTracking() .ToAsyncEnumerable() .FirstOrDefault(); if ((wfConf == null) || (dtSet == null) || (usrSet == null)) { return new HttpResponseMessageResult() { IsSuccess = false, Message = $"Can't get WorkflowConfig with id {workflowConfigId}, DataSet with id {dataSetId}, UserSet with id {idUserSet}" } } ; if (!CheckDimensions(wfConf, dtSet, usrSet)) { throw new SequenceException("Process.Open: WorkflowDimensions are not equals to DataSetDimensions."); } // Create the workflow instance WorkflowInstance workflowInstance = await WorkflowInstanceDomain.CreateInstance(wfConf, dtSet, usrSet); // Générer les SelectorInstance. HttpResponseMessageResult res = await WorkflowInstanceDomain.StartSelectorsIntances(workflowInstance); transaction.Commit(); return(res); } }