Skip to content

feat(export): add collection export support (Weaviate 1.37+)#324

Merged
mpartipilo merged 8 commits intomainfrom
feat/collection-export
Apr 28, 2026
Merged

feat(export): add collection export support (Weaviate 1.37+)#324
mpartipilo merged 8 commits intomainfrom
feat/collection-export

Conversation

@mpartipilo
Copy link
Copy Markdown
Collaborator

Summary

  • Adds ExportClient to the C# client, matching the Python PR weaviate/weaviate-python-client#1981
  • Follows the existing BackupClient pattern with operation-based polling
  • Requires Weaviate server 1.37.0+ with EXPORT_ENABLED=true

What's included

Domain models (Models/Export.cs)

  • ExportFileFormat enum (Parquet)
  • ExportStatus enum (Started, Transferring, Success, Failed, Canceled)
  • ShardExportStatus enum (Transferring, Success, Failed, Skipped)
  • Export record — returned by create/status; includes Path, ShardStatus, TookInMs
  • ShardExportProgress record — per-shard progress with SkipReason
  • ExportCreateRequest record — Id, Backend, FileFormat, IncludeCollections, ExcludeCollections

Client (ExportClient.cs)

  • client.Export.Create(request) — starts export, returns ExportOperation for polling
  • client.Export.CreateSync(request) — starts export and waits for completion
  • client.Export.GetStatus(backend, id) — checks status of an export
  • client.Export.Cancel(backend, id) — cancels a running export
  • ExportClient.Config — static ExportClientConfig (poll interval, timeout)

REST layer (Rest/Export.cs, Rest/Endpoints.cs)

  • POST /export/{backend} — create
  • GET /export/{backend}/{id} — status
  • DELETE /export/{backend}/{id} — cancel (accepts 204 and 409)

Operation polling (Models/ExportOperationBase.cs, Models/ExportOperation.cs)

  • Background refresh with WaitForCompletion(timeout?) and Cancel()
  • IDisposable / IAsyncDisposable for resource cleanup

Spec — synced openapi.json from weaviate/weaviate v1.37.0 (stable release removed Config DTO from export request that appeared in a pre-release spec)

Test plan

  • 12 unit tests covering request serialization, status mapping, shard progress, cancellation
  • Integration tests require server with EXPORT_ENABLED=true (see src/Weaviate.Client.Tests/Integration/TestExports.cs)

🤖 Generated with Claude Code

Copy link
Copy Markdown

@orca-security-eu orca-security-eu Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Infrastructure as Code high 0   medium 0   low 0   info 0 View in Orca
Passed Passed SAST high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Vulnerabilities high 0   medium 0   low 0   info 0 View in Orca

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 17, 2026

Summary - Weaviate C# Client Coverage

Summary
Generated on: 04/28/2026 - 10:57:07
Coverage date: 04/28/2026 - 10:48:48 - 04/28/2026 - 10:56:20
Parser: MultiReport (103x Cobertura)
Assemblies: 3
Classes: 365
Files: 234
Line coverage: 46.9% (10691 of 22750)
Covered lines: 10691
Uncovered lines: 12059
Coverable lines: 22750
Total lines: 58163
Branch coverage: 35.3% (2317 of 6560)
Covered branches: 2317
Total branches: 6560
Method coverage: Feature is only available for sponsors

Coverage

Weaviate.Client - 48.9%
Name Line Branch
Weaviate.Client 48.9% 37.6%
Weaviate.Client.AggregateClient 19.5% 11.3%
Weaviate.Client.AggregateClientHybridExtensions 0%
Weaviate.Client.AliasClient 100% 62.5%
Weaviate.Client.ApiKeyTokenService 100% 50%
Weaviate.Client.Auth 38%
Weaviate.Client.AuthenticatedHttpHandler 71.7% 60%
Weaviate.Client.BackupClient 82% 45.8%
Weaviate.Client.BaseCollectionClient 0% 0%
Weaviate.Client.Batch.BatchContext 58% 50%
Weaviate.Client.Batch.BatchManager 39.2% 25.7%
Weaviate.Client.Batch.BatchOptions 25% 50%
Weaviate.Client.Batch.BatchResult 100%
Weaviate.Client.Batch.TaskHandle 83.3% 50%
Weaviate.Client.Cache.SchemaCache 69.4% 60%
Weaviate.Client.ClientConfiguration 100% 100%
Weaviate.Client.ClientConfigurationExtensions 35.2% 16.6%
Weaviate.Client.ClusterClient 86.2% 64.2%
Weaviate.Client.CollectionClient 98.7% 87.5%
Weaviate.Client.CollectionClientExtensions 100% 100%
Weaviate.Client.CollectionConfigClient 95.5% 58.3%
Weaviate.Client.CollectionsClient 32.3% 35%
Weaviate.Client.Configure 49% 47.3%
Weaviate.Client.Connect 25.5% 0%
Weaviate.Client.DataClient 91.5% 78.7%
Weaviate.Client.DefaultTokenServiceFactory 28.5% 25%
Weaviate.Client.DependencyInjection.WeaviateClientFactory 0% 0%
Weaviate.Client.DependencyInjection.WeaviateInitializationService 0%
Weaviate.Client.DependencyInjection.WeaviateOptions 50.9% 87.5%
Weaviate.Client.DependencyInjection.WeaviateServiceCollectionExtensions 0% 0%
Weaviate.Client.ExportClient 94% 47.8%
Weaviate.Client.Factory 100%
Weaviate.Client.Generate 100%
Weaviate.Client.GenerateClient 13.3% 32.6%
Weaviate.Client.GenerateClientHybridExtensions 0%
Weaviate.Client.GenerativeConfigFactory 5.2% 100%
Weaviate.Client.GenerativeProviderFactory 1%
Weaviate.Client.GroupsClient 100%
Weaviate.Client.GroupsOidcClient 47.8%
Weaviate.Client.Grpc.BatchStreamContext 100%
Weaviate.Client.Grpc.BatchStreamWrapper 75.3% 58.9%
Weaviate.Client.Grpc.LoggingInterceptor 0% 0%
Weaviate.Client.Grpc.RetryInterceptor 41.6% 37.5%
Weaviate.Client.Grpc.WeaviateGrpcClient 66.7% 49.8%
Weaviate.Client.Grpc.WeaviateGrpcServerException 0%
Weaviate.Client.Internal.AutoArray`1 61.9% 50%
Weaviate.Client.Internal.AutoArrayBuilder 100% 100%
Weaviate.Client.Internal.BatchStreamAcks 100%
Weaviate.Client.Internal.BatchStreamBackoff 0%
Weaviate.Client.Internal.BatchStreamError 0%
Weaviate.Client.Internal.BatchStreamOutOfMemory 0%
Weaviate.Client.Internal.BatchStreamResults 100%
Weaviate.Client.Internal.BatchStreamSuccess 100%
Weaviate.Client.Internal.ExceptionHelper 72.1% 61.5%
Weaviate.Client.Internal.HttpLoggingHandler 0% 0%
Weaviate.Client.Internal.KeySortedList`2 50%
Weaviate.Client.Internal.MultiKeySortedList`2 0% 0%
Weaviate.Client.Internal.ObjectHelper 48% 34.8%
Weaviate.Client.Internal.RetryHandler 49% 50%
Weaviate.Client.Internal.TimeoutHelper 72.9% 44.4%
Weaviate.Client.Internal.VersionGuard 92.3% 88.8%
Weaviate.Client.Models.Aggregate 100%
Weaviate.Client.Models.AggregateGroupByResult 26.1% 8.4%
Weaviate.Client.Models.AggregateResult 49.2% 12.8%
Weaviate.Client.Models.Alias 100%
Weaviate.Client.Models.AliasesResource 100%
Weaviate.Client.Models.AndNestedFilter 50%
Weaviate.Client.Models.Backup 63.6%
Weaviate.Client.Models.BackupBackend 20%
Weaviate.Client.Models.BackupClientConfig 100%
Weaviate.Client.Models.BackupCreateOperation 100%
Weaviate.Client.Models.BackupCreateRequest 100%
Weaviate.Client.Models.BackupOperationBase 67.7% 67.8%
Weaviate.Client.Models.BackupRestoreOperation 100%
Weaviate.Client.Models.BackupRestoreRequest 100%
Weaviate.Client.Models.BackupsResource 100%
Weaviate.Client.Models.BackupStatusExtensions 78.5% 52.5%
Weaviate.Client.Models.BatchInsertRequest 52.1%
Weaviate.Client.Models.BatchInsertResponse 80%
Weaviate.Client.Models.BatchInsertResponseEntry 100%
Weaviate.Client.Models.BatchReferenceReturn 29% 0%
Weaviate.Client.Models.BM25Config 61.1% 66.6%
Weaviate.Client.Models.Bm25ConfigUpdate 60% 50%
Weaviate.Client.Models.BM25Operator 66.6%
Weaviate.Client.Models.ClusterNode 30.7%
Weaviate.Client.Models.ClusterNodeVerbose 23% 0%
Weaviate.Client.Models.CollectionConfig 69.5% 57.1%
Weaviate.Client.Models.CollectionConfigCommon 67.9% 59.3%
Weaviate.Client.Models.CollectionConfigExport 0% 0%
Weaviate.Client.Models.CollectionsResource 100%
Weaviate.Client.Models.CollectionUpdate 42.2% 50%
Weaviate.Client.Models.CurrentUserInfo 80%
Weaviate.Client.Models.DatabaseUser 55.5%
Weaviate.Client.Models.DataReference 100% 50%
Weaviate.Client.Models.DataResource 100%
Weaviate.Client.Models.DataTypeExtensions 0% 0%
Weaviate.Client.Models.DeleteManyObjectResult 100%
Weaviate.Client.Models.DeleteManyResult 100%
Weaviate.Client.Models.DynamicDto 0%
Weaviate.Client.Models.EmptyBackend 33.3%
Weaviate.Client.Models.EmptyStringEnumConverter`1 86.9% 66.6%
Weaviate.Client.Models.Export 61.5%
Weaviate.Client.Models.ExportBackend 0%
Weaviate.Client.Models.ExportClientConfig 100%
Weaviate.Client.Models.ExportCreateRequest 100%
Weaviate.Client.Models.ExportOperation 100%
Weaviate.Client.Models.ExportOperationBase 72.5% 67.8%
Weaviate.Client.Models.ExportStatusExtensions 63.6% 41.6%
Weaviate.Client.Models.FilesystemBackend 100%
Weaviate.Client.Models.Filter 60.8% 40%
Weaviate.Client.Models.Filter`1 50% 50%
Weaviate.Client.Models.FlatDto 100%
Weaviate.Client.Models.FlexibleConverter`1 11.3% 3.4%
Weaviate.Client.Models.FlexibleStringConverter 38.4% 25%
Weaviate.Client.Models.Generative.Providers 0.6%
Weaviate.Client.Models.GenerativeConfig 7.5%
Weaviate.Client.Models.GenerativeConfigSerialization 46.8% 55.4%
Weaviate.Client.Models.GenerativeDebug 0%
Weaviate.Client.Models.GenerativeGroupByObject 100%
Weaviate.Client.Models.GenerativeGroupByResult 25%
Weaviate.Client.Models.GenerativePrompt 100%
Weaviate.Client.Models.GenerativeProvider 83.3%
Weaviate.Client.Models.GenerativeReply 100%
Weaviate.Client.Models.GenerativeResult 20% 0%
Weaviate.Client.Models.GenerativeWeaviateGroup 100%
Weaviate.Client.Models.GenerativeWeaviateObject 100%
Weaviate.Client.Models.GenerativeWeaviateResult 100%
Weaviate.Client.Models.GeoCoordinate 100%
Weaviate.Client.Models.GeoCoordinateConstraint 0%
Weaviate.Client.Models.GroupByObject 100%
Weaviate.Client.Models.GroupByRequest 100%
Weaviate.Client.Models.GroupByResult 16.6%
Weaviate.Client.Models.GroupByResult`2 100%
Weaviate.Client.Models.GroupedTask 100%
Weaviate.Client.Models.GroupRoleAssignment 0%
Weaviate.Client.Models.GroupsResource 100%
Weaviate.Client.Models.HFreshDto 0%
Weaviate.Client.Models.HnswDto 100%
Weaviate.Client.Models.HybridNearTextBuilder 0%
Weaviate.Client.Models.HybridNearVectorBuilder 0%
Weaviate.Client.Models.HybridVectorInput 78.5% 85.7%
Weaviate.Client.Models.HybridVectorInputBuilder 0%
Weaviate.Client.Models.InvertedIndexConfig 58.6% 46.1%
Weaviate.Client.Models.InvertedIndexConfigUpdate 80% 50%
Weaviate.Client.Models.JsonConverterEmptyCollectionAsNull 73.6% 50%
Weaviate.Client.Models.Metadata 100%
Weaviate.Client.Models.MetadataQuery 81.8%
Weaviate.Client.Models.MetaInfo 92.8% 80%
Weaviate.Client.Models.Metrics 84.8% 60%
Weaviate.Client.Models.ModelsToDtoExtensions 100% 85%
Weaviate.Client.Models.ModuleConfigList 0% 0%
Weaviate.Client.Models.Move 100%
Weaviate.Client.Models.MultiTenancyConfig 100%
Weaviate.Client.Models.MultiTenancyConfigUpdate 60%
Weaviate.Client.Models.MultiVectorDto 100%
Weaviate.Client.Models.MultiVectorEncodingDto 100%
Weaviate.Client.Models.MuveraDto 100% 100%
Weaviate.Client.Models.NamedVector 100% 100%
Weaviate.Client.Models.NearTextBuilder 36.2%
Weaviate.Client.Models.NearTextInput 50%
Weaviate.Client.Models.NearVectorBuilder 0%
Weaviate.Client.Models.NearVectorInput 45.4%
Weaviate.Client.Models.NestedFilter 100%
Weaviate.Client.Models.NodesResource 50%
Weaviate.Client.Models.NodeStatusExtensions 0% 0%
Weaviate.Client.Models.NotNestedFilter 100%
Weaviate.Client.Models.ObjectReference 80%
Weaviate.Client.Models.ObjectStorageBackend 0%
Weaviate.Client.Models.ObjectTTLConfig 97.5%
Weaviate.Client.Models.ObjectTTLConfigUpdate 89.6% 26.9%
Weaviate.Client.Models.OrNestedFilter 100%
Weaviate.Client.Models.PermissionResourceExtensions 78.9% 33.3%
Weaviate.Client.Models.Permissions 67.8% 60%
Weaviate.Client.Models.PermissionScope 100%
Weaviate.Client.Models.PhoneNumber 77.7%
Weaviate.Client.Models.Property 86.5% 62.9%
Weaviate.Client.Models.Property`1 100%
Weaviate.Client.Models.PropertyFilter 74.4% 50%
Weaviate.Client.Models.PropertyHelper 67.8% 53.4%
Weaviate.Client.Models.PropertyIndexTypeExtensions 50% 25%
Weaviate.Client.Models.PropertyUpdate 25%
Weaviate.Client.Models.QueryProfile 100%
Weaviate.Client.Models.QueryReference 100%
Weaviate.Client.Models.Reference 100%
Weaviate.Client.Models.ReferenceFilter 100%
Weaviate.Client.Models.ReferenceUpdate 0%
Weaviate.Client.Models.ReplicateRequest 100%
Weaviate.Client.Models.ReplicateResource 100%
Weaviate.Client.Models.ReplicationAsyncConfig 0%
Weaviate.Client.Models.ReplicationClientConfig 100%
Weaviate.Client.Models.ReplicationConfig 100%
Weaviate.Client.Models.ReplicationConfigUpdate 44.4%
Weaviate.Client.Models.ReplicationOperation 70% 50%
Weaviate.Client.Models.ReplicationOperationError 0%
Weaviate.Client.Models.ReplicationOperationStatus 37.5% 0%
Weaviate.Client.Models.ReplicationOperationTracker 64% 54.5%
Weaviate.Client.Models.Rerank 100%
Weaviate.Client.Models.Reranker 15.3%
Weaviate.Client.Models.RerankerConfigSerialization 56.8% 55%
Weaviate.Client.Models.RoleInfo 100%
Weaviate.Client.Models.RolesResource 100%
Weaviate.Client.Models.SearchProfile 100%
Weaviate.Client.Models.ShardInfo 100%
Weaviate.Client.Models.ShardingConfig 100%
Weaviate.Client.Models.ShardProfile 100%
Weaviate.Client.Models.ShardProgress 33.3%
Weaviate.Client.Models.ShardStatusExtensions 100% 50%
Weaviate.Client.Models.SimpleTargetVectors 100%
Weaviate.Client.Models.SinglePrompt 100%
Weaviate.Client.Models.Sort 100% 50%
Weaviate.Client.Models.SortExtensions 100%
Weaviate.Client.Models.StopwordConfig 61.9% 62.5%
Weaviate.Client.Models.StopwordsConfigUpdate 57.1% 50%
Weaviate.Client.Models.TargetVectors 27.6% 0%
Weaviate.Client.Models.Tenant 38.8% 13.3%
Weaviate.Client.Models.TenantsResource 100%
Weaviate.Client.Models.TimeFilter 75% 25%
Weaviate.Client.Models.Typed.AggregateGroupByResult`1 0% 0%
Weaviate.Client.Models.Typed.AggregatePropertyMapper 0% 0%
Weaviate.Client.Models.Typed.AggregateResult`1 0%
Weaviate.Client.Models.Typed.BooleanMetricsAttribute 0%
Weaviate.Client.Models.Typed.DateMetricsAttribute 0%
Weaviate.Client.Models.Typed.GenerativeGroupByObject`1 0%
Weaviate.Client.Models.Typed.GenerativeGroupByResult`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateGroup`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateObject`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateResult`1 0%
Weaviate.Client.Models.Typed.GroupByObject`1 0%
Weaviate.Client.Models.Typed.GroupByResult`1 0%
Weaviate.Client.Models.Typed.IntegerMetricsAttribute 0%
Weaviate.Client.Models.Typed.MetricsExtractor 0% 0%
Weaviate.Client.Models.Typed.NumberMetricsAttribute 0%
Weaviate.Client.Models.Typed.TextMetricsAttribute 0%
Weaviate.Client.Models.Typed.TypedResultConverter 12% 7.6%
Weaviate.Client.Models.Typed.WeaviateGroup`2 0%
Weaviate.Client.Models.Typed.WeaviateObject`1 47.3% 37.5%
Weaviate.Client.Models.TypedBase`1 70.5%
Weaviate.Client.Models.TypedGuid 66.6%
Weaviate.Client.Models.TypedValue`1 80%
Weaviate.Client.Models.User 0%
Weaviate.Client.Models.UserMetadata 0%
Weaviate.Client.Models.UserRoleAssignment 100%
Weaviate.Client.Models.UsersResource 100%
Weaviate.Client.Models.Vector 32.8% 18.7%
Weaviate.Client.Models.VectorBuilder 0% 0%
Weaviate.Client.Models.VectorConfig 82.7% 50%
Weaviate.Client.Models.VectorConfigList 59.3% 60%
Weaviate.Client.Models.VectorConfigUpdate 50%
Weaviate.Client.Models.VectorIndex 84.3%
Weaviate.Client.Models.VectorIndexConfig 100%
Weaviate.Client.Models.VectorIndexConfigUpdate 68.4% 33.3%
Weaviate.Client.Models.VectorIndexConfigUpdateDynamic 0% 0%
Weaviate.Client.Models.VectorIndexConfigUpdateFlat 40%
Weaviate.Client.Models.VectorIndexConfigUpdateHNSW 52.9%
Weaviate.Client.Models.VectorIndexMappingExtensions 65.1% 50%
Weaviate.Client.Models.VectorIndexSerialization 43.2% 33.3%
Weaviate.Client.Models.VectorInputBuilderFactories 50% 50%
Weaviate.Client.Models.Vectorizer 9% 0%
Weaviate.Client.Models.VectorizerAttribute 100%
Weaviate.Client.Models.VectorizerConfig 64.1% 56.2%
Weaviate.Client.Models.VectorizerRegistry 68.9% 71.4%
Weaviate.Client.Models.Vectorizers.VectorizerConfigFactory 58% 62.5%
Weaviate.Client.Models.VectorMulti`1 38.8% 23%
Weaviate.Client.Models.VectorQuery 45% 50%
Weaviate.Client.Models.Vectors 31.2% 100%
Weaviate.Client.Models.VectorSearchInput 51.7% 16.6%
Weaviate.Client.Models.VectorSingle`1 18.1% 0%
Weaviate.Client.Models.WeaviateGroup`1 80%
Weaviate.Client.Models.WeaviateObject 88.8%
Weaviate.Client.Models.WeaviateObjectExtensions 56.5% 50%
Weaviate.Client.Models.WeaviateResult 100%
Weaviate.Client.Models.WeaviateResult`1 100%
Weaviate.Client.Models.WeightedField 0%
Weaviate.Client.Models.WeightedFields 0% 0%
Weaviate.Client.Models.WeightedTargetVectors 100% 100%
Weaviate.Client.NearMediaBuilder 0% 0%
Weaviate.Client.NearMediaInput 0%
Weaviate.Client.NodesClient 87.5% 50%
Weaviate.Client.OAuthConfig 71.4%
Weaviate.Client.OAuthTokenService 39.3% 18.7%
Weaviate.Client.QueryClient 47.6% 40%
Weaviate.Client.QueryClientHybridExtensions 0% 0%
Weaviate.Client.QueryClientNearTextExtensions 0% 0%
Weaviate.Client.ReplicationsClient 88.2% 55.1%
Weaviate.Client.RequiresWeaviateVersionAttribute 100%
Weaviate.Client.RerankerConfigFactory 14.2% 100%
Weaviate.Client.Rest.EnumMemberJsonConverter`1 0% 0%
Weaviate.Client.Rest.EnumMemberJsonConverterFactory 0%
Weaviate.Client.Rest.HttpResponseMessageExtensions 82.9% 62.5%
Weaviate.Client.Rest.InvalidEnumWireFormatException 0%
Weaviate.Client.Rest.WeaviateEndpoints 78.9% 75.8%
Weaviate.Client.Rest.WeaviateRestClient 88.3% 53.2%
Weaviate.Client.Rest.WeaviateRestClientException 0% 0%
Weaviate.Client.Rest.WeaviateRestServerException 0% 0%
Weaviate.Client.Rest.WeaviateUnexpectedStatusCodeException 100%
Weaviate.Client.RetryPolicy 50% 42.8%
Weaviate.Client.RolesClient 90.3% 50%
Weaviate.Client.Serialization.Converters.BlobPropertyConverter 58.8% 37.5%
Weaviate.Client.Serialization.Converters.BoolPropertyConverter 64% 40%
Weaviate.Client.Serialization.Converters.DatePropertyConverter 31% 21%
Weaviate.Client.Serialization.Converters.GeoPropertyConverter 28.3% 10.5%
Weaviate.Client.Serialization.Converters.IntPropertyConverter 49.2% 26.3%
Weaviate.Client.Serialization.Converters.NumberPropertyConverter 56.8% 23.5%
Weaviate.Client.Serialization.Converters.ObjectPropertyConverter 18% 7.3%
Weaviate.Client.Serialization.Converters.PhonePropertyConverter 14.4% 5.2%
Weaviate.Client.Serialization.Converters.TextPropertyConverter 36.3% 20.8%
Weaviate.Client.Serialization.Converters.UuidPropertyConverter 61.1% 37.5%
Weaviate.Client.Serialization.PropertyBag 0% 0%
Weaviate.Client.Serialization.PropertyConverterBase 23% 11.9%
Weaviate.Client.Serialization.PropertyConverterRegistry 73.6% 65.5%
Weaviate.Client.TenantsClient 84.5% 37.5%
Weaviate.Client.Typed.TypedCollectionClient`1 91.1% 50%
Weaviate.Client.Typed.TypedDataClient`1 49%
Weaviate.Client.Typed.TypedGenerateClient`1 0.8% 0%
Weaviate.Client.Typed.TypedGenerateClientHybridExtensions 0%
Weaviate.Client.Typed.TypedQueryClient`1 10.6% 100%
Weaviate.Client.Typed.TypedQueryClientHybridExtensions 0%
Weaviate.Client.UsersClient 89.4% 66.6%
Weaviate.Client.UsersDatabaseClient 100% 62.5%
Weaviate.Client.UsersOidcClient 4.5%
Weaviate.Client.Validation.TypeValidationException 0%
Weaviate.Client.Validation.TypeValidator 50% 48.6%
Weaviate.Client.Validation.ValidationError 83.3%
Weaviate.Client.Validation.ValidationResult 62.5% 50%
Weaviate.Client.Validation.ValidationWarning 0%
Weaviate.Client.ValidationExtensions 80% 100%
Weaviate.Client.VectorizerFactory 3.1% 0%
Weaviate.Client.VectorizerFactoryMulti 6.2%
Weaviate.Client.WeaviateAuthenticationException 100% 100%
Weaviate.Client.WeaviateAuthorizationException 100% 100%
Weaviate.Client.WeaviateBackupConflictException 100%
Weaviate.Client.WeaviateBadRequestException 0% 0%
Weaviate.Client.WeaviateClient 59.6% 48.6%
Weaviate.Client.WeaviateClientBuilder 56.6% 50%
Weaviate.Client.WeaviateClientBuilderExtensions 0% 0%
Weaviate.Client.WeaviateClientException 33.3%
Weaviate.Client.WeaviateCollectionLimitReachedException 0% 0%
Weaviate.Client.WeaviateConflictException 100%
Weaviate.Client.WeaviateDefaults 100%
Weaviate.Client.WeaviateException 66.6%
Weaviate.Client.WeaviateExtensions 78.4% 52.9%
Weaviate.Client.WeaviateExternalModuleProblemException 0% 0%
Weaviate.Client.WeaviateFeatureNotSupportedException 0% 0%
Weaviate.Client.WeaviateModuleNotAvailableException 0% 0%
Weaviate.Client.WeaviateNotFoundException 14.8% 0%
Weaviate.Client.WeaviateServerException 66.6%
Weaviate.Client.WeaviateTimeoutException 0% 0%
Weaviate.Client.WeaviateUnprocessableEntityException 100% 100%
Weaviate.Client.WeaviateVersionMismatchException 0% 0%
Weaviate.Client.Analyzers - 0%
Name Line Branch
Weaviate.Client.Analyzers 0% 0%
Weaviate.Client.Analyzers.AggregatePropertySuffixAnalyzer 0% 0%
Weaviate.Client.Analyzers.AutoArrayUsageAnalyzer 0% 0%
Weaviate.Client.Analyzers.HybridSearchNullParametersAnalyzer 0% 0%
Weaviate.Client.Analyzers.RequiresVersionEnsureCallAnalyzer 0% 0%
Weaviate.Client.Analyzers.VectorizerFactoryAnalyzer 0% 0%
Weaviate.Client.VectorData - 50.3%
Name Line Branch
Weaviate.Client.VectorData 50.3% 31.2%
Weaviate.Client.VectorData.DependencyInjection.WeaviateVectorDataServiceCol
lectionExtensions
0% 0%
Weaviate.Client.VectorData.Filters.WeaviateFilterTranslator 29.2% 19.5%
Weaviate.Client.VectorData.Mapping.AttributeBasedRecordMapper`1 59.7% 50%
Weaviate.Client.VectorData.Mapping.DataPropertyInfo 100%
Weaviate.Client.VectorData.Mapping.DynamicRecordMapper 0% 0%
Weaviate.Client.VectorData.Mapping.RecordPropertyModel 54.9% 43.1%
Weaviate.Client.VectorData.Mapping.VectorDataSchemaBuilder 41.3% 18.7%
Weaviate.Client.VectorData.Mapping.VectorPropertyInfo 85.7%
Weaviate.Client.VectorData.WeaviateVectorStore 61.2% 33.3%
Weaviate.Client.VectorData.WeaviateVectorStoreCollection`2 71.3% 44.7%
Weaviate.Client.VectorData.WeaviateVectorStoreCollectionOptions 0%
Weaviate.Client.VectorData.WeaviateVectorStoreOptions 0%

@mpartipilo mpartipilo force-pushed the feat/collection-export branch from df57727 to 702d7ad Compare April 18, 2026 12:09
Comment thread src/Weaviate.Client/Batch/README.md Outdated
Comment thread src/Weaviate.Client.Tests/Integration/TestExports.cs
Comment thread src/Weaviate.Client.Tests/Integration/TestExports.cs Outdated
Comment thread src/Weaviate.Client.Tests/Integration/TestReplication.cs
Comment thread src/Weaviate.Client.Tests/Integration/TestExports.cs
mpartipilo added a commit that referenced this pull request Apr 27, 2026
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mpartipilo added a commit that referenced this pull request Apr 28, 2026
Two changes from the PR #324 review:

1. Make ExportCreateRequest.FileFormat required.
   Previously defaulted to ExportFileFormat.Parquet. Reviewer flagged
   that adding a new file format later would silently change behaviour
   for callers who relied on the default. Drop the default — callers
   must now pass the format explicitly. Update all 7 call sites
   (4 integration, 3 unit). PublicAPI.Unshipped.txt updated.

2. ExportClient.Cancel returns Task<bool>, no-throw on 409.
   Previously threw WeaviateConflictException when the server responded
   409 (export already in a terminal state — can't cancel). Reviewer
   wanted a true/false pattern: false = could not cancel, throws only
   for genuine errors like 404 Not Found.

   - Rest/Export.cs ExportCancel: returns bool, returns false on 409,
     delegates other status codes to ManageStatusCode.
   - ExportClient.Cancel: signature now Task<bool>.
   - ExportOperationBase: delegate type + public Cancel both return
     Task<bool>, propagating the result.
   - ExportOperation: matching delegate signature.
   - Cancel_StopsRunningExport integration test: replace try/catch on
     WeaviateConflictException with bool assertion.
   - Two new unit tests cover 204→true, 409→false, 404→throws.
   - PublicAPI.Unshipped.txt updated for all three signature changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mpartipilo mpartipilo force-pushed the feat/collection-export branch from 4ba215d to a9fd2d0 Compare April 28, 2026 06:42
[CollectionDefinition("TestExports", DisableParallelization = true)]
public class TestExports : IntegrationTests
{
static readonly BackupBackend _backend = new FilesystemBackend();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would it be possible to make this type available as ExportBacked. same underlying class, just to make discovery easier?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate with a new name. Coming right up.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in cf6fe89. Added a static ExportBackend class with Filesystem / S3 / GCS / Azure factories that delegate straight to BackupBackend — same underlying types, but typing ExportBackend. surfaces the choices via IntelliSense from the export entry point. Updated the test sites accordingly.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad Claude, bad!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced by 96080d8 — superseding the previous reply on this thread (which pointed to a rejected static-class approach). Final design:

  • New shared base public abstract record StorageBackend carries the abstract Provider / Path contract.
  • BackupBackend : StorageBackend (existing factories unchanged; no consumer impact — FilesystemBackend/ObjectStorageBackend still derive from BackupBackend).
  • New public abstract record ExportBackend : StorageBackend with static Filesystem / S3 / GCS / Azure factories that delegate to BackupBackend's — discoverable from the export entry point, same concrete types underneath.
  • Export-side API widened from BackupBackend to StorageBackend (ExportCreateRequest.Backend, Export.Backend, ExportClient.GetStatus / Cancel parameters), so export-typed variables can be declared StorageBackend instead of leaking BackupBackend.

Test sites still use new FilesystemBackend() / ObjectStorageBackend.S3() to stay symmetric with backup tests at the call site.

mpartipilo and others added 7 commits April 28, 2026 11:29
- Sync openapi.json from weaviate/weaviate v1.37.0 tag (removes Dto.Config
  from ExportCreateRequest; that field never existed in the stable release)
- Regenerate Models.g.cs via NSwag to drop the now-removed Config DTO
- Remove Config assignment from BuildExportCreateRequest in ExportClient
- Add Path field to Export domain model (matches Python ExportCreateReturn.path)
- Update PublicAPI.Unshipped.txt for the new Export constructor signature
- Add volatile to BackupOperationBase state fields for thread safety
- Document REST DTO generation workflow in CLAUDE.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two changes from the PR #324 review:

1. Make ExportCreateRequest.FileFormat required.
   Previously defaulted to ExportFileFormat.Parquet. Reviewer flagged
   that adding a new file format later would silently change behaviour
   for callers who relied on the default. Drop the default — callers
   must now pass the format explicitly. Update all 7 call sites
   (4 integration, 3 unit). PublicAPI.Unshipped.txt updated.

2. ExportClient.Cancel returns Task<bool>, no-throw on 409.
   Previously threw WeaviateConflictException when the server responded
   409 (export already in a terminal state — can't cancel). Reviewer
   wanted a true/false pattern: false = could not cancel, throws only
   for genuine errors like 404 Not Found.

   - Rest/Export.cs ExportCancel: returns bool, returns false on 409,
     delegates other status codes to ManageStatusCode.
   - ExportClient.Cancel: signature now Task<bool>.
   - ExportOperationBase: delegate type + public Cancel both return
     Task<bool>, propagating the result.
   - ExportOperation: matching delegate signature.
   - Cancel_StopsRunningExport integration test: replace try/catch on
     WeaviateConflictException with bool assertion.
   - Two new unit tests cover 204→true, 409→false, 404→throws.
   - PublicAPI.Unshipped.txt updated for all three signature changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Port the same two BackupOperationBase / BackupClient fixes that landed in
#331 to their export counterparts (which were copy-pasted from the backup
pattern):

- ExportOperationBase.DisposeInternal: drop the self-Wait. The method is
  called from RefreshStatusInternal which itself runs inside
  _backgroundRefreshTask, so Wait()ing on that task blocked it on its own
  completion.
- ExportClient.CreateSync: wrap the operation in `await using` so it gets
  disposed on every exit path, not just success (where auto-dispose runs).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mpartipilo mpartipilo force-pushed the feat/collection-export branch from a9fd2d0 to cf6fe89 Compare April 28, 2026 09:34
…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>
@mpartipilo mpartipilo force-pushed the feat/collection-export branch from cf6fe89 to 96080d8 Compare April 28, 2026 10:45
@mpartipilo
Copy link
Copy Markdown
Collaborator Author

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

@mpartipilo mpartipilo merged commit ea8adc2 into main Apr 28, 2026
19 checks passed
@mpartipilo mpartipilo deleted the feat/collection-export branch April 28, 2026 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants