From 66700303187772ccceb9d7c1c4241cf39aba6945 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Fri, 3 Jul 2026 17:45:02 +0200 Subject: [PATCH 1/5] Pollux #12458 Added to translators TopMetrics and Significant Terms; Updated elasticsearch==8.17.1 in requirements.txt --- pybana/translators/elastic/buckets.py | 13 +++++++--- pybana/translators/elastic/metrics.py | 35 +++++++++++++++++++-------- requirements.txt | 4 +-- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/pybana/translators/elastic/buckets.py b/pybana/translators/elastic/buckets.py index 2fbd755..9d3f4b3 100644 --- a/pybana/translators/elastic/buckets.py +++ b/pybana/translators/elastic/buckets.py @@ -160,9 +160,7 @@ def translate(self, agg, state, context, field): } -class TermsBucket(BaseBucket): - aggtype = "terms" - +class BaseTermsBucket(BaseBucket): def translate(self, agg, state, context, field): orderby = agg["params"]["orderBy"] aggs = {agg["id"]: agg for agg in state["aggs"]} @@ -178,6 +176,14 @@ def translate(self, agg, state, context, field): } +class TermsBucket(BaseBucket): + aggtype = "terms" + + +class SignificantTermsBucket(BaseBucket): + aggtype = "significant_terms" + + TRANSLATORS = { translator.aggtype: translator for translator in ( @@ -187,6 +193,7 @@ def translate(self, agg, state, context, field): HistogramBucket, RangeBucket, TermsBucket, + SignificantTermsBucket, ) } diff --git a/pybana/translators/elastic/metrics.py b/pybana/translators/elastic/metrics.py index 205d74f..511ec2d 100644 --- a/pybana/translators/elastic/metrics.py +++ b/pybana/translators/elastic/metrics.py @@ -116,7 +116,19 @@ def translate(self, proxy, agg, state, field): pass -class TopHitsMetric(BaseMetric): +class BaseTopMetric(BaseMetric): + def translate(self, proxy, agg, state, field): + params = agg["params"] + proxy.metric( + agg["id"], + self.aggtype, + sort={params["sortField"]: {"order": params["sortOrder"]}}, + size=params["size"], + _source=agg["params"]["field"], + ) + + +class TopHitsMetric(BaseTopMetric): """ Translator for top_hits metric. @@ -127,15 +139,17 @@ class TopHitsMetric(BaseMetric): aggtype = "top_hits" - def translate(self, proxy, agg, state, field): - params = agg["params"] - proxy.metric( - agg["id"], - "top_hits", - sort={params["sortField"]: {"order": params["sortOrder"]}}, - size=params["size"], - _source=agg["params"]["field"], - ) + +class TopMetricsMetric(BaseTopMetric): + """ + Translator for top_metrics metric. + + Careful, this metric is partially supported: + - date fields are not handled. + - scripted fields are not handled. + """ + + aggtype = "top_metrics" TRANSLATORS = { @@ -153,6 +167,7 @@ def translate(self, proxy, agg, state, field): StdDevMetric, SumMetric, TopHitsMetric, + TopMetricsMetric, ) } diff --git a/requirements.txt b/requirements.txt index 76d9db0..9e430fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -elasticsearch==6.4.0 -elasticsearch-dsl==6.4.0 +elasticsearch==8.17.1 +elasticsearch-dsl==8.17.1 hjson==3.0.1 pendulum==2.1.2 pytz>=2019.1 From c54a2badd346d2d789285b30e9c61b0032963ebb Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Wed, 8 Jul 2026 11:03:05 +0200 Subject: [PATCH 2/5] Rolled back elasticsearch==6.4.0 --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9e430fe..76d9db0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -elasticsearch==8.17.1 -elasticsearch-dsl==8.17.1 +elasticsearch==6.4.0 +elasticsearch-dsl==6.4.0 hjson==3.0.1 pendulum==2.1.2 pytz>=2019.1 From a872e3c7c78b22fdcaa83a4637e7460273989809 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Wed, 8 Jul 2026 12:54:17 +0200 Subject: [PATCH 3/5] Pollux #12459 Fixed SignificantTerms-TopMetrics translators --- pybana/translators/elastic/__init__.py | 13 ++++++++++ pybana/translators/elastic/buckets.py | 6 +++++ pybana/translators/elastic/metrics.py | 36 ++++++++++++++++---------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/pybana/translators/elastic/__init__.py b/pybana/translators/elastic/__init__.py index af76bf5..468bcf1 100644 --- a/pybana/translators/elastic/__init__.py +++ b/pybana/translators/elastic/__init__.py @@ -10,9 +10,22 @@ from .filter import FilterTranslator from .utils import SearchListProxy + __all__ = ("ElasticTranslator", "FilterTranslator") +class SignificantTerms(elasticsearch_dsl.query.Terms): + name = "significant_terms" + + +class TopMetrics(elasticsearch_dsl.aggs.TopHits): + name = "top_metrics" + + +elasticsearch_dsl.query.Query._classes[SignificantTerms.name] = SignificantTerms +elasticsearch_dsl.aggs.Agg._classes[TopMetrics.name] = TopMetrics + + class ElasticTranslator: def __init__(self, using): self._using = using diff --git a/pybana/translators/elastic/buckets.py b/pybana/translators/elastic/buckets.py index 9d3f4b3..6128781 100644 --- a/pybana/translators/elastic/buckets.py +++ b/pybana/translators/elastic/buckets.py @@ -183,6 +183,12 @@ class TermsBucket(BaseBucket): class SignificantTermsBucket(BaseBucket): aggtype = "significant_terms" + def translate(self, agg, state, context, field): + ret = agg["params"] + if field and field.get("scripted"): + ret["valueType"] = field["type"] + return ret + TRANSLATORS = { translator.aggtype: translator diff --git a/pybana/translators/elastic/metrics.py b/pybana/translators/elastic/metrics.py index 511ec2d..e305518 100644 --- a/pybana/translators/elastic/metrics.py +++ b/pybana/translators/elastic/metrics.py @@ -116,19 +116,7 @@ def translate(self, proxy, agg, state, field): pass -class BaseTopMetric(BaseMetric): - def translate(self, proxy, agg, state, field): - params = agg["params"] - proxy.metric( - agg["id"], - self.aggtype, - sort={params["sortField"]: {"order": params["sortOrder"]}}, - size=params["size"], - _source=agg["params"]["field"], - ) - - -class TopHitsMetric(BaseTopMetric): +class TopHitsMetric(BaseMetric): """ Translator for top_hits metric. @@ -139,8 +127,18 @@ class TopHitsMetric(BaseTopMetric): aggtype = "top_hits" + def translate(self, proxy, agg, state, field): + params = agg["params"] + proxy.metric( + agg["id"], + self.aggtype, + sort={params["sortField"]: {"order": params["sortOrder"]}}, + size=params["size"], + _source=agg["params"]["field"], + ) + -class TopMetricsMetric(BaseTopMetric): +class TopMetricsMetric(BaseMetric): """ Translator for top_metrics metric. @@ -151,6 +149,16 @@ class TopMetricsMetric(BaseTopMetric): aggtype = "top_metrics" + def translate(self, proxy, agg, state, field): + params = agg["params"] + proxy.metric( + agg["id"], + self.aggtype, + sort={params["sortField"]: {"order": params["sortOrder"]}}, + size=params["size"], + metrics={"field": agg["params"]["field"]}, + ) + TRANSLATORS = { translator.aggtype: translator From 0b200792886100265c35d3b1c0e9bdce9ae38754 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Wed, 8 Jul 2026 16:29:29 +0200 Subject: [PATCH 4/5] Pollux #12459 Added TopMetricsMetric to VegaTranslator --- pybana/translators/vega/metrics.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pybana/translators/vega/metrics.py b/pybana/translators/vega/metrics.py index 0b93cc8..c259842 100644 --- a/pybana/translators/vega/metrics.py +++ b/pybana/translators/vega/metrics.py @@ -109,6 +109,23 @@ def flatten(value): return ", ".join(map(str, values)) +class TopMetricsMetric(BaseMetric): + """ + Metric for top_metrics. + """ + + aggtype = "top_metrics" + + def contribute(self, agg, bucket, response): + hit = bucket[agg["id"]]["top"][0] + value = ( + hit["metrics"][agg["params"]["field"]] + if agg["params"]["field"] in hit["metrics"] + else None + ) + return value + + VEGA_METRICS = { metric.aggtype: metric for metric in [ @@ -122,5 +139,6 @@ def flatten(value): StdDevMetric, SumMetric, TopHitsMetric, + TopMetricsMetric, ] } From 204161b2c96bc5349c9a4c36141251001164a4c2 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Thu, 9 Jul 2026 12:14:51 +0200 Subject: [PATCH 5/5] Pollux #12459 Added mappings to fit elastic 8 --- pybana/mappings.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pybana/mappings.json b/pybana/mappings.json index 8156891..2f625ce 100644 --- a/pybana/mappings.json +++ b/pybana/mappings.json @@ -78,6 +78,18 @@ } } }, + "coreMigrationVersion": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "created_at": { + "type": "date" + }, "dashboard": { "properties": { "description": { @@ -240,6 +252,9 @@ } } }, + "managed": { + "type": "boolean" + }, "map": { "properties": { "bounds": { @@ -456,6 +471,15 @@ "type": { "type": "keyword" }, + "typeMigrationVersion": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, "updated_at": { "type": "date" },