Skip to content

Commit 96080d8

Browse files
mpartipiloclaude
andcommitted
feat(export): introduce StorageBackend shared base for backup/export backends
Reviewer (#dirkkul) asked for the backend choices to be discoverable from the export API and for the Backup and Export sub-clients to feel consistent in use. Introduce a shared abstract base record that both features inherit from, so: - typing 'ExportBackend.' surfaces Filesystem/S3/GCS/Azure factories from the export entry point (mirrors the existing factories on BackupBackend); - export-typed variables can be declared as 'StorageBackend' instead of the misleading 'BackupBackend'; - the same concrete backend types (FilesystemBackend, ObjectStorageBackend) flow through both BackupClient and ExportClient unchanged. Changes: - New: 'public abstract record StorageBackend' in Models/StorageBackend.cs carrying the abstract Provider/Path contract that previously lived on BackupBackend. - Existing: 'BackupBackend : StorageBackend' — abstract members now inherited from StorageBackend; static factories unchanged. Concrete FilesystemBackend / ObjectStorageBackend / EmptyBackend continue to derive from BackupBackend, so existing callers compile and behave identically (backwards compatible). - New: 'public abstract record ExportBackend : StorageBackend' with static Filesystem / S3 / GCS / Azure factories that delegate to BackupBackend's and return StorageBackend. - Widen export-side API to StorageBackend (export feature is new in this PR, no consumer impact): ExportCreateRequest.Backend, Export.Backend, ExportClient.GetStatus / Cancel parameters, ParseBackend return. Backwards compatibility: - BackupCreateRequest.Backend stays BackupBackend. - All concrete backend types still derive from BackupBackend. - BackupBackend.Provider / Path remain accessible (inherited from StorageBackend) — 'is BackupBackend' / 'as BackupBackend' checks on FilesystemBackend / ObjectStorageBackend keep working. - All factories on BackupBackend keep their original return types. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 10a733a commit 96080d8

5 files changed

Lines changed: 103 additions & 31 deletions

File tree

src/Weaviate.Client/ExportClient.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public async Task<Export> CreateSync(
7979
/// </summary>
8080
[RequiresWeaviateVersion(1, 37, 0)]
8181
public async Task<Export> GetStatus(
82-
BackupBackend backend,
82+
StorageBackend backend,
8383
string id,
8484
CancellationToken cancellationToken = default
8585
)
@@ -102,7 +102,7 @@ public async Task<Export> GetStatus(
102102
/// </summary>
103103
[RequiresWeaviateVersion(1, 37, 0)]
104104
public async Task<bool> Cancel(
105-
BackupBackend backend,
105+
StorageBackend backend,
106106
string id,
107107
CancellationToken cancellationToken = default
108108
)
@@ -141,7 +141,7 @@ private static Export ToModel(Rest.Dto.ExportCreateResponse dto) =>
141141
null
142142
);
143143

144-
private static Export ToModel(Rest.Dto.ExportStatusResponse dto, BackupBackend backend) =>
144+
private static Export ToModel(Rest.Dto.ExportStatusResponse dto, StorageBackend backend) =>
145145
new(
146146
dto.Id ?? string.Empty,
147147
backend,
@@ -169,7 +169,7 @@ private static Export ToModel(Rest.Dto.ExportStatusResponse dto, BackupBackend b
169169
TookInMs = dto.TookInMs.HasValue ? (int)dto.TookInMs.Value : null,
170170
};
171171

172-
private static BackupBackend ParseBackend(string? backendStr)
172+
private static StorageBackend ParseBackend(string? backendStr)
173173
{
174174
var provider = backendStr?.ToLowerInvariant() switch
175175
{

src/Weaviate.Client/Models/Backup.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,20 +131,13 @@ public enum BackupStorageProvider
131131
}
132132

133133
/// <summary>
134-
/// Base class for backup backend configurations
134+
/// Backup-feature view of a storage backend. Inherits the abstract
135+
/// <see cref="StorageBackend.Provider"/> / <see cref="StorageBackend.Path"/> contract
136+
/// from <see cref="StorageBackend"/>, and exposes static factories that return
137+
/// <see cref="BackupBackend"/> for use with <see cref="BackupClient"/>.
135138
/// </summary>
136-
public abstract record BackupBackend
139+
public abstract record BackupBackend : StorageBackend
137140
{
138-
/// <summary>
139-
/// The backend storage provider
140-
/// </summary>
141-
public abstract BackupStorageProvider Provider { get; }
142-
143-
/// <summary>
144-
/// Optional path for the backup location
145-
/// </summary>
146-
public abstract string? Path { get; }
147-
148141
/// <summary>
149142
/// Creates an empty backend (no backend specified)
150143
/// </summary>

src/Weaviate.Client/Models/Export.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public static ExportStatus ToExportStatus(this string? status)
7979
/// </summary>
8080
public record Export(
8181
string Id,
82-
BackupBackend Backend,
82+
StorageBackend Backend,
8383
string? Path,
8484
string StatusRaw,
8585
string[]? Collections,
@@ -119,8 +119,34 @@ public record ShardProgress(
119119
/// </summary>
120120
public record ExportCreateRequest(
121121
string Id,
122-
BackupBackend Backend,
122+
StorageBackend Backend,
123123
ExportFileFormat FileFormat,
124124
AutoArray<string>? IncludeCollections = null,
125125
AutoArray<string>? ExcludeCollections = null
126126
);
127+
128+
/// <summary>
129+
/// Export-feature view of a storage backend. Inherits the abstract
130+
/// <see cref="StorageBackend.Provider"/> / <see cref="StorageBackend.Path"/> contract
131+
/// from <see cref="StorageBackend"/>, and exposes static factories under an
132+
/// export-themed name so the backend choices are discoverable through the export API.
133+
/// Each factory delegates to the matching <see cref="BackupBackend"/> factory —
134+
/// exports and backups share the same concrete backend types underneath.
135+
/// </summary>
136+
public abstract record ExportBackend : StorageBackend
137+
{
138+
/// <summary>Creates a filesystem export backend.</summary>
139+
public static StorageBackend Filesystem(string? path = null) => BackupBackend.Filesystem(path);
140+
141+
/// <summary>Creates an S3 export backend.</summary>
142+
public static StorageBackend S3(string? bucket = null, string? path = null) =>
143+
BackupBackend.S3(bucket, path);
144+
145+
/// <summary>Creates a GCS export backend.</summary>
146+
public static StorageBackend GCS(string? bucket = null, string? path = null) =>
147+
BackupBackend.GCS(bucket, path);
148+
149+
/// <summary>Creates an Azure export backend.</summary>
150+
public static StorageBackend Azure(string? bucket = null, string? path = null) =>
151+
BackupBackend.Azure(bucket, path);
152+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace Weaviate.Client.Models;
2+
3+
/// <summary>
4+
/// Shared base for storage backend configurations used by Weaviate sub-clients that
5+
/// persist data to external storage (backup, export, …). Concrete subtypes
6+
/// (<see cref="FilesystemBackend"/>, <see cref="ObjectStorageBackend"/>, …) describe a
7+
/// specific storage location; the per-feature abstract types <see cref="BackupBackend"/>
8+
/// and <see cref="ExportBackend"/> serve as discoverable factory namespaces with
9+
/// feature-appropriate naming, and inherit from this type so the same concrete instances
10+
/// can be passed to either feature's API.
11+
/// </summary>
12+
public abstract record StorageBackend
13+
{
14+
/// <summary>
15+
/// The backend storage provider (filesystem, S3, GCS, Azure, …).
16+
/// </summary>
17+
public abstract BackupStorageProvider Provider { get; }
18+
19+
/// <summary>
20+
/// Optional path within the storage location.
21+
/// </summary>
22+
public abstract string? Path { get; }
23+
}

src/Weaviate.Client/PublicAPI.Unshipped.txt

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ Weaviate.Client.Batch.TaskHandle.Status.get -> Weaviate.Client.Batch.BatchObject
88

99
abstract Weaviate.Client.Models.Aggregate.Metric.<Clone>$() -> Weaviate.Client.Models.Aggregate.Metric!
1010
abstract Weaviate.Client.Models.Aggregate.Property.<Clone>$() -> Weaviate.Client.Models.Aggregate.Property!
11-
abstract Weaviate.Client.Models.BackupBackend.<Clone>$() -> Weaviate.Client.Models.BackupBackend!
12-
abstract Weaviate.Client.Models.BackupBackend.Path.get -> string?
13-
abstract Weaviate.Client.Models.BackupBackend.Provider.get -> Weaviate.Client.Models.BackupStorageProvider
1411
abstract Weaviate.Client.Models.BM25Operator.<Clone>$() -> Weaviate.Client.Models.BM25Operator!
1512
abstract Weaviate.Client.Models.CollectionConfigCommon.<Clone>$() -> Weaviate.Client.Models.CollectionConfigCommon!
1613
abstract Weaviate.Client.Models.GenerativeConfig.OpenAIBase.<Clone>$() -> Weaviate.Client.Models.GenerativeConfig.OpenAIBase!
@@ -2148,9 +2145,7 @@ virtual Weaviate.Client.Models.Backup.<Clone>$() -> Weaviate.Client.Models.Backu
21482145
virtual Weaviate.Client.Models.Backup.EqualityContract.get -> System.Type!
21492146
virtual Weaviate.Client.Models.Backup.Equals(Weaviate.Client.Models.Backup? other) -> bool
21502147
virtual Weaviate.Client.Models.Backup.PrintMembers(System.Text.StringBuilder! builder) -> bool
2151-
virtual Weaviate.Client.Models.BackupBackend.EqualityContract.get -> System.Type!
21522148
virtual Weaviate.Client.Models.BackupBackend.Equals(Weaviate.Client.Models.BackupBackend? other) -> bool
2153-
virtual Weaviate.Client.Models.BackupBackend.PrintMembers(System.Text.StringBuilder! builder) -> bool
21542149
virtual Weaviate.Client.Models.BackupClientConfig.<Clone>$() -> Weaviate.Client.Models.BackupClientConfig!
21552150
virtual Weaviate.Client.Models.BackupClientConfig.EqualityContract.get -> System.Type!
21562151
virtual Weaviate.Client.Models.BackupClientConfig.Equals(Weaviate.Client.Models.BackupClientConfig? other) -> bool
@@ -2936,10 +2931,8 @@ Weaviate.Client.DefaultTokenServiceFactory.CreateAsync(Weaviate.Client.ClientCon
29362931
Weaviate.Client.DefaultTokenServiceFactory.CreateSync(Weaviate.Client.ClientConfiguration! configuration) -> Weaviate.Client.ITokenService?
29372932
Weaviate.Client.DefaultTokenServiceFactory.DefaultTokenServiceFactory() -> void
29382933
Weaviate.Client.ExportClient
2939-
Weaviate.Client.ExportClient.Cancel(Weaviate.Client.Models.BackupBackend! backend, string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
29402934
Weaviate.Client.ExportClient.Create(Weaviate.Client.Models.ExportCreateRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Weaviate.Client.Models.ExportOperation!>!
29412935
Weaviate.Client.ExportClient.CreateSync(Weaviate.Client.Models.ExportCreateRequest! request, System.TimeSpan? timeout = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Weaviate.Client.Models.Export!>!
2942-
Weaviate.Client.ExportClient.GetStatus(Weaviate.Client.Models.BackupBackend! backend, string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Weaviate.Client.Models.Export!>!
29432936
Weaviate.Client.DependencyInjection.IWeaviateClientFactory
29442937
Weaviate.Client.DependencyInjection.IWeaviateClientFactory.GetClient(string! name) -> Weaviate.Client.WeaviateClient!
29452938
Weaviate.Client.DependencyInjection.IWeaviateClientFactory.GetClientAsync(string! name, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Weaviate.Client.WeaviateClient!>!
@@ -3703,17 +3696,14 @@ Weaviate.Client.Models.DeletionStrategy.TimeBasedResolution = 2 -> Weaviate.Clie
37033696
Weaviate.Client.Models.EmptyStringEnumConverter<T>
37043697
Weaviate.Client.Models.EmptyStringEnumConverter<T>.EmptyStringEnumConverter() -> void
37053698
Weaviate.Client.Models.Export
3706-
Weaviate.Client.Models.Export.Backend.get -> Weaviate.Client.Models.BackupBackend!
37073699
Weaviate.Client.Models.Export.Backend.init -> void
37083700
Weaviate.Client.Models.Export.Collections.get -> string![]?
37093701
Weaviate.Client.Models.Export.Collections.init -> void
37103702
Weaviate.Client.Models.Export.CompletedAt.get -> System.DateTimeOffset?
37113703
Weaviate.Client.Models.Export.CompletedAt.init -> void
3712-
Weaviate.Client.Models.Export.Deconstruct(out string! Id, out Weaviate.Client.Models.BackupBackend! Backend, out string? Path, out string! StatusRaw, out string![]? Collections, out System.DateTimeOffset? StartedAt, out System.DateTimeOffset? CompletedAt, out string? Error) -> void
37133704
Weaviate.Client.Models.Export.Error.get -> string?
37143705
Weaviate.Client.Models.Export.Error.init -> void
37153706
Weaviate.Client.Models.Export.Export(Weaviate.Client.Models.Export! original) -> void
3716-
Weaviate.Client.Models.Export.Export(string! Id, Weaviate.Client.Models.BackupBackend! Backend, string? Path, string! StatusRaw, string![]? Collections, System.DateTimeOffset? StartedAt, System.DateTimeOffset? CompletedAt, string? Error) -> void
37173707
Weaviate.Client.Models.Export.Path.get -> string?
37183708
Weaviate.Client.Models.Export.Path.init -> void
37193709
Weaviate.Client.Models.Export.Id.get -> string!
@@ -3735,13 +3725,10 @@ Weaviate.Client.Models.ExportClientConfig.PollInterval.init -> void
37353725
Weaviate.Client.Models.ExportClientConfig.Timeout.get -> System.TimeSpan
37363726
Weaviate.Client.Models.ExportClientConfig.Timeout.init -> void
37373727
Weaviate.Client.Models.ExportCreateRequest
3738-
Weaviate.Client.Models.ExportCreateRequest.Backend.get -> Weaviate.Client.Models.BackupBackend!
37393728
Weaviate.Client.Models.ExportCreateRequest.Backend.init -> void
3740-
Weaviate.Client.Models.ExportCreateRequest.Deconstruct(out string! Id, out Weaviate.Client.Models.BackupBackend! Backend, out Weaviate.Client.Models.ExportFileFormat FileFormat, out Weaviate.Client.Internal.AutoArray<string!>? IncludeCollections, out Weaviate.Client.Internal.AutoArray<string!>? ExcludeCollections) -> void
37413729
Weaviate.Client.Models.ExportCreateRequest.ExcludeCollections.get -> Weaviate.Client.Internal.AutoArray<string!>?
37423730
Weaviate.Client.Models.ExportCreateRequest.ExcludeCollections.init -> void
37433731
Weaviate.Client.Models.ExportCreateRequest.ExportCreateRequest(Weaviate.Client.Models.ExportCreateRequest! original) -> void
3744-
Weaviate.Client.Models.ExportCreateRequest.ExportCreateRequest(string! Id, Weaviate.Client.Models.BackupBackend! Backend, Weaviate.Client.Models.ExportFileFormat FileFormat, Weaviate.Client.Internal.AutoArray<string!>? IncludeCollections = null, Weaviate.Client.Internal.AutoArray<string!>? ExcludeCollections = null) -> void
37453732
Weaviate.Client.Models.ExportCreateRequest.FileFormat.get -> Weaviate.Client.Models.ExportFileFormat
37463733
Weaviate.Client.Models.ExportCreateRequest.FileFormat.init -> void
37473734
Weaviate.Client.Models.ExportCreateRequest.Id.get -> string!
@@ -6952,3 +6939,46 @@ Weaviate.Client.DependencyInjection.WeaviateOptions.AddIntegration(string! integ
69526939
Weaviate.Client.ClientConfigurationExtensions
69536940
static Weaviate.Client.ClientConfigurationExtensions.WithIntegration(this Weaviate.Client.ClientConfiguration! config, string! integrationValue) -> Weaviate.Client.ClientConfiguration!
69546941
static Weaviate.Client.WeaviateClientBuilderExtensions.WithIntegration(this Weaviate.Client.WeaviateClientBuilder! builder, string! integrationValue) -> Weaviate.Client.WeaviateClientBuilder!
6942+
Weaviate.Client.ExportClient.Cancel(Weaviate.Client.Models.StorageBackend! backend, string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
6943+
Weaviate.Client.ExportClient.GetStatus(Weaviate.Client.Models.StorageBackend! backend, string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Weaviate.Client.Models.Export!>!
6944+
Weaviate.Client.Models.Export.Backend.get -> Weaviate.Client.Models.StorageBackend!
6945+
Weaviate.Client.Models.Export.Deconstruct(out string! Id, out Weaviate.Client.Models.StorageBackend! Backend, out string? Path, out string! StatusRaw, out string![]? Collections, out System.DateTimeOffset? StartedAt, out System.DateTimeOffset? CompletedAt, out string? Error) -> void
6946+
Weaviate.Client.Models.Export.Export(string! Id, Weaviate.Client.Models.StorageBackend! Backend, string? Path, string! StatusRaw, string![]? Collections, System.DateTimeOffset? StartedAt, System.DateTimeOffset? CompletedAt, string? Error) -> void
6947+
Weaviate.Client.Models.ExportBackend
6948+
Weaviate.Client.Models.ExportBackend.ExportBackend() -> void
6949+
Weaviate.Client.Models.ExportBackend.ExportBackend(Weaviate.Client.Models.ExportBackend! original) -> void
6950+
Weaviate.Client.Models.ExportCreateRequest.Backend.get -> Weaviate.Client.Models.StorageBackend!
6951+
Weaviate.Client.Models.ExportCreateRequest.Deconstruct(out string! Id, out Weaviate.Client.Models.StorageBackend! Backend, out Weaviate.Client.Models.ExportFileFormat FileFormat, out Weaviate.Client.Internal.AutoArray<string!>? IncludeCollections, out Weaviate.Client.Internal.AutoArray<string!>? ExcludeCollections) -> void
6952+
Weaviate.Client.Models.ExportCreateRequest.ExportCreateRequest(string! Id, Weaviate.Client.Models.StorageBackend! Backend, Weaviate.Client.Models.ExportFileFormat FileFormat, Weaviate.Client.Internal.AutoArray<string!>? IncludeCollections = null, Weaviate.Client.Internal.AutoArray<string!>? ExcludeCollections = null) -> void
6953+
Weaviate.Client.Models.StorageBackend
6954+
Weaviate.Client.Models.StorageBackend.StorageBackend() -> void
6955+
Weaviate.Client.Models.StorageBackend.StorageBackend(Weaviate.Client.Models.StorageBackend! original) -> void
6956+
abstract Weaviate.Client.Models.StorageBackend.<Clone>$() -> Weaviate.Client.Models.StorageBackend!
6957+
abstract Weaviate.Client.Models.StorageBackend.Path.get -> string?
6958+
abstract Weaviate.Client.Models.StorageBackend.Provider.get -> Weaviate.Client.Models.BackupStorageProvider
6959+
override Weaviate.Client.Models.BackupBackend.EqualityContract.get -> System.Type!
6960+
override Weaviate.Client.Models.BackupBackend.PrintMembers(System.Text.StringBuilder! builder) -> bool
6961+
override Weaviate.Client.Models.ExportBackend.EqualityContract.get -> System.Type!
6962+
override Weaviate.Client.Models.ExportBackend.Equals(object? obj) -> bool
6963+
override Weaviate.Client.Models.ExportBackend.GetHashCode() -> int
6964+
override Weaviate.Client.Models.ExportBackend.PrintMembers(System.Text.StringBuilder! builder) -> bool
6965+
override Weaviate.Client.Models.ExportBackend.ToString() -> string!
6966+
override Weaviate.Client.Models.StorageBackend.Equals(object? obj) -> bool
6967+
override Weaviate.Client.Models.StorageBackend.GetHashCode() -> int
6968+
override Weaviate.Client.Models.StorageBackend.ToString() -> string!
6969+
override abstract Weaviate.Client.Models.BackupBackend.<Clone>$() -> Weaviate.Client.Models.BackupBackend!
6970+
override abstract Weaviate.Client.Models.ExportBackend.<Clone>$() -> Weaviate.Client.Models.ExportBackend!
6971+
override sealed Weaviate.Client.Models.BackupBackend.Equals(Weaviate.Client.Models.StorageBackend? other) -> bool
6972+
override sealed Weaviate.Client.Models.ExportBackend.Equals(Weaviate.Client.Models.StorageBackend? other) -> bool
6973+
static Weaviate.Client.Models.ExportBackend.Azure(string? bucket = null, string? path = null) -> Weaviate.Client.Models.StorageBackend!
6974+
static Weaviate.Client.Models.ExportBackend.Filesystem(string? path = null) -> Weaviate.Client.Models.StorageBackend!
6975+
static Weaviate.Client.Models.ExportBackend.GCS(string? bucket = null, string? path = null) -> Weaviate.Client.Models.StorageBackend!
6976+
static Weaviate.Client.Models.ExportBackend.S3(string? bucket = null, string? path = null) -> Weaviate.Client.Models.StorageBackend!
6977+
static Weaviate.Client.Models.ExportBackend.operator !=(Weaviate.Client.Models.ExportBackend? left, Weaviate.Client.Models.ExportBackend? right) -> bool
6978+
static Weaviate.Client.Models.ExportBackend.operator ==(Weaviate.Client.Models.ExportBackend? left, Weaviate.Client.Models.ExportBackend? right) -> bool
6979+
static Weaviate.Client.Models.StorageBackend.operator !=(Weaviate.Client.Models.StorageBackend? left, Weaviate.Client.Models.StorageBackend? right) -> bool
6980+
static Weaviate.Client.Models.StorageBackend.operator ==(Weaviate.Client.Models.StorageBackend? left, Weaviate.Client.Models.StorageBackend? right) -> bool
6981+
virtual Weaviate.Client.Models.ExportBackend.Equals(Weaviate.Client.Models.ExportBackend? other) -> bool
6982+
virtual Weaviate.Client.Models.StorageBackend.EqualityContract.get -> System.Type!
6983+
virtual Weaviate.Client.Models.StorageBackend.Equals(Weaviate.Client.Models.StorageBackend? other) -> bool
6984+
virtual Weaviate.Client.Models.StorageBackend.PrintMembers(System.Text.StringBuilder! builder) -> bool

0 commit comments

Comments
 (0)