Skip to content

Commit ccd6a81

Browse files
committed
Add support for field stats API
Closes #1446
1 parent 3cad54f commit ccd6a81

9 files changed

+211
-14
lines changed

Diff for: src/Nest/DSL/FieldStatsDescriptor.cs

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Elasticsearch.Net;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace Nest
8+
{
9+
public interface IFieldStatsRequest : IIndicesOptionalExplicitAllPath<FieldStatsRequestParameters>
10+
{
11+
}
12+
13+
public partial class FieldStatsRequest : IndicesOptionalExplicitAllPathBase<FieldStatsRequestParameters>, IFieldStatsRequest
14+
{
15+
protected override void UpdatePathInfo(IConnectionSettingsValues settings, ElasticsearchPathInfo<FieldStatsRequestParameters> pathInfo)
16+
{
17+
FieldStatsPathInfo.Update(settings, pathInfo);
18+
}
19+
}
20+
21+
internal static class FieldStatsPathInfo
22+
{
23+
public static void Update(IConnectionSettingsValues settings, ElasticsearchPathInfo<FieldStatsRequestParameters> pathInfo)
24+
{
25+
pathInfo.HttpMethod = PathInfoHttpMethod.GET;
26+
}
27+
}
28+
29+
public partial class FieldStatsDescriptor
30+
: IndicesOptionalExplicitAllPathDescriptor<FieldStatsDescriptor, FieldStatsRequestParameters>
31+
, IFieldStatsRequest
32+
{
33+
protected override void UpdatePathInfo(IConnectionSettingsValues settings, ElasticsearchPathInfo<FieldStatsRequestParameters> pathInfo)
34+
{
35+
FieldStatsPathInfo.Update(settings, pathInfo);
36+
}
37+
}
38+
}

Diff for: src/Nest/DSL/_Descriptors.generated.cs

+1-7
Original file line numberDiff line numberDiff line change
@@ -2439,7 +2439,7 @@ public ExplainDescriptor<T> FilterPath(string filter_path)
24392439
///http://www.elastic.co/guide/en/elasticsearch/reference/master/search-field-stats.html
24402440
///</pre>
24412441
///</summary>
2442-
public partial class FieldStatsDescriptor : BaseRequest<FieldStatsRequestParameters>
2442+
public partial class FieldStatsDescriptor
24432443
{
24442444

24452445

@@ -2510,12 +2510,6 @@ public FieldStatsDescriptor FilterPath(string filter_path)
25102510
return this;
25112511
}
25122512

2513-
2514-
protected override void UpdatePathInfo(IConnectionSettingsValues settings, ElasticsearchPathInfo<FieldStatsRequestParameters> pathInfo)
2515-
{
2516-
throw new NotImplementedException();
2517-
}
2518-
25192513

25202514
}
25212515

Diff for: src/Nest/DSL/_Requests.generated.cs

+1-7
Original file line numberDiff line numberDiff line change
@@ -2298,7 +2298,7 @@ public string FilterPath
22982298
///http://www.elastic.co/guide/en/elasticsearch/reference/master/search-field-stats.html
22992299
///</pre>
23002300
///</summary>
2301-
public partial class FieldStatsRequest : BasePathRequest<FieldStatsRequestParameters>
2301+
public partial class FieldStatsRequest
23022302
{
23032303

23042304
///<summary>A comma-separated list of fields for to get field statistics for (min value, max value, and more)</summary>
@@ -2356,12 +2356,6 @@ public string FilterPath
23562356
set { this.Request.RequestParameters.AddQueryString("filter_path", value); }
23572357
}
23582358

2359-
2360-
protected override void UpdatePathInfo(IConnectionSettingsValues settings, ElasticsearchPathInfo<FieldStatsRequestParameters> pathInfo)
2361-
{
2362-
throw new NotImplementedException();
2363-
}
2364-
23652359
}
23662360

23672361

Diff for: src/Nest/Domain/Responses/FieldStatsResponse.cs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace Nest
8+
{
9+
[JsonObject]
10+
public interface IFieldStatsResponse : IResponse
11+
{
12+
[JsonProperty("_shards")]
13+
ShardsMetaData Shards { get; set; }
14+
15+
[JsonProperty("indices")]
16+
Dictionary<string, FieldStats> Indices { get; set; }
17+
}
18+
19+
public class FieldStatsResponse : BaseResponse, IFieldStatsResponse
20+
{
21+
public ShardsMetaData Shards { get; set; }
22+
public Dictionary<string, FieldStats> Indices { get; set; }
23+
}
24+
25+
[JsonObject]
26+
public class FieldStats
27+
{
28+
[JsonProperty("fields")]
29+
public Dictionary<string, FieldStatsField> Fields { get; set; }
30+
}
31+
32+
public class FieldStatsField
33+
{
34+
[JsonProperty("max_doc")]
35+
public long MaxDoc { get; set; }
36+
37+
[JsonProperty("doc_count")]
38+
public long DocCount { get; set; }
39+
40+
[JsonProperty("density")]
41+
public long Density { get; set; }
42+
43+
[JsonProperty("sum_doc_freq")]
44+
public long SumDocumentFrequency { get; set; }
45+
46+
[JsonProperty("sum_total_term_freq")]
47+
public long SumTotalTermFrequency { get; set; }
48+
49+
[JsonProperty("min_value")]
50+
public string MinValue { get; set; }
51+
52+
[JsonProperty("max_value")]
53+
public string MaxValue { get; set; }
54+
}
55+
}

Diff for: src/Nest/ElasticClient-FieldStats.cs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using Elasticsearch.Net;
5+
6+
namespace Nest
7+
{
8+
public partial class ElasticClient
9+
{
10+
public IFieldStatsResponse FieldStats(Func<FieldStatsDescriptor, FieldStatsDescriptor> selector)
11+
{
12+
return this.Dispatcher.Dispatch<FieldStatsDescriptor, FieldStatsRequestParameters, FieldStatsResponse>(
13+
selector,
14+
(p, d) => this.RawDispatch.FieldStatsDispatch<FieldStatsResponse>(p)
15+
);
16+
}
17+
18+
public IFieldStatsResponse FieldStats(IFieldStatsRequest request)
19+
{
20+
return this.Dispatcher.Dispatch<IFieldStatsRequest, FieldStatsRequestParameters, FieldStatsResponse>(
21+
request,
22+
(p, d) => this.RawDispatch.FieldStatsDispatch<FieldStatsResponse>(p)
23+
);
24+
}
25+
26+
public Task<IFieldStatsResponse> FieldStatsAsync(Func<FieldStatsDescriptor, FieldStatsDescriptor> selector)
27+
{
28+
return this.Dispatcher.DispatchAsync<FieldStatsDescriptor, FieldStatsRequestParameters, FieldStatsResponse, IFieldStatsResponse>(
29+
selector,
30+
(p, d) => this.RawDispatch.FieldStatsDispatchAsync<FieldStatsResponse>(p)
31+
);
32+
}
33+
34+
public Task<IFieldStatsResponse> FieldStatsAsync(IFieldStatsRequest request)
35+
{
36+
return this.Dispatcher.DispatchAsync<IFieldStatsRequest, FieldStatsRequestParameters, FieldStatsResponse, IFieldStatsResponse>(
37+
request,
38+
(p, d) => this.RawDispatch.FieldStatsDispatchAsync<FieldStatsResponse>(p)
39+
);
40+
}
41+
}
42+
}

Diff for: src/Nest/IElasticClient.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1786,5 +1786,11 @@ Task<IExistsResponse> SearchExistsAsync<T>(Func<SearchExistsDescriptor<T>, Searc
17861786
ICatResponse<CatSegmentsRecord> CatSegments(ICatSegmentsRequest request);
17871787
Task<ICatResponse<CatSegmentsRecord>> CatSegmentsAsync(Func<CatSegmentsDescriptor, CatSegmentsDescriptor> selector = null);
17881788
Task<ICatResponse<CatSegmentsRecord>> CatSegmentsAsync(ICatSegmentsRequest request);
1789+
1790+
/// <inheritdoc />
1791+
IFieldStatsResponse FieldStats(Func<FieldStatsDescriptor, FieldStatsDescriptor> selector);
1792+
IFieldStatsResponse FieldStats(IFieldStatsRequest request);
1793+
Task<IFieldStatsResponse> FieldStatsAsync(Func<FieldStatsDescriptor, FieldStatsDescriptor> selector);
1794+
Task<IFieldStatsResponse> FieldStatsAsync(IFieldStatsRequest request);
17891795
}
17901796
}

Diff for: src/Nest/Nest.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
<Compile Include="Domain\Responses\ClusterStatsResponse.cs" />
178178
<Compile Include="Domain\Responses\ClusterPendingTasksResponse.cs" />
179179
<Compile Include="Domain\Responses\DeleteAliasResponse.cs" />
180+
<Compile Include="Domain\Responses\FieldStatsResponse.cs" />
180181
<Compile Include="Domain\Responses\GetIndexResponse.cs" />
181182
<Compile Include="Domain\Responses\DeleteScriptResponse.cs" />
182183
<Compile Include="Domain\Responses\DeleteSearchTemplateResponse.cs" />
@@ -237,6 +238,7 @@
237238
<Compile Include="DSL\Aggregations\TopHitsAggregationDescriptor.cs" />
238239
<Compile Include="DSL\Aggregations\GeoBoundsAggregationDescriptor.cs" />
239240
<Compile Include="DSL\Aggregations\ReverseNestedAggregationDescriptor.cs" />
241+
<Compile Include="DSL\FieldStatsDescriptor.cs" />
240242
<Compile Include="DSL\Filter\IndicesFilterDescriptor.cs" />
241243
<Compile Include="Domain\DSL\NoMatchShortcut.cs" />
242244
<Compile Include="DSL\SyncedFlushDescriptor.cs" />
@@ -251,6 +253,7 @@
251253
<Compile Include="DSL\Filter\GeoHashCellFilterDescriptor.cs" />
252254
<Compile Include="DSL\DeleteScriptDescriptor.cs" />
253255
<Compile Include="ElasticClient-GetIndex.cs" />
256+
<Compile Include="ElasticClient-FieldStats.cs" />
254257
<Compile Include="Enums\GeoOrientation.cs" />
255258
<Compile Include="Enums\GeoPrecisionUnit.cs" />
256259
<Compile Include="Enums\GetIndexFeature.cs" />
+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using NUnit.Framework;
7+
using FluentAssertions;
8+
9+
namespace Nest.Tests.Integration.Core
10+
{
11+
[TestFixture]
12+
public class FieldStatsTests : IntegrationTests
13+
{
14+
private void Assert(FieldStatsField fields)
15+
{
16+
fields.DocCount.Should().BeGreaterThan(0);
17+
fields.MaxDoc.Should().BeGreaterThan(0);
18+
fields.Density.Should().BeGreaterThan(0);
19+
fields.SumDocumentFrequency.Should().BeGreaterThan(0);
20+
fields.MinValue.Should().NotBeNullOrEmpty();
21+
fields.MaxValue.Should().NotBeNullOrEmpty();
22+
}
23+
24+
[Test]
25+
[SkipVersion("0 - 1.5.9", "Field stats added in ES 1.6")]
26+
public void FieldStatsClusterLevel()
27+
{
28+
var r = this.Client.FieldStats(fs => fs.Fields("name", "country"));
29+
r.IsValid.Should().BeTrue();
30+
r.Shards.Should().NotBeNull();
31+
r.Shards.Successful.Should().BeGreaterThan(0);
32+
r.Indices.Should().NotBeEmpty();
33+
r.Indices.Should().ContainKey("_all");
34+
var all = r.Indices["_all"];
35+
all.Fields.Should().NotBeNull();
36+
all.Fields.Should().ContainKey("name");
37+
var nameFieldStats = all.Fields["name"];
38+
Assert(nameFieldStats);
39+
all.Fields.Should().ContainKey("country");
40+
var countryFieldStats = all.Fields["country"];
41+
Assert(countryFieldStats);
42+
}
43+
44+
[Test]
45+
[SkipVersion("0 - 1.5.9", "Field stats added in ES 1.6")]
46+
public void FieldStatsIndicesLevel()
47+
{
48+
var r = this.Client.FieldStats(fs => fs
49+
.Index(ElasticsearchConfiguration.DefaultIndex)
50+
.Fields("name")
51+
.Level(Elasticsearch.Net.Level.Indices)
52+
);
53+
r.IsValid.Should().BeTrue();
54+
r.Shards.Should().NotBeNull();
55+
r.Shards.Successful.Should().BeGreaterThan(0);
56+
r.Indices.Should().NotBeEmpty();
57+
r.Indices.Should().ContainKey(ElasticsearchConfiguration.DefaultIndex);
58+
var defaultIndex = r.Indices[ElasticsearchConfiguration.DefaultIndex];
59+
defaultIndex.Fields.Should().NotBeNull();
60+
defaultIndex.Fields.Should().ContainKey("name");
61+
Assert(defaultIndex.Fields["name"]);
62+
}
63+
}
64+
}

Diff for: src/Tests/Nest.Tests.Integration/Nest.Tests.Integration.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
<Compile Include="Core\Exists\SearchExistsTests.cs" />
101101
<Compile Include="Core\Explain\ExplainTests.cs" />
102102
<Compile Include="Core\Exists\AliasExists.cs" />
103+
<Compile Include="Core\FieldStatsTests.cs" />
103104
<Compile Include="Core\GetFieldMapping\GetFieldMappingTests.cs" />
104105
<Compile Include="Core\MultiPercolate\MultiPercolateTests.cs" />
105106
<Compile Include="Core\Percolate\PercolateTests.cs" />

0 commit comments

Comments
 (0)