Files
mixtape/zero.Core/Stores/StoreOperations.Read.cs
T

121 lines
3.4 KiB
C#
Raw Normal View History

2021-11-23 15:43:21 +01:00
using Raven.Client.Documents;
using Raven.Client.Documents.Indexes;
2021-11-18 16:00:20 +01:00
using Raven.Client.Documents.Linq;
2021-11-23 15:43:21 +01:00
using Raven.Client.Documents.Session;
2021-11-18 16:00:20 +01:00
2021-11-23 22:56:22 +01:00
namespace zero.Stores;
2021-11-23 11:35:01 +01:00
2021-11-27 18:09:27 +01:00
public partial class StoreOperations : IStoreOperations
2021-11-18 16:00:20 +01:00
{
/// <inheritdoc />
2021-11-23 11:35:01 +01:00
public virtual async Task<T> Load<T>(string id, string changeVector = null) where T : ZeroIdEntity, new()
2021-11-18 16:00:20 +01:00
{
if (id.IsNullOrWhiteSpace())
{
return default;
}
if (!changeVector.IsNullOrEmpty())
{
//return WhenActive(await GetRevision(changeVector)); // TODO
}
return WhenActive(await Session.LoadAsync<T>(id));
}
/// <inheritdoc />
2021-11-23 11:35:01 +01:00
public virtual async Task<Dictionary<string, T>> Load<T>(IEnumerable<string> ids) where T : ZeroIdEntity, new()
2021-11-18 16:00:20 +01:00
{
ids = ids.Distinct().ToArray();
Dictionary<string, T> models = await Session.LoadAsync<T>(ids);
Dictionary<string, T> result = new();
foreach (string id in ids)
{
models.TryGetValue(id, out T model);
result.Add(id, WhenActive(model));
}
return result;
}
2021-12-22 15:41:11 +01:00
/// <inheritdoc />
public virtual async Task<bool> Any<T>(Func<IRavenQueryable<T>, IQueryable<T>> querySelector = default) where T : ZeroIdEntity, new()
{
querySelector ??= x => x;
return await querySelector(Session.Query<T>()).AnyAsync();
}
2021-11-18 16:00:20 +01:00
/// <inheritdoc />
2021-11-23 15:43:21 +01:00
public virtual async Task<Paged<T>> Load<T>(int pageNumber, int pageSize, Func<IRavenQueryable<T>, IQueryable<T>> querySelector = default) where T : ZeroIdEntity, new()
2021-11-18 16:00:20 +01:00
{
2021-11-23 15:43:21 +01:00
IRavenQueryable<T> queryable = Session.Query<T>().Statistics(out QueryStatistics statistics);
querySelector ??= x => x;
List<T> result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync();
return new Paged<T>(result, statistics.TotalResults, pageNumber, pageSize);
2021-11-18 16:00:20 +01:00
}
/// <inheritdoc />
2021-11-23 15:43:21 +01:00
public virtual async Task<Paged<T>> Load<T, TIndex>(int pageNumber, int pageSize, Func<IRavenQueryable<T>, IQueryable<T>> querySelector = default)
2021-11-23 11:35:01 +01:00
where T : ZeroIdEntity, new()
where TIndex : AbstractCommonApiForIndexes, new()
2021-11-18 16:00:20 +01:00
{
2021-11-23 15:43:21 +01:00
IRavenQueryable<T> queryable = Session.Query<T, TIndex>().Statistics(out QueryStatistics statistics);
querySelector ??= x => x;
List<T> result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync();
return new Paged<T>(result, statistics.TotalResults, pageNumber, pageSize);
2021-11-18 16:00:20 +01:00
}
/// <inheritdoc />
2021-11-23 11:35:01 +01:00
public virtual async Task<List<T>> LoadAll<T>() where T : ZeroIdEntity, new()
2021-11-18 16:00:20 +01:00
{
List<T> items = new();
2021-11-24 15:49:25 +01:00
await foreach (T item in Stream<T>(null))
2021-11-18 16:00:20 +01:00
{
items.Add(item);
}
return items;
}
/// <inheritdoc />
2021-11-23 15:43:21 +01:00
public virtual async IAsyncEnumerable<T> Stream<T>(Func<IRavenQueryable<T>, IQueryable<T>> expression) where T : ZeroIdEntity, new()
2021-11-18 16:00:20 +01:00
{
IRavenQueryable<T> query = Session.Query<T>();
2021-11-23 15:43:21 +01:00
IQueryable<T> queryable = query;
2021-11-18 16:00:20 +01:00
if (expression != null)
{
2021-11-23 15:43:21 +01:00
queryable = expression(query);
2021-11-18 16:00:20 +01:00
}
2021-11-23 15:43:21 +01:00
var stream = await Session.Advanced.StreamAsync(queryable);
2021-11-18 16:00:20 +01:00
while (await stream.MoveNextAsync())
{
if (WhenActive(stream.Current.Document) == default)
{
continue;
}
yield return stream.Current.Document;
}
}
/// <inheritdoc />
2021-12-12 15:41:51 +01:00
public virtual string GetChangeToken<T>(T model) where T : ZeroIdEntity, new()
{
2021-12-12 15:41:51 +01:00
string changeVector = Session.Advanced.GetChangeVectorFor(model);
return IdGenerator.HashString(changeVector);
}
2021-11-18 16:00:20 +01:00
}