//using Microsoft.EntityFrameworkCore; //using DD.Persistence.Database.Entity; //using DD.Persistence.Models; //using DD.Persistence.Repositories; //using DD.Persistence.Models.Common; //namespace DD.Persistence.Repository.Repositories; ///// ///// Репозиторий для хранения разных наборов данных временных рядов. ///// idDiscriminator - идентифицирует конкретный набор данных, прим.: циклы измерения АСИБР, или отчет о DrillTest. ///// idDiscriminator формируют клиенты и только им известно что они обозначают. ///// Так как данные приходят редко, то их прореживания для построения графиков не предусмотрено. ///// //public class TimestampedSetRepository : ITimestampedSetRepository //{ // private readonly DbContext db; // public TimestampedSetRepository(DbContext db) // { // this.db = db; // } // public Task AddRange(Guid idDiscriminator, IEnumerable sets, CancellationToken token) // { // var entities = sets.Select(set => new TimestampedSet(idDiscriminator, set.Timestamp.ToUniversalTime(), set.Set)); // var dbSet = db.Set(); // dbSet.AddRange(entities); // return db.SaveChangesAsync(token); // } // public async Task> Get(Guid idDiscriminator, DateTimeOffset? geTimestamp, IEnumerable? columnNames, int skip, int take, CancellationToken token) // { // var dbSet = db.Set(); // var query = dbSet.Where(entity => entity.IdDiscriminator == idDiscriminator); // if (geTimestamp.HasValue) // query = ApplyGeTimestamp(query, geTimestamp.Value); // query = query // .OrderBy(item => item.Timestamp) // .Skip(skip) // .Take(take); // var data = await Materialize(query, token); // if (columnNames is not null && columnNames.Any()) // data = ReduceSetColumnsByNames(data, columnNames); // return data; // } // public async Task> GetLast(Guid idDiscriminator, IEnumerable? columnNames, int take, CancellationToken token) // { // var dbSet = db.Set(); // var query = dbSet.Where(entity => entity.IdDiscriminator == idDiscriminator); // query = query.OrderByDescending(entity => entity.Timestamp) // .Take(take) // .OrderBy(entity => entity.Timestamp); // var data = await Materialize(query, token); // if (columnNames is not null && columnNames.Any()) // data = ReduceSetColumnsByNames(data, columnNames); // return data; // } // public Task Count(Guid idDiscriminator, CancellationToken token) // { // var dbSet = db.Set(); // var query = dbSet.Where(entity => entity.IdDiscriminator == idDiscriminator); // return query.CountAsync(token); // } // public async Task GetDatesRange(Guid idDiscriminator, CancellationToken token) // { // var query = db.Set() // .GroupBy(entity => entity.IdDiscriminator) // .Select(group => new // { // Min = group.Min(entity => entity.Timestamp), // Max = group.Max(entity => entity.Timestamp), // }); // var item = await query.FirstOrDefaultAsync(token); // if (item is null) // return null; // return new DatesRangeDto // { // From = item.Min, // To = item.Max, // }; // } // private static async Task> Materialize(IQueryable query, CancellationToken token) // { // var dtoQuery = query.Select(entity => new TimestampedSetDto(entity.Timestamp, entity.Set)); // var dtos = await dtoQuery.ToArrayAsync(token); // return dtos; // } // private static IQueryable ApplyGeTimestamp(IQueryable query, DateTimeOffset geTimestamp) // { // var geTimestampUtc = geTimestamp.ToUniversalTime(); // return query.Where(entity => entity.Timestamp >= geTimestampUtc); // } // private static IEnumerable ReduceSetColumnsByNames(IEnumerable query, IEnumerable columnNames) // { // var newQuery = query // .Select(entity => new TimestampedSetDto( // entity.Timestamp, // entity.Set // .Where(prop => columnNames.Contains(prop.Key)) // .ToDictionary(prop => prop.Key, prop => prop.Value) // )); // return newQuery; // } //}