Files
MoonPro.net/MapoDb/FluxArchive.cs
T
2019-11-17 14:23:54 +01:00

234 lines
8.5 KiB
C#

using MapoSDK;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace MapoDb
{
/**************************************************************
* Classe gestione FluxLog
*
* automaticamente gestisce dati su SqlServer / Redis (+recenti)
* oppure su MongoDB (+ vecchi)
*
* rif x mongoDB
*
* rif x windows setup (abilitazione firewall, remote access, auth...)
*
* https://docs.mongodb.com/manual/tutorial/configure-windows-netsh-firewall/
* https://www.configserverfirewall.com/mongodb/mongodb-allow-remote-connections/
* https://www.shellhacks.com/mongodb-allow-remote-access/
* https://stackoverflow.com/questions/3891657/setup-mongodb-on-windows-server-2008
*
* (conf file in C:\Program Files\MongoDB\Server\4.2\bin)
*
*
* test rilettura: https://stackoverflow.com/questions/2943222/find-objects-between-two-dates-mongodb
* https://studio3t.com/knowledge-base/articles/mongodb-find-method/
* https://github.com/mongodb/mongo-csharp-driver
* http://www.binaryheap.com/tech/time-series-data-in-mongodb/
* https://www.codeproject.com/Tips/760099/Resampling-and-merging-time-series-data-using-LINQ
* https://docs.microsoft.com/it-it/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-3.0&tabs=visual-studio
* https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz
* https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-2-retrieving-mrlbeanm5
* https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka
*************************************************************/
/// <summary>
/// Classe che si occupa di gestire i dati di flusso
/// - i dati inizialmente sono in REDIS e DB quando accumulati da IOB
/// - successivamente i dati vengono archiviati come oggetti BSON in MongoDB
/// </summary>
public class FluxArchive
{
string mdbConnString = "mongodb://W2019-MONGODB:27017";
//string mdbConnString = "mongodb://localhost:27017";
MongoClient client;
IMongoDatabase database;
public FluxArchive()
{
// rifare avvio con lettura da web.config...
client = new MongoClient(mdbConnString);
database = client.GetDatabase("MAPO");
}
public static FluxArchive man = new FluxArchive();
/// <summary>
/// Effettua il trasferimento dati da SqlDB a MongoDB
/// </summary>
/// <param name="data2transfer">data di aprtenza</param>
/// <param name="numDays">num giorni da trasferire</param>
public exeResult trasferData(DateTime data2transfer, int numDays)
{
exeResult answ = new exeResult();
StringBuilder sb = new StringBuilder();
Stopwatch sw = new Stopwatch();
#if false
// Oggetto dove verserò i dati
List<tsGrouped> listaRecords = new List<tsGrouped>();
tsGrouped currRecord = null;
List<tsData> valori = new List<tsData>();
tsData campione = null;
#endif
DateTime tStamp;
//string filtro = "";
//string sort = "idxMacchina ASC, codFlux ASC, dtEvento DESC";
//string currFlux = "";
//string currMacc = "";
int totRec = 0;
// faccio ciclo su gg richiesti...
for (int i = 0; i < numDays; i++)
{
tStamp = data2transfer.AddDays(i);
// leggo da DB i records...
sw.Start();
sb.AppendLine($"Inizio processing periodo {tStamp} --> {tStamp.AddDays(1)}");
DS_applicazione.FluxLogDataTable tabDati = DataLayer.obj.taFL.getFiltOrd("", tStamp, tStamp.AddDays(1), true);
sb.AppendLine($"Effettuata lettura DB: {tabDati.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
sw.Restart();
// chiamo procedura x conversione
List<tsGrouped> risultato = convertTable(tabDati, tStamp, timeWindow.day);
sb.AppendLine($"Generata collezione di {risultato.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
sw.Restart();
// oggetto gestione dati ts raggruppati
var collection = database.GetCollection<tsGrouped>("FluxLog");
// salvo in blocco
collection.InsertMany(risultato);
sb.AppendLine($"Salvata su MongoDb collezione di {risultato.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
#if false
//filtro = $"dtEvento >= #{tStamp:yyyy-MM-dd HH:mm:00}# AND dtEvento <= #{tStamp.AddHours(1):yyyy-MM-dd HH:mm:00}#";
//var tabDay = (DS_applicazione.FluxLogRow[])tabDati.Select(filtro, sort);
//foreach (var item in tabDay)
foreach (var item in tabDati)
{
// controllo flusso x nuovo record...
if (item.CodFlux != currFlux || item.IdxMacchina != currMacc)
{
// salvo il VECCHIO record...
if (currRecord != null)
{
currRecord.samples = valori;
listaRecords.Add(currRecord);
valori = null;
currRecord = null;
}
// nuovi record...
currFlux = item.CodFlux;
currMacc = item.IdxMacchina;
valori = new List<tsData>();
currRecord = new tsGrouped()
{
vcMachine = currMacc,
vcName = currFlux,
timeStamp = tStamp,
period = timeWindow.hour
};
}
campione = new tsData()
{
vcMachine = item.IdxMacchina,
vcName = item.CodFlux,
timeStamp = item.dtEvento,
strValue = item.Valore
};
// salvo ULTIMO sample i record prec...
if (campione != null && currRecord != null)
{
valori.Add(campione);
campione = null;
}
}
#endif
}
#if false
// aggiungo ultimo... salvo il VECCHIO record...
if (currRecord != null)
{
listaRecords.Add(currRecord);
}
sb.AppendLine($"Generata collezione di {listaRecords.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
sw.Restart();
// oggetto gestione dati ts raggruppati
var collection = database.GetCollection<tsGrouped>("FluxLog");
// salvo in blocco
collection.InsertMany(listaRecords);
sb.AppendLine($"Salvata su MongoDb collezione di {listaRecords.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
#endif
// restituisco messaggio...
answ.esito = esitoExec.ok;
answ.message = sb.ToString();
return answ;
}
/// <summary>
/// Converte una tabella dati da DB in una lista di oggetti pronti x salvataggio su MongoDb
/// </summary>
/// <param name="tabDati">Tabelal dei dati RAW registrati</param>
/// <param name="tStamp">Data di riferimento</param>
/// <param name="periodo">Periodo del campionamento desiderato (e passato coi dati che sono relativi a tale periodo...)</param>
protected List<tsGrouped> convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo)
{
// init oggetti
List<tsGrouped> listaRecords = new List<tsGrouped>();
tsGrouped currRecord = null;
List<tsData> valori = new List<tsData>();
tsData campione = null;
string currFlux = "";
string currMacc = "";
foreach (var item in tabDati)
{
// controllo flusso x nuovo record...
if (item.CodFlux != currFlux || item.IdxMacchina != currMacc)
{
// salvo il VECCHIO record...
if (currRecord != null)
{
currRecord.samples = valori;
listaRecords.Add(currRecord);
valori = null;
currRecord = null;
}
// nuovi record...
currFlux = item.CodFlux;
currMacc = item.IdxMacchina;
valori = new List<tsData>();
currRecord = new tsGrouped()
{
vcMachine = currMacc,
vcName = currFlux,
timeStamp = tStamp,
period = periodo
};
}
campione = new tsData()
{
vcMachine = item.IdxMacchina,
vcName = item.CodFlux,
timeStamp = item.dtEvento,
strValue = item.Valore
};
// aggiunta sample ai record prec...
if (campione != null && currRecord != null)
{
valori.Add(campione);
campione = null;
}
}
// aggiungo ultimo... salvo il VECCHIO record...
if (currRecord != null)
{
listaRecords.Add(currRecord);
}
return listaRecords;
}
}
}