using Raven.Client.Documents; using Raven.Client.Documents.Indexes; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; namespace zero.Stores; public partial class StoreOperations : IStoreOperations { /// public virtual async Task Load(string id, string changeVector = null) where T : ZeroIdEntity, new() { if (id.IsNullOrWhiteSpace()) { return default; } if (!changeVector.IsNullOrEmpty()) { //return WhenActive(await GetRevision(changeVector)); // TODO } return WhenActive(await Session.LoadAsync(id)); } /// public virtual async Task> Load(IEnumerable ids) where T : ZeroIdEntity, new() { ids = ids.Distinct().ToArray(); Dictionary models = await Session.LoadAsync(ids); Dictionary result = new(); foreach (string id in ids) { models.TryGetValue(id, out T model); result.Add(id, WhenActive(model)); } return result; } /// public virtual async Task Any(Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new() { querySelector ??= x => x; return await querySelector(Session.Query()).AnyAsync(); } /// public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new() { IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); querySelector ??= x => x; List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync(); return new Paged(result, statistics.TotalResults, pageNumber, pageSize); } /// public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) where T : ZeroIdEntity, new() where TIndex : AbstractCommonApiForIndexes, new() { IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); querySelector ??= x => x; List result = await querySelector(queryable).Paging(pageNumber, pageSize).ToListAsync(); return new Paged(result, statistics.TotalResults, pageNumber, pageSize); } /// public virtual async Task> LoadAll() where T : ZeroIdEntity, new() { List items = new(); await foreach (T item in Stream(null)) { items.Add(item); } return items; } /// public virtual async IAsyncEnumerable Stream(Func, IQueryable> expression) where T : ZeroIdEntity, new() { IRavenQueryable query = Session.Query(); IQueryable queryable = query; if (expression != null) { queryable = expression(query); } var stream = await Session.Advanced.StreamAsync(queryable); while (await stream.MoveNextAsync()) { if (WhenActive(stream.Current.Document) == default) { continue; } yield return stream.Current.Document; } } /// public virtual string GetChangeToken(T model) where T : ZeroIdEntity, new() { string changeVector = Session.Advanced.GetChangeVectorFor(model); return IdGenerator.HashString(changeVector); } }