using System.Linq.Expressions; using Cassandra.Mapping; using JiShe.CollectBus.Cassandra.Extensions; using Volo.Abp.Domain.Entities; namespace JiShe.CollectBus.Cassandra { public class CassandraRepository : ICassandraRepository where TEntity : class, ICassandraEntity { private readonly ICassandraProvider _cassandraProvider; public CassandraRepository(ICassandraProvider cassandraProvider, MappingConfiguration mappingConfig) { _cassandraProvider = cassandraProvider; Mapper = new Mapper(cassandraProvider.Session, mappingConfig); cassandraProvider.Session.CreateTable(cassandraProvider.CassandraConfig.Keyspace); } public readonly IMapper Mapper; public virtual async Task GetAsync(TKey id) { return await GetAsync("WHERE id = ?", id); } public virtual async Task GetAsync(string cql, params object[] args) { return await Mapper.SingleAsync(cql, args); } public virtual async Task FirstOrDefaultAsync(TKey id) { return await FirstOrDefaultAsync("WHERE id = ?", id); } public virtual async Task FirstOrDefaultAsync(string cql, params object[] args) { return await Mapper.FirstOrDefaultAsync(cql, args); } public virtual async Task?> GetListAsync(string? cql = null, params object[] args) { return cql.IsNullOrWhiteSpace() ? (await Mapper.FetchAsync()).ToList() : (await Mapper.FetchAsync(cql, args)).ToList(); } public virtual async Task InsertAsync(TEntity entity) { await Mapper.InsertAsync(entity); return entity; } public virtual async Task UpdateAsync(TEntity entity) { await Mapper.UpdateAsync(entity); return entity; } public virtual async Task DeleteAsync(TEntity entity) { await Mapper.DeleteAsync(entity); } public virtual async Task DeleteAsync(TKey id) { await Mapper.DeleteAsync("WHERE id = ?", id); } public virtual async Task> GetPagedListAsync( int skipCount, int maxResultCount, string sorting) { var cql = $"SELECT * FROM {typeof(TEntity).Name.ToLower()}"; if (!string.IsNullOrWhiteSpace(sorting)) { cql += $" ORDER BY {sorting}"; } cql += $" LIMIT {maxResultCount} OFFSET {skipCount}"; return (await Mapper.FetchAsync(cql)).ToList(); } } }