diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/IndexName/IndexNameResolver.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/IndexName/IndexNameResolver.cs index 82526235753..d71b6aa0ae5 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/IndexName/IndexNameResolver.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/IndexName/IndexNameResolver.cs @@ -28,6 +28,13 @@ public string Resolve(IndexName i) } public string Resolve(Type type) + { + var indexName = TryResolve(type); + ValidateIndexName(indexName); + return indexName; + } + + public string? TryResolve(Type type) { var indexName = _transportClientSettings.DefaultIndex; var defaultIndices = _transportClientSettings.DefaultIndices; @@ -36,8 +43,8 @@ public string Resolve(Type type) if (defaultIndices.TryGetValue(type, out var value) && !string.IsNullOrEmpty(value)) indexName = value; } - ValidateIndexName(indexName); - return indexName; + + return string.IsNullOrWhiteSpace(indexName) ? null : indexName; } private static string PrefixClusterName(IndexName i, string name) => i.Cluster.IsNullOrEmpty() ? name : $"{i.Cluster}:{name}"; diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Inferrer.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Inferrer.cs index 886ae41e0c9..f051df3e36b 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Inferrer.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Core/Infer/Inferrer.cs @@ -41,6 +41,8 @@ public Inferrer(IElasticsearchClientSettings elasticsearchClientSettings) public string IndexName(IndexName index) => IndexNameResolver.Resolve(index); + public string? TryIndexName(Type type) => IndexNameResolver.TryResolve(type); + public string? Id<[DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] T>(T instance) => IdResolver.Resolve(instance); public string? Id([DynamicallyAccessedMembers(PublicProperties | NonPublicProperties)] Type type, object instance) => IdResolver.Resolve(type, instance); diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperation.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperation.cs index 1ec0908821a..104d6408c4c 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperation.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperation.cs @@ -102,8 +102,6 @@ protected override void SetValues(IElasticsearchClientSettings settings) if (!string.IsNullOrEmpty(routing.GetString(settings))) Routing = routing; } - - Index ??= typeof(T); } protected override Type ClrType => typeof(T); diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperationDescriptor.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperationDescriptor.cs index 909528f2887..03bee581c65 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperationDescriptor.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkDeleteOperationDescriptor.cs @@ -43,6 +43,5 @@ public BulkDeleteOperationDescriptor(TDocument documentToDelete) : this(new Id(documentToDelete)) { Instance.Routing = new Routing(documentToDelete); - Instance.Index = IndexName.From(); } } diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkOperation.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkOperation.cs index 64176224271..8fedfa07aec 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkOperation.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Types/Core/Bulk/BulkOperation.cs @@ -103,17 +103,49 @@ internal BulkOperation() /// The for the current client instance. protected abstract Task SerializeAsync(Stream stream, IElasticsearchClientSettings settings); + private IndexName? _bulkRequestIndex; + void IBulkOperation.PrepareIndex(IndexName? bulkRequestIndex) { - Index ??= bulkRequestIndex ?? ClrType; + _bulkRequestIndex = bulkRequestIndex; + } - if (bulkRequestIndex is not null && (Index?.Equals(bulkRequestIndex) ?? false)) - Index = null; + private void ResolveIndex(IElasticsearchClientSettings settings) + { + if (_bulkRequestIndex is not null) + { + var resolvedBulkIndex = settings.Inferrer.IndexName(_bulkRequestIndex); + + string? inferredIndex; + if (Index is not null) + inferredIndex = settings.Inferrer.IndexName(Index); + else if (ClrType is not null) + inferredIndex = settings.Inferrer.TryIndexName(ClrType); + else + inferredIndex = null; + + if (inferredIndex is null || inferredIndex == resolvedBulkIndex) + Index = null; + else + Index = inferredIndex; + } + else + { + Index ??= ClrType; + } } /// - void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) => Serialize(stream, settings); + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + ResolveIndex(settings); + Serialize(stream, settings); + } /// - Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) => SerializeAsync(stream, settings); + Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + ResolveIndex(settings); + return SerializeAsync(stream, settings); + } }