Skip to content

Commit f347b85

Browse files
committed
WIP - Upgrade to the new Elasticsearch client
1 parent a4b976f commit f347b85

23 files changed

+283
-282
lines changed

src/Foundatio.Parsers.ElasticQueries/ElasticMappingResolver.cs

Lines changed: 93 additions & 65 deletions
Large diffs are not rendered by default.

src/Foundatio.Parsers.ElasticQueries/ElasticQueryParser.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Threading.Tasks;
5+
using Elastic.Clients.Elasticsearch;
6+
using Elastic.Clients.Elasticsearch.Aggregations;
7+
using Elastic.Clients.Elasticsearch.QueryDsl;
58
using Foundatio.Parsers.ElasticQueries.Extensions;
69
using Foundatio.Parsers.ElasticQueries.Visitors;
710
using Foundatio.Parsers.LuceneQueries;
811
using Foundatio.Parsers.LuceneQueries.Extensions;
912
using Foundatio.Parsers.LuceneQueries.Nodes;
1013
using Foundatio.Parsers.LuceneQueries.Visitors;
11-
using Nest;
1214
using Pegasus.Common;
1315

1416
namespace Foundatio.Parsers.ElasticQueries;
@@ -158,7 +160,7 @@ public async Task<QueryValidationResult> ValidateQueryAsync(string query, QueryV
158160
return context.GetValidationResult();
159161
}
160162

161-
public async Task<QueryContainer> BuildQueryAsync(string query, IElasticQueryVisitorContext context = null)
163+
public async Task<Query> BuildQueryAsync(string query, IElasticQueryVisitorContext context = null)
162164
{
163165
context ??= new ElasticQueryVisitorContext();
164166
context.QueryType = QueryTypes.Query;
@@ -169,7 +171,7 @@ public async Task<QueryContainer> BuildQueryAsync(string query, IElasticQueryVis
169171
return await BuildQueryAsync(result, context).ConfigureAwait(false);
170172
}
171173

172-
public async Task<QueryContainer> BuildQueryAsync(IQueryNode query, IElasticQueryVisitorContext context = null)
174+
public async Task<Query> BuildQueryAsync(IQueryNode query, IElasticQueryVisitorContext context = null)
173175
{
174176
context ??= new ElasticQueryVisitorContext();
175177
var q = await query.GetQueryAsync() ?? new MatchAllQuery();
@@ -195,7 +197,7 @@ public async Task<QueryValidationResult> ValidateAggregationsAsync(string query,
195197
return context.GetValidationResult();
196198
}
197199

198-
public async Task<AggregationContainer> BuildAggregationsAsync(string aggregations, IElasticQueryVisitorContext context = null)
200+
public async Task<Aggregation> BuildAggregationsAsync(string aggregations, IElasticQueryVisitorContext context = null)
199201
{
200202
context ??= new ElasticQueryVisitorContext();
201203
context.QueryType = QueryTypes.Aggregation;
@@ -207,7 +209,7 @@ public async Task<AggregationContainer> BuildAggregationsAsync(string aggregatio
207209
}
208210

209211
#pragma warning disable IDE0060 // Remove unused parameter
210-
public async Task<AggregationContainer> BuildAggregationsAsync(IQueryNode aggregations, IElasticQueryVisitorContext context = null)
212+
public async Task<Aggregation> BuildAggregationsAsync(IQueryNode aggregations, IElasticQueryVisitorContext context = null)
211213
{
212214
if (aggregations == null)
213215
return null;
@@ -227,7 +229,7 @@ public async Task<QueryValidationResult> ValidateSortAsync(string query, QueryVa
227229
return context.GetValidationResult();
228230
}
229231

230-
public async Task<IEnumerable<IFieldSort>> BuildSortAsync(string sort, IElasticQueryVisitorContext context = null)
232+
public async Task<IEnumerable<SortOptions>> BuildSortAsync(string sort, IElasticQueryVisitorContext context = null)
231233
{
232234
context ??= new ElasticQueryVisitorContext();
233235
context.QueryType = QueryTypes.Sort;
@@ -238,7 +240,7 @@ public async Task<IEnumerable<IFieldSort>> BuildSortAsync(string sort, IElasticQ
238240
return await BuildSortAsync(result, context).ConfigureAwait(false);
239241
}
240242

241-
public Task<IEnumerable<IFieldSort>> BuildSortAsync(IQueryNode sort, IElasticQueryVisitorContext context = null)
243+
public Task<IEnumerable<SortOptions>> BuildSortAsync(IQueryNode sort, IElasticQueryVisitorContext context = null)
242244
{
243245
context ??= new ElasticQueryVisitorContext();
244246
return GetSortFieldsVisitor.RunAsync(sort, context);

src/Foundatio.Parsers.ElasticQueries/ElasticQueryParserConfiguration.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Threading.Tasks;
4+
using Elastic.Clients.Elasticsearch;
5+
using Elastic.Clients.Elasticsearch.Mapping;
46
using Foundatio.Parsers.ElasticQueries.Visitors;
57
using Foundatio.Parsers.LuceneQueries;
68
using Foundatio.Parsers.LuceneQueries.Visitors;
79
using Microsoft.Extensions.Logging;
810
using Microsoft.Extensions.Logging.Abstractions;
9-
using Nest;
1011

1112
namespace Foundatio.Parsers.ElasticQueries;
1213

@@ -285,35 +286,35 @@ public ElasticQueryParserConfiguration AddAggregationVisitorAfter<T>(IChainableQ
285286

286287
#endregion
287288

288-
public ElasticQueryParserConfiguration UseMappings<T>(Func<TypeMappingDescriptor<T>, TypeMappingDescriptor<T>> mappingBuilder, IElasticClient client, string index) where T : class
289+
public ElasticQueryParserConfiguration UseMappings<T>(Func<TypeMappingDescriptor<T>, TypeMappingDescriptor<T>> mappingBuilder, ElasticsearchClient client, string index) where T : class
289290
{
290291
MappingResolver = ElasticMappingResolver.Create<T>(mappingBuilder, client, index, logger: _logger);
291292

292293
return this;
293294
}
294295

295-
public ElasticQueryParserConfiguration UseMappings<T>(Func<TypeMappingDescriptor<T>, TypeMappingDescriptor<T>> mappingBuilder, Inferrer inferrer, Func<ITypeMapping> getMapping) where T : class
296+
public ElasticQueryParserConfiguration UseMappings<T>(Func<TypeMappingDescriptor<T>, TypeMappingDescriptor<T>> mappingBuilder, Inferrer inferrer, Func<TypeMapping> getMapping) where T : class
296297
{
297298
MappingResolver = ElasticMappingResolver.Create<T>(mappingBuilder, inferrer, getMapping, logger: _logger);
298299

299300
return this;
300301
}
301302

302-
public ElasticQueryParserConfiguration UseMappings<T>(IElasticClient client)
303+
public ElasticQueryParserConfiguration UseMappings<T>(ElasticsearchClient client)
303304
{
304305
MappingResolver = ElasticMappingResolver.Create<T>(client, logger: _logger);
305306

306307
return this;
307308
}
308309

309-
public ElasticQueryParserConfiguration UseMappings(IElasticClient client, string index)
310+
public ElasticQueryParserConfiguration UseMappings(ElasticsearchClient client, string index)
310311
{
311312
MappingResolver = ElasticMappingResolver.Create(client, index, logger: _logger);
312313

313314
return this;
314315
}
315316

316-
public ElasticQueryParserConfiguration UseMappings(Func<ITypeMapping> getMapping, Inferrer inferrer = null)
317+
public ElasticQueryParserConfiguration UseMappings(Func<TypeMapping> getMapping, Inferrer inferrer = null)
317318
{
318319
MappingResolver = ElasticMappingResolver.Create(getMapping, inferrer, logger: _logger);
319320

src/Foundatio.Parsers.ElasticQueries/Extensions/DefaultAggregationNodeExtensions.cs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Threading.Tasks;
4+
using Elastic.Clients.Elasticsearch;
5+
using Elastic.Clients.Elasticsearch.Aggregations;
46
using Exceptionless.DateTimeExtensions;
57
using Foundatio.Parsers.ElasticQueries.Visitors;
68
using Foundatio.Parsers.LuceneQueries.Extensions;
79
using Foundatio.Parsers.LuceneQueries.Nodes;
810
using Foundatio.Parsers.LuceneQueries.Visitors;
9-
using Nest;
1011

1112
namespace Foundatio.Parsers.ElasticQueries.Extensions;
1213

@@ -15,7 +16,7 @@ public static class DefaultAggregationNodeExtensions
1516
// NOTE: We may want to read this dynamically from server settings.
1617
public const int MAX_BUCKET_SIZE = 10000;
1718

18-
public static Task<AggregationBase> GetDefaultAggregationAsync(this IQueryNode node, IQueryVisitorContext context)
19+
public static Task<Aggregation> GetDefaultAggregationAsync(this IQueryNode node, IQueryVisitorContext context)
1920
{
2021
if (node is GroupNode groupNode)
2122
return groupNode.GetDefaultAggregationAsync(context);
@@ -26,7 +27,7 @@ public static Task<AggregationBase> GetDefaultAggregationAsync(this IQueryNode n
2627
return null;
2728
}
2829

29-
public static async Task<AggregationBase> GetDefaultAggregationAsync(this GroupNode node, IQueryVisitorContext context)
30+
public static async Task<Aggregation> GetDefaultAggregationAsync(this GroupNode node, IQueryVisitorContext context)
3031
{
3132
if (context is not IElasticQueryVisitorContext elasticContext)
3233
throw new ArgumentException("Context must be of type IElasticQueryVisitorContext", nameof(context));
@@ -47,11 +48,11 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this GroupN
4748
return GetHistogramAggregation("histogram_" + originalField, field, node.UnescapedProximity, node.UnescapedBoost, context);
4849

4950
case AggregationType.GeoHashGrid:
50-
var precision = GeoHashPrecision.Precision1;
51+
var precision = new GeohashPrecision(1);
5152
if (!String.IsNullOrEmpty(node.UnescapedProximity))
5253
Enum.TryParse(node.UnescapedProximity, out precision);
5354

54-
return new GeoHashGridAggregation("geogrid_" + originalField)
55+
return new Aggregation("geogrid_" + originalField, new GeohashGridAggregation
5556
{
5657
Field = field,
5758
Precision = precision,
@@ -62,14 +63,14 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this GroupN
6263
{
6364
Script = new InlineScript($"doc['{node.Field}'].lon")
6465
}
65-
};
66+
});
6667

6768
case AggregationType.Terms:
6869
var agg = new TermsAggregation("terms_" + originalField)
6970
{
7071
Field = field,
7172
Size = node.GetProximityAsInt32(),
72-
MinimumDocumentCount = node.GetBoostAsInt32(),
73+
MinDocCount = node.GetBoostAsInt32(),
7374
Meta = new Dictionary<string, object> { { "@field_type", property?.Type } }
7475
};
7576

@@ -85,7 +86,7 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this GroupN
8586
return null;
8687
}
8788

88-
public static async Task<AggregationBase> GetDefaultAggregationAsync(this TermNode node, IQueryVisitorContext context)
89+
public static async Task<Aggregation> GetDefaultAggregationAsync(this TermNode node, IQueryVisitorContext context)
8990
{
9091
if (context is not IElasticQueryVisitorContext elasticContext)
9192
throw new ArgumentException("Context must be of type IElasticQueryVisitorContext", nameof(context));
@@ -134,11 +135,11 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this TermNo
134135
return GetPercentilesAggregation("percentiles_" + originalField, aggField, node.UnescapedProximity, node.UnescapedBoost, context);
135136

136137
case AggregationType.GeoHashGrid:
137-
var precision = GeoHashPrecision.Precision1;
138+
var precision = new GeohashPrecision(1);
138139
if (!String.IsNullOrEmpty(node.UnescapedProximity))
139140
Enum.TryParse(node.UnescapedProximity, out precision);
140141

141-
return new GeoHashGridAggregation("geogrid_" + originalField)
142+
return new GeohashGridAggregation("geogrid_" + originalField)
142143
{
143144
Field = aggField,
144145
Precision = precision,
@@ -156,7 +157,7 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this TermNo
156157
{
157158
Field = aggField,
158159
Size = node.GetProximityAsInt32(),
159-
MinimumDocumentCount = node.GetBoostAsInt32(),
160+
MinDocCount = node.GetBoostAsInt32(),
160161
Meta = new Dictionary<string, object> { { "@field_type", property?.Type } }
161162
};
162163

@@ -169,7 +170,7 @@ public static async Task<AggregationBase> GetDefaultAggregationAsync(this TermNo
169170
return null;
170171
}
171172

172-
private static AggregationBase GetPercentilesAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
173+
private static Aggregation GetPercentilesAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
173174
{
174175
List<double> percents = null;
175176
if (!String.IsNullOrWhiteSpace(proximity))
@@ -189,7 +190,7 @@ private static AggregationBase GetPercentilesAggregation(string originalField, s
189190
};
190191
}
191192

192-
private static AggregationBase GetHistogramAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
193+
private static Aggregation GetHistogramAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
193194
{
194195
double interval = 50;
195196
if (Double.TryParse(proximity, out double prox))
@@ -198,25 +199,25 @@ private static AggregationBase GetHistogramAggregation(string originalField, str
198199
return new HistogramAggregation(originalField)
199200
{
200201
Field = field,
201-
MinimumDocumentCount = 0,
202+
MinDocCount = 0,
202203
Interval = interval
203204
};
204205
}
205206

206-
private static AggregationBase GetDateHistogramAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
207+
private static Aggregation GetDateHistogramAggregation(string originalField, string field, string proximity, string boost, IQueryVisitorContext context)
207208
{
208209
// NOTE: StartDate and EndDate are set in the Repositories QueryBuilderContext.
209210
var start = context.GetDate("StartDate");
210211
var end = context.GetDate("EndDate");
211212
bool isValidRange = start.HasValue && start.Value > DateTime.MinValue && end.HasValue && end.Value < DateTime.MaxValue && start.Value <= end.Value;
212-
var bounds = isValidRange ? new ExtendedBounds<DateMath> { Minimum = start.Value, Maximum = end.Value } : null;
213+
var bounds = isValidRange ? new ExtendedBoundsDate { Min = start.Value, Max = end.Value } : null;
213214

214215
var interval = GetInterval(proximity, start, end);
215216
string timezone = TryConvertTimeUnitToUtcOffset(boost);
216217
var agg = new DateHistogramAggregation(originalField)
217218
{
218219
Field = field,
219-
MinimumDocumentCount = 0,
220+
MinDocCount = 0,
220221
Format = "date_optional_time",
221222
TimeZone = timezone,
222223
Meta = !String.IsNullOrEmpty(boost) ? new Dictionary<string, object> { { "@timezone", boost } } : null,
@@ -247,55 +248,55 @@ private static string TryConvertTimeUnitToUtcOffset(string boost)
247248
return "+" + timezoneOffset.Value.ToString("hh\\:mm");
248249
}
249250

250-
private static Union<DateInterval, Time> GetInterval(string proximity, DateTime? start, DateTime? end)
251+
private static Union<CalendarInterval, Duration> GetInterval(string proximity, DateTime? start, DateTime? end)
251252
{
252253
if (String.IsNullOrEmpty(proximity))
253254
return GetInterval(start, end);
254255

255256
return proximity.Trim() switch
256257
{
257-
"s" or "1s" or "second" => DateInterval.Second,
258-
"m" or "1m" or "minute" => DateInterval.Minute,
259-
"h" or "1h" or "hour" => DateInterval.Hour,
260-
"d" or "1d" or "day" => DateInterval.Day,
261-
"w" or "1w" or "week" => DateInterval.Week,
262-
"M" or "1M" or "month" => DateInterval.Month,
263-
"q" or "1q" or "quarter" => DateInterval.Quarter,
264-
"y" or "1y" or "year" => DateInterval.Year,
265-
_ => new Union<DateInterval, Time>(proximity),
258+
"s" or "1s" or "second" => CalendarInterval.Second,
259+
"m" or "1m" or "minute" => CalendarInterval.Minute,
260+
"h" or "1h" or "hour" => CalendarInterval.Hour,
261+
"d" or "1d" or "day" => CalendarInterval.Day,
262+
"w" or "1w" or "week" => CalendarInterval.Week,
263+
"M" or "1M" or "month" => CalendarInterval.Month,
264+
"q" or "1q" or "quarter" => CalendarInterval.Quarter,
265+
"y" or "1y" or "year" => CalendarInterval.Year,
266+
_ => new Union<CalendarInterval, Duration>(proximity),
266267
};
267268
}
268269

269-
private static Union<DateInterval, Time> GetInterval(DateTime? utcStart, DateTime? utcEnd, int desiredDataPoints = 100)
270+
private static Union<CalendarInterval, Duration> GetInterval(DateTime? utcStart, DateTime? utcEnd, int desiredDataPoints = 100)
270271
{
271272
if (!utcStart.HasValue || !utcEnd.HasValue || utcStart.Value == DateTime.MinValue)
272-
return DateInterval.Day;
273+
return CalendarInterval.Day;
273274

274275
var totalTime = utcEnd.Value - utcStart.Value;
275276
var timePerBlock = TimeSpan.FromMinutes(totalTime.TotalMinutes / desiredDataPoints);
276277
if (timePerBlock.TotalDays > 1)
277278
{
278279
timePerBlock = timePerBlock.Round(TimeSpan.FromDays(1));
279-
return (Time)timePerBlock;
280+
return (Duration)timePerBlock;
280281
}
281282

282283
if (timePerBlock.TotalHours > 1)
283284
{
284285
timePerBlock = timePerBlock.Round(TimeSpan.FromHours(1));
285-
return (Time)timePerBlock;
286+
return (Duration)timePerBlock;
286287
}
287288

288289
if (timePerBlock.TotalMinutes > 1)
289290
{
290291
timePerBlock = timePerBlock.Round(TimeSpan.FromMinutes(1));
291-
return (Time)timePerBlock;
292+
return (Duration)timePerBlock;
292293
}
293294

294295
timePerBlock = timePerBlock.Round(TimeSpan.FromSeconds(15));
295296
if (timePerBlock.TotalSeconds < 1)
296297
timePerBlock = TimeSpan.FromSeconds(15);
297298

298-
return (Time)timePerBlock;
299+
return (Duration)timePerBlock;
299300
}
300301

301302
public static int? GetProximityAsInt32(this IFieldQueryWithProximityAndBoostNode node)

0 commit comments

Comments
 (0)