OK deduplica tramite ciclo + stored relative!!!

This commit is contained in:
Samuele Locatelli
2023-10-21 11:23:32 +02:00
parent a371b55511
commit edae1a19ec
6 changed files with 202 additions and 43 deletions
+196 -37
View File
@@ -9,6 +9,7 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using ZXing;
using static EgwCoreLib.Utils.DtUtils;
@@ -553,43 +554,197 @@ namespace MP.Data.Controllers
public async Task<bool> FluxLogDataRedux(string idxMaccSel, List<string> fluxList, Periodo currPeriodo, Enum.ValSelection valMode, Enum.DataInterval intReq)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
TimeSpan step = TimeSpan.FromHours(1);
switch (intReq)
{
// ora recupero TUTTI i dati della macchina
var dbResult = await dbCtx
.DbSetFluxLog
.Where(x => (x.dtEvento >= currPeriodo.Inizio && x.dtEvento <= currPeriodo.Fine) && (x.IdxMacchina == idxMaccSel))
.ToListAsync();
TimeSpan step = TimeSpan.FromHours(1);
switch (intReq)
case Enum.DataInterval.minute:
step = TimeSpan.FromMinutes(1);
break;
case Enum.DataInterval.hour:
step = TimeSpan.FromHours(1);
break;
case Enum.DataInterval.day:
step = TimeSpan.FromDays(1);
break;
default:
break;
}
// setup parametri costanti x stored
var pIdxMacchina = new SqlParameter("@IdxMacchina", idxMaccSel);
var pOnlyTest = new SqlParameter("@OnlyTest", false);
var pDoReIndex = new SqlParameter("@DoReIndex", false); // sarà cambiato solo alla fine x avere un reindex finale x macchina
// processo 1:1 ogni flusso
foreach (var item in fluxList)
{
// parametri x flusso
var pCodFlux = new SqlParameter("@CodFlux", item);
// inizializzo cursore timer
DateTime dtCursStart = currPeriodo.Inizio;
DateTime dtCursEnd = dtCursStart.Add(step);
bool setCompleted = false;
// dbCOntext x ogni singolo flusso
using (var dbCtx = new MoonProContext(_configuration))
{
case Enum.DataInterval.minute:
step = TimeSpan.FromMinutes(1);
break;
case Enum.DataInterval.hour:
step = TimeSpan.FromHours(1);
break;
case Enum.DataInterval.day:
step = TimeSpan.FromDays(1);
break;
default:
break;
}
// processo 1:1 ogni flusso
foreach (var item in fluxList)
{
DateTime dtCursor = currPeriodo.Inizio;
// dati da processare
var currFlux = dbResult
.Where(x => x.CodFlux == item)
.ToList();
// li processo per intervallo richiesto, cercando dati nel periodo e selezionando VC
while (currFlux.Count > 0)
while (!setCompleted)
{
// ora recupero TUTTI i dati della macchina
var currFlux = await dbCtx
.DbSetFluxLog
.Where(x => (x.CodFlux == item) && (x.dtEvento >= dtCursStart && x.dtEvento < dtCursEnd) && (x.IdxMacchina == idxMaccSel))
.ToListAsync();
// incremento dt fine periodo
dtCursor = dtCursor.Add(step);
dtCursStart = dtCursEnd;
dtCursEnd = dtCursStart.Add(step);
int numRec = currFlux.Count;
if (numRec > 1)
{
if (dtCursStart > currPeriodo.Fine)
{
setCompleted = true;
}
#if false
//var set2del = currFlux;
//switch (valMode)
//{
// case Enum.ValSelection.First:
// // tolgo il primo (che quindi lascio)
// set2del.RemoveAt(0);
// break;
// case Enum.ValSelection.Last:
// set2del.RemoveAt(numRec - 1);
// break;
// case Enum.ValSelection.Center:
// set2del.RemoveAt(numRec / 2);
// break;
// default:
// break;
//}
//dbCtx.DbSetFluxLog.RemoveRange(set2del);
#endif
#if false
switch (valMode)
{
case Enum.ValSelection.First:
// tolgo il primo (che quindi lascio)
currFlux.RemoveAt(0);
break;
case Enum.ValSelection.Last:
currFlux.RemoveAt(numRec - 1);
break;
case Enum.ValSelection.Center:
currFlux.RemoveAt(numRec / 2);
break;
default:
break;
}
dbCtx.RemoveRange(currFlux);
dbCtx.ChangeTracker.DetectChanges();
Log.Trace(dbCtx.ChangeTracker.DebugView.LongView);
try
{
// salvo
await dbCtx.SaveChangesAsync(false);
}
catch (Exception exc)
{
Log.Error($"Eccezione in deduplica dati FluxLog{Environment.NewLine}{exc}");
}
#endif
List<Periodo> listPeriodi = new List<Periodo>();
switch (valMode)
{
case Enum.ValSelection.First:
// recupero 2° item
var recStart = currFlux.Skip(1).FirstOrDefault();
// salvo periodo!
listPeriodi.Add(new Periodo(recStart.dtEvento, dtCursEnd));
break;
case Enum.ValSelection.Last:
// recupero ultimo item
var recEnd = currFlux.LastOrDefault();
// salvo periodo!
listPeriodi.Add(new Periodo(dtCursStart, recEnd.dtEvento));
break;
case Enum.ValSelection.Center:
var recCent = currFlux.Skip(numRec / 2).FirstOrDefault();
// salvo 2 periodi!
listPeriodi.Add(new Periodo(dtCursStart, recCent.dtEvento));
listPeriodi.Add(new Periodo(recCent.dtEvento.AddSeconds(1), dtCursEnd));
break;
default:
break;
}
// ciclo x tutti i periodi e chiamo stored...
foreach (var slot in listPeriodi)
{
// parametri x periodo (base)
var pDtStart = new SqlParameter("@DtStart", slot.Inizio);
var pDtEnd = new SqlParameter("@DtEnd", slot.Fine);
var dbResult = dbCtx
.Database
.ExecuteSqlRaw("EXEC man.stp_ReduceFluxLog @IdxMacchina, @CodFlux, @DtStart, @DtEnd, @OnlyTest, @DoReIndex", pIdxMacchina, pCodFlux, pDtStart, pDtEnd, pOnlyTest, pDoReIndex);
}
#if false
if (dtCursStart > currPeriodo.Fine)
{
setCompleted = true;
}
var currSet = currFlux.ToList();
if (currSet.Count > 0)
{
switch (valMode)
{
case Enum.ValSelection.First:
// tolgo il primo (che quindi lascio)
currSet.RemoveAt(0);
break;
case Enum.ValSelection.Last:
currSet.RemoveAt(currSet.Count - 1);
break;
case Enum.ValSelection.Center:
currSet.RemoveAt(currSet.Count / 2);
break;
default:
break;
}
//// elimino i dati processati
//foreach (var item2del in currSet)
//{
// currFlux.Remove(item2del);
//}
dbCtx.DbSetFluxLog.RemoveRange(currSet);
try
{
// salvo
dbCtx.SaveChanges();
}
catch (Exception exc)
{
Log.Error($"Eccezione in deduplica dati FluxLog{Environment.NewLine}{exc}");
}
}
#endif
#if false
// seleziono dati da processare
var currSet = currFlux.Where(x => x.dtEvento < dtCursor).ToList();
var currSet = currFlux.Where(x => x.dtEvento < dtCursStart).ToList();
if (currSet.Count > 0)
{
switch (valMode)
@@ -608,12 +763,16 @@ namespace MP.Data.Controllers
break;
}
// elimino i dati processati
//// elimino i dati processati
//foreach (var item2del in currSet)
//{
// currFlux.Remove(item2del);
//}
dbCtx.DbSetFluxLog.RemoveRange(currSet);
try
{
// salvo
await dbCtx.SaveChangesAsync();
dbCtx.SaveChanges();
}
catch (Exception exc)
{
@@ -621,15 +780,15 @@ namespace MP.Data.Controllers
}
// tengo solo i dati successivi x prossimo giro...
currFlux = currFlux.Where(x => x.dtEvento >= dtCursor).ToList();
currFlux = currFlux.Where(x => x.dtEvento >= dtCursStart).ToList();
}
#endif
}
}
// salvo
await dbCtx.SaveChangesAsync();
}
}
await Task.Delay(1500);
//await Task.Delay(1500);
return fatto;
}