From 7c11fa5ebcd3516aa8d21159a928380e2e35fc83 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2020 11:10:28 +1000 Subject: [PATCH] Add index filter to field_caps API (#4888) (#4898) Relates: elastic/elasticsearch#57276 Co-authored-by: Russ Cam --- .../FieldCapabilitiesRequest.cs | 21 +++++-- .../FieldCapabilitiesApiTests.cs | 63 ++++++++++++++++++- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/Nest/Search/FieldCapabilities/FieldCapabilitiesRequest.cs b/src/Nest/Search/FieldCapabilities/FieldCapabilitiesRequest.cs index 98f00d3b7f7..d13569a2fd7 100644 --- a/src/Nest/Search/FieldCapabilities/FieldCapabilitiesRequest.cs +++ b/src/Nest/Search/FieldCapabilities/FieldCapabilitiesRequest.cs @@ -2,20 +2,33 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -using Elasticsearch.Net; +using System; +using System.Runtime.Serialization; +using Elasticsearch.Net; namespace Nest { [MapsApi("field_caps.json")] - public partial interface IFieldCapabilitiesRequest { } + public partial interface IFieldCapabilitiesRequest + { + [DataMember(Name = "index_filter")] + QueryContainer IndexFilter { get; set; } + } public partial class FieldCapabilitiesRequest { - protected override HttpMethod HttpMethod => HttpMethod.GET; + protected override HttpMethod HttpMethod => IndexFilter != null? HttpMethod.POST : HttpMethod.GET; + + public QueryContainer IndexFilter { get; set; } } public partial class FieldCapabilitiesDescriptor { - protected override HttpMethod HttpMethod => HttpMethod.GET; + QueryContainer IFieldCapabilitiesRequest.IndexFilter { get; set; } + + protected override HttpMethod HttpMethod => Self.IndexFilter != null? HttpMethod.POST : HttpMethod.GET; + + public FieldCapabilitiesDescriptor IndexFilter(Func, QueryContainer> query) where T : class => + Assign(query, (a, v) => a.IndexFilter = v?.Invoke(new QueryContainerDescriptor())); } } diff --git a/tests/Tests/Search/FieldCapabilities/FieldCapabilitiesApiTests.cs b/tests/Tests/Search/FieldCapabilities/FieldCapabilitiesApiTests.cs index 60d69d71224..0492ea19d19 100644 --- a/tests/Tests/Search/FieldCapabilities/FieldCapabilitiesApiTests.cs +++ b/tests/Tests/Search/FieldCapabilities/FieldCapabilitiesApiTests.cs @@ -2,8 +2,9 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -using System; +using System; using System.Linq; +using Elastic.Elasticsearch.Xunit.XunitPlumbing; using Elasticsearch.Net; using FluentAssertions; using Nest; @@ -69,4 +70,64 @@ protected override void ExpectResponse(FieldCapabilitiesResponse response) jobTitleCapabilities.Searchable.Should().BeTrue(); } } + + [SkipVersion("<7.9.0", "index filter introduced in 7.9.0")] + public class FieldCapabilitiesIndexFilterApiTests + : ApiIntegrationTestBase + { + public FieldCapabilitiesIndexFilterApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { } + + protected override object ExpectJson => new + { + index_filter = new + { + term = new + { + versionControl = new + { + value = "git" + } + } + } + }; + + protected override bool SupportsDeserialization { get; } = false; + + protected override bool ExpectIsValid => true; + + protected override int ExpectStatusCode => 200; + + protected override Func Fluent => d => d + .Fields("*") + .IndexFilter(q => q + .Term(t => t + .Field(f => f.VersionControl) + .Value(Project.VersionControlConstant) + ) + ); + + protected override HttpMethod HttpMethod => HttpMethod.POST; + + protected override FieldCapabilitiesRequest Initializer => new FieldCapabilitiesRequest(Index().And()) + { + Fields = "*", + IndexFilter = new TermQuery + { + Field = Field(f => f.VersionControl), + Value = Project.VersionControlConstant + } + }; + + protected override string UrlPath => "/project%2Cdevs/_field_caps?fields=%2A"; + + protected override LazyResponses ClientUsage() => Calls( + (c, f) => c.FieldCapabilities(Index().And(), f), + (c, f) => c.FieldCapabilitiesAsync(Index().And(), f), + (c, r) => c.FieldCapabilities(r), + (c, r) => c.FieldCapabilitiesAsync(r) + ); + + protected override void ExpectResponse(FieldCapabilitiesResponse response) => response.ShouldBeValid(); + } }