using Raven.Client; using Raven.Client.Documents; using Raven.Client.Documents.BulkInsert; using Raven.Client.Documents.Operations; using Raven.Client.Documents.Queries; using Raven.Client.Documents.Session; using System; using System.Threading; using System.Threading.Tasks; using zero.Core.Options; namespace zero.Core.Database { public class ZeroStore : DocumentStore, IZeroStore { public ZeroStore(IZeroOptions options) : base() { Options = options; Database = null; } protected IZeroOptions Options { get; set; } /// public string ResolvedDatabase { get; set; } /// public IDocumentStore Raven => this; /// public OperationExecutor GetOperationExecutor(string database = null) { return Operations.ForDatabase(database ?? ResolvedDatabase); } /// public IAsyncDocumentSession OpenCoreSession() { return OpenAsyncSession(Options.Raven.Database); } /// public override IAsyncDocumentSession OpenAsyncSession(string database) { return base.OpenAsyncSession(database); } /// public override IAsyncDocumentSession OpenAsyncSession(SessionOptions options) { options.Database = options.Database ?? ResolvedDatabase; return base.OpenAsyncSession(options); } /// public override IAsyncDocumentSession OpenAsyncSession() { return base.OpenAsyncSession(ResolvedDatabase); } /// public override IDocumentSession OpenSession(SessionOptions options) { options.Database = options.Database ?? ResolvedDatabase; return base.OpenSession(options); } /// public override IDocumentSession OpenSession(string database) { return base.OpenSession(database); } /// public override IDocumentSession OpenSession() { return base.OpenSession(ResolvedDatabase); } /// public override BulkInsertOperation BulkInsert(string database = null, CancellationToken token = default) { return base.BulkInsert(database ?? ResolvedDatabase, token); } /// public async Task PurgeAsync(string database = null, string querySuffix = null, Parameters parameters = null) { var collectionName = Conventions.FindCollectionName(typeof(T)); var operationQuery = new DeleteByQueryOperation(new IndexQuery() { Query = $"from {collectionName} c {querySuffix ?? String.Empty}", QueryParameters = parameters }, new QueryOperationOptions { AllowStale = true }); Operation operation = await GetOperationExecutor(database).SendAsync(operationQuery); await operation.WaitForCompletionAsync(); } } public interface IZeroStore : IDocumentStore { /// /// The database which has been resolved from the current application /// string ResolvedDatabase { get; set; } /// /// Get underlying raven document store /// IDocumentStore Raven { get; } /// /// Get operation executor /// OperationExecutor GetOperationExecutor(string database = null); /// /// Purges a collection /// Task PurgeAsync(string database = null, string querySuffix = null, Parameters parameters = null); /// /// Opens a session for the core database /// IAsyncDocumentSession OpenCoreSession(); } }