Skip to content

Commit 5d13771

Browse files
authored
Add many missing queries and aggs
1 parent 73b8eda commit 5d13771

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

elasticsearch_dsl/aggs.py

+38
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,13 @@ class Range(Bucket):
247247
name = "range"
248248

249249

250+
class RareTerms(Bucket):
251+
name = "rare_terms"
252+
253+
def result(self, search, data):
254+
return FieldBucketData(self, search, data)
255+
256+
250257
class ReverseNested(Bucket):
251258
name = "reverse_nested"
252259

@@ -282,6 +289,13 @@ class Composite(Bucket):
282289
}
283290

284291

292+
class VariableWidthHistogram(Bucket):
293+
name = "variable_width_histogram"
294+
295+
def result(self, search, data):
296+
return FieldBucketData(self, search, data)
297+
298+
285299
# metric aggregations
286300
class TopHits(Agg):
287301
name = "top_hits"
@@ -318,6 +332,10 @@ class Max(Agg):
318332
name = "max"
319333

320334

335+
class MedianAbsoluteDeviation(Agg):
336+
name = "median_absolute_deviation"
337+
338+
321339
class Min(Agg):
322340
name = "min"
323341

@@ -342,6 +360,10 @@ class Sum(Agg):
342360
name = "sum"
343361

344362

363+
class TTest(Agg):
364+
name = "t_test"
365+
366+
345367
class ValueCount(Agg):
346368
name = "value_count"
347369

@@ -363,6 +385,10 @@ class CumulativeSum(Pipeline):
363385
name = "cumulative_sum"
364386

365387

388+
class CumulativeCardinality(Pipeline):
389+
name = "cumulative_cardinality"
390+
391+
366392
class Derivative(Pipeline):
367393
name = "derivative"
368394

@@ -371,6 +397,10 @@ class ExtendedStatsBucket(Pipeline):
371397
name = "extended_stats_bucket"
372398

373399

400+
class Inference(Pipeline):
401+
name = "inference"
402+
403+
374404
class MaxBucket(Pipeline):
375405
name = "max_bucket"
376406

@@ -387,6 +417,14 @@ class MovingAvg(Pipeline):
387417
name = "moving_avg"
388418

389419

420+
class MovingPercentiles(Pipeline):
421+
name = "moving_percentiles"
422+
423+
424+
class Normalize(Pipeline):
425+
name = "normalize"
426+
427+
390428
class PercentilesBucket(Pipeline):
391429
name = "percentiles_bucket"
392430

elasticsearch_dsl/query.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,16 @@ class FieldMaskingSpan(Query):
335335
_param_defs = {"query": {"type": "query"}}
336336

337337

338-
class SpanContainining(Query):
338+
class SpanContaining(Query):
339339
name = "span_containing"
340340
_param_defs = {"little": {"type": "query"}, "big": {"type": "query"}}
341341

342342

343+
# Original implementation contained
344+
# a typo: remove in v8.0.
345+
SpanContainining = SpanContaining
346+
347+
343348
class SpanWithin(Query):
344349
name = "span_within"
345350
_param_defs = {"little": {"type": "query"}, "big": {"type": "query"}}
@@ -398,6 +403,10 @@ class Ids(Query):
398403
name = "ids"
399404

400405

406+
class Intervals(Query):
407+
name = "intervals"
408+
409+
401410
class Limit(Query):
402411
name = "limit"
403412

@@ -450,6 +459,10 @@ class Regexp(Query):
450459
name = "regexp"
451460

452461

462+
class Shape(Query):
463+
name = "shape"
464+
465+
453466
class SimpleQueryString(Query):
454467
name = "simple_query_string"
455468

@@ -488,3 +501,7 @@ class Type(Query):
488501

489502
class ParentId(Query):
490503
name = "parent_id"
504+
505+
506+
class Wrapper(Query):
507+
name = "wrapper"

test_elasticsearch_dsl/test_aggs.py

+82
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,85 @@ def test_boxplot_aggregation():
272272
a = aggs.Boxplot(field="load_time")
273273

274274
assert {"boxplot": {"field": "load_time"}} == a.to_dict()
275+
276+
277+
def test_rare_terms_aggregation():
278+
a = aggs.RareTerms(field="the-field")
279+
a.bucket("total_sales", "sum", field="price")
280+
a.bucket(
281+
"sales_bucket_sort",
282+
"bucket_sort",
283+
sort=[{"total_sales": {"order": "desc"}}],
284+
size=3,
285+
)
286+
287+
assert {
288+
"aggs": {
289+
"sales_bucket_sort": {
290+
"bucket_sort": {"size": 3, "sort": [{"total_sales": {"order": "desc"}}]}
291+
},
292+
"total_sales": {"sum": {"field": "price"}},
293+
},
294+
"rare_terms": {"field": "the-field"},
295+
} == a.to_dict()
296+
297+
298+
def test_variable_width_histogram_aggregation():
299+
a = aggs.VariableWidthHistogram(field="price", buckets=2)
300+
assert {"variable_width_histogram": {"buckets": 2, "field": "price"}} == a.to_dict()
301+
302+
303+
def test_median_absolute_deviation_aggregation():
304+
a = aggs.MedianAbsoluteDeviation(field="rating")
305+
306+
assert {"median_absolute_deviation": {"field": "rating"}} == a.to_dict()
307+
308+
309+
def test_t_test_aggregation():
310+
a = aggs.TTest(
311+
a={"field": "startup_time_before"},
312+
b={"field": "startup_time_after"},
313+
type="paired",
314+
)
315+
316+
assert {
317+
"t_test": {
318+
"a": {"field": "startup_time_before"},
319+
"b": {"field": "startup_time_after"},
320+
"type": "paired",
321+
}
322+
} == a.to_dict()
323+
324+
325+
def test_inference_aggregation():
326+
a = aggs.Inference(model_id="model-id", buckets_path={"agg_name": "agg_name"})
327+
assert {
328+
"inference": {"buckets_path": {"agg_name": "agg_name"}, "model_id": "model-id"}
329+
} == a.to_dict()
330+
331+
332+
def test_moving_percentiles_aggregation():
333+
a = aggs.DateHistogram()
334+
a.bucket("the_percentile", "percentiles", field="price", percents=[1.0, 99.0])
335+
a.pipeline(
336+
"the_movperc", "moving_percentiles", buckets_path="the_percentile", window=10
337+
)
338+
339+
assert {
340+
"aggs": {
341+
"the_movperc": {
342+
"moving_percentiles": {"buckets_path": "the_percentile", "window": 10}
343+
},
344+
"the_percentile": {
345+
"percentiles": {"field": "price", "percents": [1.0, 99.0]}
346+
},
347+
},
348+
"date_histogram": {},
349+
} == a.to_dict()
350+
351+
352+
def test_normalize_aggregation():
353+
a = aggs.Normalize(buckets_path="normalized", method="percent_of_sum")
354+
assert {
355+
"normalize": {"buckets_path": "normalized", "method": "percent_of_sum"}
356+
} == a.to_dict()

0 commit comments

Comments
 (0)