Reformat / cleanup
This commit is contained in:
@@ -1,52 +1,39 @@
|
||||
using ZB.MOM.WW.CBDD.Bson;
|
||||
using ZB.MOM.WW.CBDD.Core.CDC;
|
||||
using ZB.MOM.WW.CBDD.Core.Collections;
|
||||
using ZB.MOM.WW.CBDD.Core.Compression;
|
||||
using ZB.MOM.WW.CBDD.Core.Metadata;
|
||||
using ZB.MOM.WW.CBDD.Core.Storage;
|
||||
using ZB.MOM.WW.CBDD.Core.Transactions;
|
||||
using ZB.MOM.WW.CBDD.Core.Metadata;
|
||||
using ZB.MOM.WW.CBDD.Core.Compression;
|
||||
using System.Threading;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using ZB.MOM.WW.CBDD.Bson;
|
||||
|
||||
namespace ZB.MOM.WW.CBDD.Core;
|
||||
|
||||
internal interface ICompactionAwareCollection
|
||||
{
|
||||
/// <summary>
|
||||
/// Refreshes index bindings after compaction.
|
||||
/// Refreshes index bindings after compaction.
|
||||
/// </summary>
|
||||
void RefreshIndexBindingsAfterCompaction();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Base class for database contexts.
|
||||
/// Inherit and add DocumentCollection{T} properties for your entities.
|
||||
/// Use partial class for Source Generator integration.
|
||||
/// Base class for database contexts.
|
||||
/// Inherit and add DocumentCollection{T} properties for your entities.
|
||||
/// Use partial class for Source Generator integration.
|
||||
/// </summary>
|
||||
public abstract partial class DocumentDbContext : IDisposable, ITransactionHolder
|
||||
public abstract class DocumentDbContext : IDisposable, ITransactionHolder
|
||||
{
|
||||
internal readonly ChangeStreamDispatcher _cdc;
|
||||
private readonly List<ICompactionAwareCollection> _compactionAwareCollections = new();
|
||||
|
||||
private readonly IReadOnlyDictionary<Type, object> _model;
|
||||
private readonly List<IDocumentMapper> _registeredMappers = new();
|
||||
private readonly IStorageEngine _storage;
|
||||
internal readonly CDC.ChangeStreamDispatcher _cdc;
|
||||
private readonly SemaphoreSlim _transactionLock = new(1, 1);
|
||||
protected bool _disposed;
|
||||
private readonly SemaphoreSlim _transactionLock = new SemaphoreSlim(1, 1);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current active transaction, if any.
|
||||
/// </summary>
|
||||
public ITransaction? CurrentTransaction
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
return field != null && (field.State == TransactionState.Active) ? field : null;
|
||||
}
|
||||
private set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new database context with default configuration
|
||||
/// Creates a new database context with default configuration
|
||||
/// </summary>
|
||||
/// <param name="databasePath">The database file path.</param>
|
||||
protected DocumentDbContext(string databasePath)
|
||||
@@ -55,7 +42,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new database context with default storage configuration and custom compression settings.
|
||||
/// Creates a new database context with default storage configuration and custom compression settings.
|
||||
/// </summary>
|
||||
/// <param name="databasePath">The database file path.</param>
|
||||
/// <param name="compressionOptions">Compression behavior options.</param>
|
||||
@@ -65,7 +52,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new database context with custom configuration
|
||||
/// Creates a new database context with custom configuration
|
||||
/// </summary>
|
||||
/// <param name="databasePath">The database file path.</param>
|
||||
/// <param name="config">The page file configuration.</param>
|
||||
@@ -75,7 +62,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new database context with custom storage and compression configuration.
|
||||
/// Creates a new database context with custom storage and compression configuration.
|
||||
/// </summary>
|
||||
/// <param name="databasePath">The database file path.</param>
|
||||
/// <param name="config">The page file configuration.</param>
|
||||
@@ -91,7 +78,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
throw new ArgumentNullException(nameof(databasePath));
|
||||
|
||||
_storage = new StorageEngine(databasePath, config, compressionOptions, maintenanceOptions);
|
||||
_cdc = new CDC.ChangeStreamDispatcher();
|
||||
_cdc = new ChangeStreamDispatcher();
|
||||
_storage.RegisterCdc(_cdc);
|
||||
|
||||
// Initialize model before collections
|
||||
@@ -102,108 +89,41 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes document collections for the context.
|
||||
/// Gets the current active transaction, if any.
|
||||
/// </summary>
|
||||
protected virtual void InitializeCollections()
|
||||
public ITransaction? CurrentTransaction
|
||||
{
|
||||
// Derived classes can override to initialize collections
|
||||
get
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
return field != null && field.State == TransactionState.Active ? field : null;
|
||||
}
|
||||
private set;
|
||||
}
|
||||
|
||||
private readonly IReadOnlyDictionary<Type, object> _model;
|
||||
private readonly List<IDocumentMapper> _registeredMappers = new();
|
||||
private readonly List<ICompactionAwareCollection> _compactionAwareCollections = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the concrete storage engine for advanced scenarios in derived contexts.
|
||||
/// Gets the concrete storage engine for advanced scenarios in derived contexts.
|
||||
/// </summary>
|
||||
protected StorageEngine Engine => (StorageEngine)_storage;
|
||||
|
||||
/// <summary>
|
||||
/// Gets compression options bound to this context's storage engine.
|
||||
/// Gets compression options bound to this context's storage engine.
|
||||
/// </summary>
|
||||
protected CompressionOptions CompressionOptions => _storage.CompressionOptions;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the compression service for codec operations.
|
||||
/// Gets the compression service for codec operations.
|
||||
/// </summary>
|
||||
protected CompressionService CompressionService => _storage.CompressionService;
|
||||
|
||||
/// <summary>
|
||||
/// Gets compression telemetry counters.
|
||||
/// Gets compression telemetry counters.
|
||||
/// </summary>
|
||||
protected CompressionTelemetry CompressionTelemetry => _storage.CompressionTelemetry;
|
||||
|
||||
/// <summary>
|
||||
/// Override to configure the model using Fluent API.
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder">The model builder instance.</param>
|
||||
protected virtual void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper to create a DocumentCollection instance with custom TId.
|
||||
/// Used by derived classes in InitializeCollections for typed primary keys.
|
||||
/// </summary>
|
||||
/// <typeparam name="TId">The document identifier type.</typeparam>
|
||||
/// <typeparam name="T">The document type.</typeparam>
|
||||
/// <param name="mapper">The mapper used for document serialization and key access.</param>
|
||||
/// <returns>The created document collection.</returns>
|
||||
protected DocumentCollection<TId, T> CreateCollection<TId, T>(IDocumentMapper<TId, T> mapper)
|
||||
where T : class
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
string? customName = null;
|
||||
EntityTypeBuilder<T>? builder = null;
|
||||
|
||||
if (_model.TryGetValue(typeof(T), out var builderObj))
|
||||
{
|
||||
builder = builderObj as EntityTypeBuilder<T>;
|
||||
customName = builder?.CollectionName;
|
||||
}
|
||||
|
||||
_registeredMappers.Add(mapper);
|
||||
var collection = new DocumentCollection<TId, T>(_storage, this, mapper, customName);
|
||||
if (collection is ICompactionAwareCollection compactionAwareCollection)
|
||||
{
|
||||
_compactionAwareCollections.Add(compactionAwareCollection);
|
||||
}
|
||||
|
||||
// Apply configurations from ModelBuilder
|
||||
if (builder != null)
|
||||
{
|
||||
foreach (var indexBuilder in builder.Indexes)
|
||||
{
|
||||
collection.ApplyIndexBuilder(indexBuilder);
|
||||
}
|
||||
}
|
||||
|
||||
_storage.RegisterMappers(_registeredMappers);
|
||||
|
||||
return collection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the document collection for the specified entity type using an ObjectId as the key.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of entity to retrieve the document collection for. Must be a reference type.</typeparam>
|
||||
/// <returns>A DocumentCollection<ObjectId, T> instance for the specified entity type.</returns>
|
||||
public DocumentCollection<ObjectId, T> Set<T>() where T : class => Set<ObjectId, T>();
|
||||
|
||||
/// <summary>
|
||||
/// Gets a collection for managing documents of type T, identified by keys of type TId.
|
||||
/// Override is generated automatically by the Source Generator for partial DbContext classes.
|
||||
/// </summary>
|
||||
/// <typeparam name="TId">The type of the unique identifier for documents in the collection.</typeparam>
|
||||
/// <typeparam name="T">The type of the document to be managed. Must be a reference type.</typeparam>
|
||||
/// <returns>A DocumentCollection<TId, T> instance for performing operations on documents of type T.</returns>
|
||||
public virtual DocumentCollection<TId, T> Set<TId, T>() where T : class
|
||||
=> throw new InvalidOperationException($"No collection registered for entity type '{typeof(T).Name}' with key type '{typeof(TId).Name}'.");
|
||||
|
||||
/// <summary>
|
||||
/// Releases resources used by the context.
|
||||
/// Releases resources used by the context.
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
@@ -220,7 +140,102 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Begins a transaction or returns the current active transaction.
|
||||
/// Gets the current active transaction or starts a new one.
|
||||
/// </summary>
|
||||
/// <returns>The active transaction.</returns>
|
||||
public ITransaction GetCurrentTransactionOrStart()
|
||||
{
|
||||
return BeginTransaction();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current active transaction or starts a new one asynchronously.
|
||||
/// </summary>
|
||||
/// <returns>The active transaction.</returns>
|
||||
public async Task<ITransaction> GetCurrentTransactionOrStartAsync()
|
||||
{
|
||||
return await BeginTransactionAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes document collections for the context.
|
||||
/// </summary>
|
||||
protected virtual void InitializeCollections()
|
||||
{
|
||||
// Derived classes can override to initialize collections
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to configure the model using Fluent API.
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder">The model builder instance.</param>
|
||||
protected virtual void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper to create a DocumentCollection instance with custom TId.
|
||||
/// Used by derived classes in InitializeCollections for typed primary keys.
|
||||
/// </summary>
|
||||
/// <typeparam name="TId">The document identifier type.</typeparam>
|
||||
/// <typeparam name="T">The document type.</typeparam>
|
||||
/// <param name="mapper">The mapper used for document serialization and key access.</param>
|
||||
/// <returns>The created document collection.</returns>
|
||||
protected DocumentCollection<TId, T> CreateCollection<TId, T>(IDocumentMapper<TId, T> mapper)
|
||||
where T : class
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
string? customName = null;
|
||||
EntityTypeBuilder<T>? builder = null;
|
||||
|
||||
if (_model.TryGetValue(typeof(T), out object? builderObj))
|
||||
{
|
||||
builder = builderObj as EntityTypeBuilder<T>;
|
||||
customName = builder?.CollectionName;
|
||||
}
|
||||
|
||||
_registeredMappers.Add(mapper);
|
||||
var collection = new DocumentCollection<TId, T>(_storage, this, mapper, customName);
|
||||
if (collection is ICompactionAwareCollection compactionAwareCollection)
|
||||
_compactionAwareCollections.Add(compactionAwareCollection);
|
||||
|
||||
// Apply configurations from ModelBuilder
|
||||
if (builder != null)
|
||||
foreach (var indexBuilder in builder.Indexes)
|
||||
collection.ApplyIndexBuilder(indexBuilder);
|
||||
|
||||
_storage.RegisterMappers(_registeredMappers);
|
||||
|
||||
return collection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the document collection for the specified entity type using an ObjectId as the key.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of entity to retrieve the document collection for. Must be a reference type.</typeparam>
|
||||
/// <returns>A DocumentCollection<ObjectId, T> instance for the specified entity type.</returns>
|
||||
public DocumentCollection<ObjectId, T> Set<T>() where T : class
|
||||
{
|
||||
return Set<ObjectId, T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a collection for managing documents of type T, identified by keys of type TId.
|
||||
/// Override is generated automatically by the Source Generator for partial DbContext classes.
|
||||
/// </summary>
|
||||
/// <typeparam name="TId">The type of the unique identifier for documents in the collection.</typeparam>
|
||||
/// <typeparam name="T">The type of the document to be managed. Must be a reference type.</typeparam>
|
||||
/// <returns>A DocumentCollection<TId, T> instance for performing operations on documents of type T.</returns>
|
||||
public virtual DocumentCollection<TId, T> Set<TId, T>() where T : class
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
$"No collection registered for entity type '{typeof(T).Name}' with key type '{typeof(TId).Name}'.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Begins a transaction or returns the current active transaction.
|
||||
/// </summary>
|
||||
/// <returns>The active transaction.</returns>
|
||||
public ITransaction BeginTransaction()
|
||||
@@ -243,7 +258,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Begins a transaction asynchronously or returns the current active transaction.
|
||||
/// Begins a transaction asynchronously or returns the current active transaction.
|
||||
/// </summary>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
/// <returns>The active transaction.</returns>
|
||||
@@ -252,7 +267,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
bool lockAcquired = false;
|
||||
var lockAcquired = false;
|
||||
try
|
||||
{
|
||||
await _transactionLock.WaitAsync(ct);
|
||||
@@ -271,32 +286,13 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current active transaction or starts a new one.
|
||||
/// </summary>
|
||||
/// <returns>The active transaction.</returns>
|
||||
public ITransaction GetCurrentTransactionOrStart()
|
||||
{
|
||||
return BeginTransaction();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current active transaction or starts a new one asynchronously.
|
||||
/// </summary>
|
||||
/// <returns>The active transaction.</returns>
|
||||
public async Task<ITransaction> GetCurrentTransactionOrStartAsync()
|
||||
{
|
||||
return await BeginTransactionAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Commits the current transaction if one is active.
|
||||
/// Commits the current transaction if one is active.
|
||||
/// </summary>
|
||||
public void SaveChanges()
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
if (CurrentTransaction != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
CurrentTransaction.Commit();
|
||||
@@ -305,19 +301,17 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
{
|
||||
CurrentTransaction = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Commits the current transaction asynchronously if one is active.
|
||||
/// Commits the current transaction asynchronously if one is active.
|
||||
/// </summary>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
public async Task SaveChangesAsync(CancellationToken ct = default)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
public async Task SaveChangesAsync(CancellationToken ct = default)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
if (CurrentTransaction != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
await CurrentTransaction.CommitAsync(ct);
|
||||
@@ -325,40 +319,40 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
finally
|
||||
{
|
||||
CurrentTransaction = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Executes a checkpoint using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <returns>The checkpoint execution result.</returns>
|
||||
public CheckpointResult Checkpoint(CheckpointMode mode = CheckpointMode.Truncate)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
return Engine.Checkpoint(mode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Executes a checkpoint asynchronously using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
/// <returns>The checkpoint execution result.</returns>
|
||||
public Task<CheckpointResult> CheckpointAsync(CheckpointMode mode = CheckpointMode.Truncate, CancellationToken ct = default)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
return Engine.CheckpointAsync(mode, ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a point-in-time snapshot of compression telemetry counters.
|
||||
/// </summary>
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Executes a checkpoint using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <returns>The checkpoint execution result.</returns>
|
||||
public CheckpointResult Checkpoint(CheckpointMode mode = CheckpointMode.Truncate)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
return Engine.Checkpoint(mode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Executes a checkpoint asynchronously using the requested mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Checkpoint mode to execute.</param>
|
||||
/// <param name="ct">The cancellation token.</param>
|
||||
/// <returns>The checkpoint execution result.</returns>
|
||||
public Task<CheckpointResult> CheckpointAsync(CheckpointMode mode = CheckpointMode.Truncate,
|
||||
CancellationToken ct = default)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
return Engine.CheckpointAsync(mode, ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a point-in-time snapshot of compression telemetry counters.
|
||||
/// </summary>
|
||||
public CompressionStats GetCompressionStats()
|
||||
{
|
||||
if (_disposed)
|
||||
@@ -368,7 +362,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs offline compaction by default. Set options to online mode for a bounded online pass.
|
||||
/// Runs offline compaction by default. Set options to online mode for a bounded online pass.
|
||||
/// </summary>
|
||||
/// <param name="options">Compaction execution options.</param>
|
||||
public CompactionStats Compact(CompactionOptions? options = null)
|
||||
@@ -382,7 +376,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs offline compaction by default. Set options to online mode for a bounded online pass.
|
||||
/// Runs offline compaction by default. Set options to online mode for a bounded online pass.
|
||||
/// </summary>
|
||||
/// <param name="options">Compaction execution options.</param>
|
||||
/// <param name="ct">Cancellation token for the asynchronous operation.</param>
|
||||
@@ -395,7 +389,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alias for <see cref="Compact(CompactionOptions?)"/>.
|
||||
/// Alias for <see cref="Compact(CompactionOptions?)" />.
|
||||
/// </summary>
|
||||
/// <param name="options">Compaction execution options.</param>
|
||||
public CompactionStats Vacuum(CompactionOptions? options = null)
|
||||
@@ -409,7 +403,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Async alias for <see cref="CompactAsync(CompactionOptions?, CancellationToken)"/>.
|
||||
/// Async alias for <see cref="CompactAsync(CompactionOptions?, CancellationToken)" />.
|
||||
/// </summary>
|
||||
/// <param name="options">Compaction execution options.</param>
|
||||
/// <param name="ct">Cancellation token for the asynchronous operation.</param>
|
||||
@@ -437,14 +431,11 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
|
||||
private void RefreshCollectionBindingsAfterCompaction()
|
||||
{
|
||||
foreach (var collection in _compactionAwareCollections)
|
||||
{
|
||||
collection.RefreshIndexBindingsAfterCompaction();
|
||||
}
|
||||
foreach (var collection in _compactionAwareCollections) collection.RefreshIndexBindingsAfterCompaction();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets page usage grouped by page type.
|
||||
/// Gets page usage grouped by page type.
|
||||
/// </summary>
|
||||
public IReadOnlyList<PageTypeUsageEntry> GetPageUsageByPageType()
|
||||
{
|
||||
@@ -455,7 +446,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets per-collection page usage diagnostics.
|
||||
/// Gets per-collection page usage diagnostics.
|
||||
/// </summary>
|
||||
public IReadOnlyList<CollectionPageUsageEntry> GetPageUsageByCollection()
|
||||
{
|
||||
@@ -466,7 +457,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets per-collection compression ratio diagnostics.
|
||||
/// Gets per-collection compression ratio diagnostics.
|
||||
/// </summary>
|
||||
public IReadOnlyList<CollectionCompressionRatioEntry> GetCompressionRatioByCollection()
|
||||
{
|
||||
@@ -477,7 +468,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets free-list summary diagnostics.
|
||||
/// Gets free-list summary diagnostics.
|
||||
/// </summary>
|
||||
public FreeListSummary GetFreeListSummary()
|
||||
{
|
||||
@@ -488,7 +479,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets page-level fragmentation diagnostics.
|
||||
/// Gets page-level fragmentation diagnostics.
|
||||
/// </summary>
|
||||
public FragmentationMapReport GetFragmentationMap()
|
||||
{
|
||||
@@ -499,7 +490,7 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs compression migration as dry-run estimation by default.
|
||||
/// Runs compression migration as dry-run estimation by default.
|
||||
/// </summary>
|
||||
/// <param name="options">Compression migration options.</param>
|
||||
public CompressionMigrationResult MigrateCompression(CompressionMigrationOptions? options = null)
|
||||
@@ -511,15 +502,16 @@ public abstract partial class DocumentDbContext : IDisposable, ITransactionHolde
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs compression migration asynchronously as dry-run estimation by default.
|
||||
/// Runs compression migration asynchronously as dry-run estimation by default.
|
||||
/// </summary>
|
||||
/// <param name="options">Compression migration options.</param>
|
||||
/// <param name="ct">Cancellation token for the asynchronous operation.</param>
|
||||
public Task<CompressionMigrationResult> MigrateCompressionAsync(CompressionMigrationOptions? options = null, CancellationToken ct = default)
|
||||
public Task<CompressionMigrationResult> MigrateCompressionAsync(CompressionMigrationOptions? options = null,
|
||||
CancellationToken ct = default)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException(nameof(DocumentDbContext));
|
||||
|
||||
return Engine.MigrateCompressionAsync(options, ct);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user