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);
}
}