using Raven.Client.Documents.Indexes; using Raven.Client.Documents.Linq; using System.Linq.Expressions; namespace Mixtape.Raven; public partial class RavenOperations : IRavenOperations { /// public virtual async Task Load(string id, string changeVector = null) where T : MixtapeIdEntity, 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 : MixtapeIdEntity, 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> LoadAsList(IEnumerable ids) where T : MixtapeIdEntity, new() { ids = ids.Distinct().ToArray(); Dictionary models = await Session.LoadAsync(ids); List result = []; foreach (string id in ids) { models.TryGetValue(id, out T model); if (WhenActive(model) != null) { result.Add(model); } } return result; } /// public virtual async Task Any(Func, IQueryable> querySelector = default) where T : MixtapeIdEntity, 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 : MixtapeIdEntity, 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 : MixtapeIdEntity, 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> Load(Func, IQueryable> querySelector) where T : MixtapeIdEntity, new() { IRavenQueryable queryable = Session.Query(); querySelector ??= x => x; return await querySelector(queryable).ToListAsync(); } /// public virtual async Task> Load(Func, IQueryable> querySelector) where T : MixtapeIdEntity, new() where TIndex : AbstractCommonApiForIndexes, new() { IRavenQueryable queryable = Session.Query(); querySelector ??= x => x; return await querySelector(queryable).ToListAsync(); } /// public virtual async Task> Load(Expression> predicate) where T : MixtapeIdEntity, new() { return await Session.Query().Where(predicate).ToListAsync(); } /// public virtual async Task> Load(Expression> predicate) where T : MixtapeIdEntity, new() where TIndex : AbstractCommonApiForIndexes, new() { return await Session.Query().Where(predicate).ToListAsync(); } /// public virtual async Task> Load(int pageNumber, int pageSize, Func, IQueryable> querySelector = default) where T : MixtapeIdEntity, new() where TProjection : MixtapeIdEntity, new() where TIndex : AbstractCommonApiForIndexes, new() { IRavenQueryable queryable = Session.Query().Statistics(out QueryStatistics statistics); querySelector ??= x => x; List result = await querySelector(queryable).ProjectInto().Paging(pageNumber, pageSize).ToListAsync(); return new Paged(result, statistics.TotalResults, pageNumber, pageSize); } /// public virtual async Task> LoadAll() where T : MixtapeIdEntity, new() { List items = []; await foreach (T item in Stream(null)) { items.Add(item); } return items; } /// public virtual async IAsyncEnumerable Stream(Func, IQueryable> expression) where T : MixtapeIdEntity, 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 : MixtapeIdEntity, new() { string changeVector = Session.Advanced.GetChangeVectorFor(model); return IdGenerator.HashString(changeVector); } }