156 lines
5.8 KiB
C#
156 lines
5.8 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();
|
|
// Oggetto dove verserò i dati
|
|
List<tsGrouped> listaRecords = new List<tsGrouped>();
|
|
tsGrouped currRecord = null;
|
|
List<tsData> valori = new List<tsData>();
|
|
tsData campione = null;
|
|
DateTime tStamp;
|
|
string filtro = "";
|
|
string sort = "idxMacchina ASC, codFlux ASC";
|
|
string currFlux = "";
|
|
string currMacc = "";
|
|
// leggo da DB i records...
|
|
sw.Start();
|
|
sb.AppendLine($"Inizio processing periodo {data2transfer} --> {data2transfer.AddDays(numDays)}");
|
|
var tabDati = DataLayer.obj.taFL.getFilt("", data2transfer, data2transfer.AddDays(numDays), true);
|
|
sb.AppendLine($"Effettuata lettura DB: {tabDati.Count} record in {sw.ElapsedMilliseconds / 1000} sec");
|
|
sw.Restart();
|
|
// ora converto...
|
|
// faccio ciclo su 24 h...
|
|
for (int i = 0; i < 24; i++)
|
|
{
|
|
tStamp = data2transfer.AddHours(i);
|
|
filtro = $"dtEvento >= #{tStamp:yyyy-MM-dd HH:mm:00}# AND dtEvento <= #{tStamp.AddHours(1):yyyy-MM-dd HH:mm:00}#";
|
|
var tabOraria = (DS_applicazione.FluxLogRow[])tabDati.Select(filtro, sort);
|
|
foreach (var item in tabOraria)
|
|
{
|
|
// 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;
|
|
}
|
|
}
|
|
}
|
|
// 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");
|
|
|
|
// svuoto memoria...
|
|
listaRecords = null;
|
|
valori = null;
|
|
|
|
// restituisco messaggio...
|
|
answ.esito = esitoExec.ok;
|
|
answ.message = sb.ToString();
|
|
return answ;
|
|
}
|
|
}
|
|
}
|