diff --git a/docs/changelog/139607.yaml b/docs/changelog/139607.yaml new file mode 100644 index 0000000000000..77e1926710d91 --- /dev/null +++ b/docs/changelog/139607.yaml @@ -0,0 +1,5 @@ +pr: 139607 +summary: Add a dedicated field type for T-Digests +area: Mapping +type: enhancement +issues: [] diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/absent.md b/docs/reference/query-languages/esql/_snippets/functions/types/absent.md index ec7dc4ad3cb11..027b1528c30fe 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/absent.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/absent.md @@ -21,6 +21,7 @@ | ip | boolean | | keyword | boolean | | long | boolean | +| tdigest | boolean | | text | boolean | | unsigned_long | boolean | | version | boolean | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/absent_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/absent_over_time.md index bb9e9d2aea082..7a6f43e8c5afc 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/absent_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/absent_over_time.md @@ -21,6 +21,7 @@ | ip | | boolean | | keyword | | boolean | | long | | boolean | +| tdigest | | boolean | | text | | boolean | | unsigned_long | | boolean | | version | | boolean | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/avg.md b/docs/reference/query-languages/esql/_snippets/functions/types/avg.md index 283fbfde6db7b..c0cd33ff593fe 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/avg.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/avg.md @@ -9,4 +9,5 @@ | exponential_histogram | double | | integer | double | | long | double | +| tdigest | double | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/avg_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/avg_over_time.md index 4719c46b77493..b26fa2a7d01cf 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/avg_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/avg_over_time.md @@ -9,4 +9,5 @@ | exponential_histogram | time_duration {applies_to}`stack: preview 9.3.0` | double | | integer | time_duration {applies_to}`stack: preview 9.3.0` | double | | long | time_duration {applies_to}`stack: preview 9.3.0` | double | +| tdigest | time_duration {applies_to}`stack: preview 9.3.0` | double | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/max.md b/docs/reference/query-languages/esql/_snippets/functions/types/max.md index 2cce59675a295..e741e3a475af8 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/max.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/max.md @@ -14,6 +14,7 @@ | ip | ip | | keyword | keyword | | long | long | +| tdigest | double | | text | keyword | | unsigned_long {applies_to}`stack: ga 9.2.0` | unsigned_long | | version | version | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/max_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/max_over_time.md index 6968acaa8ebb5..8e179497aab2c 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/max_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/max_over_time.md @@ -14,6 +14,7 @@ | ip | time_duration {applies_to}`stack: preview 9.3.0` | ip | | keyword | time_duration {applies_to}`stack: preview 9.3.0` | keyword | | long | time_duration {applies_to}`stack: preview 9.3.0` | long | +| tdigest | time_duration {applies_to}`stack: preview 9.3.0` | double | | text | time_duration {applies_to}`stack: preview 9.3.0` | keyword | | unsigned_long {applies_to}`stack: ga 9.2.0` | time_duration {applies_to}`stack: preview 9.3.0` | unsigned_long | | version | time_duration {applies_to}`stack: preview 9.3.0` | version | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/min.md b/docs/reference/query-languages/esql/_snippets/functions/types/min.md index 2cce59675a295..e741e3a475af8 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/min.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/min.md @@ -14,6 +14,7 @@ | ip | ip | | keyword | keyword | | long | long | +| tdigest | double | | text | keyword | | unsigned_long {applies_to}`stack: ga 9.2.0` | unsigned_long | | version | version | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/min_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/min_over_time.md index 6968acaa8ebb5..8e179497aab2c 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/min_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/min_over_time.md @@ -14,6 +14,7 @@ | ip | time_duration {applies_to}`stack: preview 9.3.0` | ip | | keyword | time_duration {applies_to}`stack: preview 9.3.0` | keyword | | long | time_duration {applies_to}`stack: preview 9.3.0` | long | +| tdigest | time_duration {applies_to}`stack: preview 9.3.0` | double | | text | time_duration {applies_to}`stack: preview 9.3.0` | keyword | | unsigned_long {applies_to}`stack: ga 9.2.0` | time_duration {applies_to}`stack: preview 9.3.0` | unsigned_long | | version | time_duration {applies_to}`stack: preview 9.3.0` | version | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/percentile.md b/docs/reference/query-languages/esql/_snippets/functions/types/percentile.md index 453ab32fc91be..2a9f6bbc21064 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/percentile.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/percentile.md @@ -16,4 +16,7 @@ | long | double | double | | long | integer | double | | long | long | double | +| tdigest | double | double | +| tdigest | integer | double | +| tdigest | long | double | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/percentile_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/percentile_over_time.md index 453ab32fc91be..2a9f6bbc21064 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/percentile_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/percentile_over_time.md @@ -16,4 +16,7 @@ | long | double | double | | long | integer | double | | long | long | double | +| tdigest | double | double | +| tdigest | integer | double | +| tdigest | long | double | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/present.md b/docs/reference/query-languages/esql/_snippets/functions/types/present.md index ec7dc4ad3cb11..027b1528c30fe 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/present.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/present.md @@ -21,6 +21,7 @@ | ip | boolean | | keyword | boolean | | long | boolean | +| tdigest | boolean | | text | boolean | | unsigned_long | boolean | | version | boolean | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/present_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/present_over_time.md index bb9e9d2aea082..7a6f43e8c5afc 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/present_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/present_over_time.md @@ -21,6 +21,7 @@ | ip | | boolean | | keyword | | boolean | | long | | boolean | +| tdigest | | boolean | | text | | boolean | | unsigned_long | | boolean | | version | | boolean | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/sum.md b/docs/reference/query-languages/esql/_snippets/functions/types/sum.md index bf614874bd968..2c185059902b1 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/sum.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/sum.md @@ -9,4 +9,5 @@ | exponential_histogram | double | | integer | long | | long | long | +| tdigest | double | diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/sum_over_time.md b/docs/reference/query-languages/esql/_snippets/functions/types/sum_over_time.md index e40be10cbb9f9..57c69d7133c5e 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/types/sum_over_time.md +++ b/docs/reference/query-languages/esql/_snippets/functions/types/sum_over_time.md @@ -9,4 +9,5 @@ | exponential_histogram | time_duration {applies_to}`stack: preview 9.3.0` | double | | integer | time_duration {applies_to}`stack: preview 9.3.0` | long | | long | time_duration {applies_to}`stack: preview 9.3.0` | long | +| tdigest | time_duration {applies_to}`stack: preview 9.3.0` | double | diff --git a/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md b/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md index 47ed2dab98bc7..67fdc8dcc9d4a 100644 --- a/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md +++ b/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md @@ -25,6 +25,7 @@ | ip | boolean | | keyword | boolean | | long | boolean | +| tdigest | boolean | | text | boolean | | unsigned_long | boolean | | version | boolean | diff --git a/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md b/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md index 47ed2dab98bc7..67fdc8dcc9d4a 100644 --- a/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md +++ b/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md @@ -25,6 +25,7 @@ | ip | boolean | | keyword | boolean | | long | boolean | +| tdigest | boolean | | text | boolean | | unsigned_long | boolean | | version | boolean | diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/absent.json b/docs/reference/query-languages/esql/kibana/definition/functions/absent.json index 2e91c1ce8b3cc..7095c1877ce56 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/absent.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/absent.json @@ -208,6 +208,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to be checked for absence." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/absent_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/absent_over_time.json index e09691a555fd5..bc6dae822b00c 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/absent_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/absent_over_time.json @@ -208,6 +208,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/avg.json b/docs/reference/query-languages/esql/kibana/definition/functions/avg.json index b793a52247eb0..7c62feede6ef4 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/avg.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/avg.json @@ -63,6 +63,18 @@ ], "variadic" : false, "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to average." + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/avg_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/avg_over_time.json index a452f4830e7f7..e7952a9bc9efd 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/avg_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/avg_over_time.json @@ -93,6 +93,24 @@ ], "variadic" : false, "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to average." + }, + { + "name" : "window", + "type" : "time_duration", + "optional" : true, + "description" : "the time window over which to compute the average" + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/max.json b/docs/reference/query-languages/esql/kibana/definition/functions/max.json index 1bd951d444919..d3441949b8173 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/max.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/max.json @@ -124,6 +124,18 @@ "variadic" : false, "returnType" : "long" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/max_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/max_over_time.json index 9bb2f065a6386..ee7474eb61a81 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/max_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/max_over_time.json @@ -184,6 +184,24 @@ "variadic" : false, "returnType" : "long" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "window", + "type" : "time_duration", + "optional" : true, + "description" : "the time window over which to compute the maximum" + } + ], + "variadic" : false, + "returnType" : "double" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/min.json b/docs/reference/query-languages/esql/kibana/definition/functions/min.json index a9bcc61ae9c56..0dcddf79ec293 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/min.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/min.json @@ -124,6 +124,18 @@ "variadic" : false, "returnType" : "long" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/min_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/min_over_time.json index 7d46ff784126d..b7ed6bad8e339 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/min_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/min_over_time.json @@ -184,6 +184,24 @@ "variadic" : false, "returnType" : "long" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "window", + "type" : "time_duration", + "optional" : true, + "description" : "the time window over which to compute the minimum" + } + ], + "variadic" : false, + "returnType" : "double" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/percentile.json b/docs/reference/query-languages/esql/kibana/definition/functions/percentile.json index 19d0a8d9b381e..017fa09f26260 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/percentile.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/percentile.json @@ -219,6 +219,60 @@ ], "variadic" : false, "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "percentile", + "type" : "double", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "percentile", + "type" : "integer", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "percentile", + "type" : "long", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/percentile_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/percentile_over_time.json index f5c6908438369..f889d2fb92c69 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/percentile_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/percentile_over_time.json @@ -219,6 +219,60 @@ ], "variadic" : false, "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to calculate the percentile of." + }, + { + "name" : "percentile", + "type" : "double", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to calculate the percentile of." + }, + { + "name" : "percentile", + "type" : "integer", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to calculate the percentile of." + }, + { + "name" : "percentile", + "type" : "long", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/present.json b/docs/reference/query-languages/esql/kibana/definition/functions/present.json index e7543e33e0e2c..4accf437cf14e 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/present.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/present.json @@ -208,6 +208,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "Expression that outputs values to be checked for presence." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/present_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/present_over_time.json index 9d9e8b780a75e..86a1013bedf7c 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/present_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/present_over_time.json @@ -208,6 +208,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/sum.json b/docs/reference/query-languages/esql/kibana/definition/functions/sum.json index bc238e71ae320..33e042224f41b 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/sum.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/sum.json @@ -63,6 +63,18 @@ ], "variadic" : false, "returnType" : "long" + }, + { + "params" : [ + { + "name" : "number", + "type" : "tdigest", + "optional" : false, + "description" : "" + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/sum_over_time.json b/docs/reference/query-languages/esql/kibana/definition/functions/sum_over_time.json index 8d44833a04ed4..cee315c0162d1 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/sum_over_time.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/sum_over_time.json @@ -93,6 +93,24 @@ ], "variadic" : false, "returnType" : "long" + }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "" + }, + { + "name" : "window", + "type" : "time_duration", + "optional" : true, + "description" : "the time window over which to compute the sum over time" + } + ], + "variadic" : false, + "returnType" : "double" } ], "examples" : [ diff --git a/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json b/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json index 95a98c2c31b57..0e093fabcfa0d 100644 --- a/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json +++ b/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json @@ -258,6 +258,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "Value to check. It can be a single- or multi-valued column or an expression." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json b/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json index e24829ab79312..8a3e613a42ae8 100644 --- a/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json +++ b/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json @@ -258,6 +258,18 @@ "variadic" : false, "returnType" : "boolean" }, + { + "params" : [ + { + "name" : "field", + "type" : "tdigest", + "optional" : false, + "description" : "Value to check. It can be a single- or multi-valued column or an expression." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, { "params" : [ { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java b/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java index 490f7b71f8bc1..8b80c0b343138 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java @@ -68,6 +68,7 @@ public class MapperFeatures implements FeatureSpecification { static final NodeFeature STORE_HIGH_CARDINALITY_KEYWORDS_IN_BINARY_DOC_VALUES = new NodeFeature( "mapper.keyword.store_high_cardinality_in_binary_doc_values" ); + static final NodeFeature TDIGEST_TYPE = new NodeFeature("mapper.tdigest_type"); @Override public Set getTestFeatures() { @@ -117,7 +118,8 @@ public Set getTestFeatures() { STORED_FIELDS_SPEC_MERGE_BUG, GENERIC_VECTOR_FORMAT, EXPONENTIAL_HISTOGRAM_TYPE, - STORE_HIGH_CARDINALITY_KEYWORDS_IN_BINARY_DOC_VALUES + STORE_HIGH_CARDINALITY_KEYWORDS_IN_BINARY_DOC_VALUES, + TDIGEST_TYPE ); } } diff --git a/server/src/main/resources/transport/definitions/referable/esql_tdigest_tech_preview.csv b/server/src/main/resources/transport/definitions/referable/esql_tdigest_tech_preview.csv new file mode 100644 index 0000000000000..2d7f0a5feb639 --- /dev/null +++ b/server/src/main/resources/transport/definitions/referable/esql_tdigest_tech_preview.csv @@ -0,0 +1 @@ +9248000 diff --git a/server/src/main/resources/transport/upper_bounds/9.3.csv b/server/src/main/resources/transport/upper_bounds/9.3.csv index 794ab665f501f..fe195fd95c444 100644 --- a/server/src/main/resources/transport/upper_bounds/9.3.csv +++ b/server/src/main/resources/transport/upper_bounds/9.3.csv @@ -1 +1 @@ -add_not_preferred_allocation_decision,9247000 +esql_tdigest_tech_preview,9248000 diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java index b0ad390a36d36..ffc8a93e7eb9e 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/AnalyticsPlugin.java @@ -141,15 +141,12 @@ public List> getSettings() { @Override public Map getMappers() { - if (TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()) { - return Map.of( - HistogramFieldMapper.CONTENT_TYPE, - HistogramFieldMapper.PARSER, - TDigestFieldMapper.CONTENT_TYPE, - TDigestFieldMapper.PARSER - ); - } - return Map.of(HistogramFieldMapper.CONTENT_TYPE, HistogramFieldMapper.PARSER); + return Map.of( + HistogramFieldMapper.CONTENT_TYPE, + HistogramFieldMapper.PARSER, + TDigestFieldMapper.CONTENT_TYPE, + TDigestFieldMapper.PARSER + ); } @Override diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java index 32ad886132563..039b22f9a95c6 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapper.java @@ -22,7 +22,6 @@ import org.elasticsearch.common.io.stream.ByteArrayStreamInput; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.util.BigArrays; -import org.elasticsearch.common.util.FeatureFlag; import org.elasticsearch.common.xcontent.XContentParserUtils; import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.index.fielddata.FieldDataContext; @@ -74,7 +73,6 @@ * Field Mapper for pre-aggregated histograms. */ public class TDigestFieldMapper extends FieldMapper { - public static final FeatureFlag TDIGEST_FIELD_MAPPER = new FeatureFlag("tdigest_field_mapper"); public static final String CENTROIDS_NAME = "centroids"; public static final String COUNTS_NAME = "counts"; diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldBlockLoaderTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldBlockLoaderTests.java index e005cecf5c500..14ba7c5a78535 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldBlockLoaderTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldBlockLoaderTests.java @@ -17,7 +17,6 @@ import org.elasticsearch.search.aggregations.metrics.TDigestState; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.analytics.AnalyticsPlugin; -import org.junit.Before; import java.io.IOException; import java.util.Collection; @@ -37,11 +36,6 @@ protected Collection getPlugins() { return List.of(new AnalyticsPlugin()); } - @Before - public void setup() { - assumeTrue("Only when tdigest_field_mapper feature flag is enabled", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); - } - private static DataSourceHandler DATA_SOURCE_HANDLER = new DataSourceHandler() { @Override diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapperTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapperTests.java index f5e31cc61558a..c72a6e4a84bfa 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapperTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/TDigestFieldMapperTests.java @@ -38,7 +38,6 @@ public class TDigestFieldMapperTests extends MapperTestCase { @Override protected Object getSampleValueForDocument() { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); return generateRandomFieldValues(100); } @@ -54,13 +53,11 @@ protected Collection getPlugins() { @Override protected void minimalMapping(XContentBuilder b) throws IOException { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); b.field("type", "tdigest"); } @Override protected void registerParameters(ParameterChecker checker) throws IOException { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); checker.registerUpdateCheck(b -> b.field("ignore_malformed", true), m -> assertTrue(m.ignoreMalformed())); checker.registerConflictCheck("digest_type", b -> b.field("digest_type", TDigestState.Type.AVL_TREE)); checker.registerConflictCheck("compression", b -> b.field("compression", 117)); @@ -77,7 +74,6 @@ protected boolean supportsStoredFields() { } public void testParseValue() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); ParsedDocument doc = mapper.parse( source(b -> b.startObject("field").field("centroids", new double[] { 2, 3 }).field("counts", new int[] { 0, 4 }).endObject()) @@ -86,7 +82,6 @@ public void testParseValue() throws Exception { } public void testParseArrayValue() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); Exception e = expectThrows(DocumentParsingException.class, () -> mapper.parse(source(b -> { b.startArray("field"); @@ -103,7 +98,6 @@ public void testParseArrayValue() throws Exception { } public void testEmptyArrays() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); ParsedDocument doc = mapper.parse( source(b -> b.startObject("field").field("centroids", new double[] {}).field("counts", new int[] {}).endObject()) @@ -112,14 +106,12 @@ public void testEmptyArrays() throws Exception { } public void testNullValue() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); ParsedDocument doc = mapper.parse(source(b -> b.nullField("pre_aggregated"))); assertThat(doc.rootDoc().getField("pre_aggregated"), nullValue()); } public void testMissingFieldCounts() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); Exception e = expectThrows( DocumentParsingException.class, @@ -178,7 +170,6 @@ protected List exampleMalformedValues() { } public void testIgnoreMalformedSkipsKeyword() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(mapping(b -> { b.startObject("pre_aggregated").field("type", "tdigest").field("ignore_malformed", true).endObject(); b.startObject("otherField").field("type", "keyword").endObject(); @@ -189,7 +180,6 @@ public void testIgnoreMalformedSkipsKeyword() throws Exception { } public void testIgnoreMalformedSkipsArray() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(mapping(b -> { b.startObject("pre_aggregated").field("type", "tdigest").field("ignore_malformed", true).endObject(); b.startObject("otherField").field("type", "keyword").endObject(); @@ -200,7 +190,6 @@ public void testIgnoreMalformedSkipsArray() throws Exception { } public void testIgnoreMalformedSkipsField() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(mapping(b -> { b.startObject("pre_aggregated").field("type", "tdigest").field("ignore_malformed", true).endObject(); b.startObject("otherField").field("type", "keyword").endObject(); @@ -214,7 +203,6 @@ public void testIgnoreMalformedSkipsField() throws Exception { } public void testIgnoreMalformedSkipsObjects() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(mapping(b -> { b.startObject("pre_aggregated").field("type", "tdigest").field("ignore_malformed", true).endObject(); b.startObject("otherField").field("type", "keyword").endObject(); @@ -242,7 +230,6 @@ public void testIgnoreMalformedSkipsObjects() throws Exception { } public void testIgnoreMalformedSkipsEmpty() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(mapping(b -> { b.startObject("pre_aggregated").field("type", "tdigest").field("ignore_malformed", true).endObject(); b.startObject("otherField").field("type", "keyword").endObject(); @@ -253,7 +240,6 @@ public void testIgnoreMalformedSkipsEmpty() throws Exception { } public void testMissingFieldValues() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); Exception e = expectThrows( DocumentParsingException.class, @@ -263,7 +249,6 @@ public void testMissingFieldValues() throws Exception { } public void testUnknownField() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field") @@ -278,7 +263,6 @@ public void testUnknownField() throws Exception { } public void testFieldArraysDifferentSize() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field").field("counts", new int[] { 2, 2 }).field("centroids", new double[] { 2, 2, 3 }).endObject() @@ -288,7 +272,6 @@ public void testFieldArraysDifferentSize() throws Exception { } public void testFieldCountsNotArray() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field").field("counts", "bah").field("centroids", new double[] { 2, 2, 3 }).endObject() @@ -298,7 +281,6 @@ public void testFieldCountsNotArray() throws Exception { } public void testFieldCountsStringArray() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field") @@ -311,7 +293,6 @@ public void testFieldCountsStringArray() throws Exception { } public void testFieldValuesStringArray() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.field("field") @@ -325,7 +306,6 @@ public void testFieldValuesStringArray() throws Exception { } public void testFieldValuesNotArray() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field").field("counts", new int[] { 2, 2, 3 }).field("centroids", "bah").endObject() @@ -335,7 +315,6 @@ public void testFieldValuesNotArray() throws Exception { } public void testCountIsLong() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field") @@ -348,7 +327,6 @@ public void testCountIsLong() throws Exception { } public void testValuesNotInOrder() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.field("field") @@ -365,7 +343,6 @@ public void testValuesNotInOrder() throws Exception { } public void testFieldNotObject() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source(b -> b.field("field", "bah")); Exception e = expectThrows(DocumentParsingException.class, () -> mapper.parse(source)); @@ -373,7 +350,6 @@ public void testFieldNotObject() throws Exception { } public void testNegativeCount() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); SourceToParse source = source( b -> b.startObject("field").field("counts", new int[] { 2, 2, -3 }).field("centroids", new double[] { 2, 2, 3 }).endObject() @@ -389,7 +365,6 @@ protected Object generateRandomInputValue(MappedFieldType ft) { } public void testCannotBeUsedInMultifields() { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); Exception e = expectThrows(MapperParsingException.class, () -> createMapperService(fieldMapping(b -> { b.field("type", "keyword"); b.startObject("fields"); @@ -412,7 +387,6 @@ protected List getSortShortcutSupport() { } public void testArrayValueSyntheticSource() throws Exception { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); DocumentMapper mapper = createSytheticSourceMapperService( fieldMapping(b -> b.field("type", "tdigest").field("ignore_malformed", "true")) ).documentMapper(); @@ -488,13 +462,11 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) private record TDigestFieldSyntheticSourceSupport(boolean ignoreMalformed) implements SyntheticSourceSupport { @Override public SyntheticSourceExample example(int maxVals) { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); Map value = generateRandomFieldValues(maxVals); return new SyntheticSourceExample(value, value, this::mapping); } private void mapping(XContentBuilder b) throws IOException { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); b.field("type", "tdigest"); if (ignoreMalformed) { b.field("ignore_malformed", true); @@ -503,7 +475,6 @@ private void mapping(XContentBuilder b) throws IOException { @Override public List invalidExample() throws IOException { - assumeTrue("Requires t-digest field", TDigestFieldMapper.TDIGEST_FIELD_MAPPER.isEnabled()); return List.of(); } } diff --git a/x-pack/plugin/build.gradle b/x-pack/plugin/build.gradle index 0f4eb0067b4e7..03054dc6f5269 100644 --- a/x-pack/plugin/build.gradle +++ b/x-pack/plugin/build.gradle @@ -53,8 +53,6 @@ if (buildParams.snapshotBuild == false) { // * Data Stream Lifecycle. manage_data_stream_lifecycle privilege is only available with dlm_feature_flag_enabled set // We disable these tests for snapshot builds to maintain release build coverage. restTestBlacklist.add('privileges/11_builtin/Test get builtin privileges') - // TDigest field is only available with tdigest_field_mapper flag set, tests should be disabled in non-snapshot builds - restTestBlacklist.add('analytics/t_digest_fieldtype/*') } tasks.withType(StandaloneRestIntegTestTask).configureEach { diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java index 067b106a401cb..d8d6655fda017 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java @@ -7,13 +7,7 @@ package org.elasticsearch.xpack.esql.core.plugin; -import org.elasticsearch.common.util.FeatureFlag; import org.elasticsearch.plugins.ExtensiblePlugin; import org.elasticsearch.plugins.Plugin; -public class EsqlCorePlugin extends Plugin implements ExtensiblePlugin { - - // Note, there is also a feature flag for the field type in the analytics plugin, but for visibility reasons we need - // another one here. - public static final FeatureFlag T_DIGEST_ESQL_SUPPORT = new FeatureFlag("esql_t_digest_support"); -} +public class EsqlCorePlugin extends Plugin implements ExtensiblePlugin {} diff --git a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java index dc5ccb28251f0..5992f74c025ca 100644 --- a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java +++ b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java @@ -404,10 +404,10 @@ protected boolean supportsExponentialHistograms() { @Override protected boolean supportsTDigestField() { try { - return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_FIELD_TYPE_SUPPORT_V4.capabilityName())) + return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_TECH_PREVIEW.capabilityName())) && RestEsqlTestCase.hasCapabilities( remoteClusterClient(), - List.of(EsqlCapabilities.Cap.TDIGEST_FIELD_TYPE_SUPPORT_V4.capabilityName()) + List.of(EsqlCapabilities.Cap.TDIGEST_TECH_PREVIEW.capabilityName()) ); } catch (IOException e) { throw new RuntimeException(e); diff --git a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/EsqlSpecIT.java b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/EsqlSpecIT.java index ab6c1481799f0..c74cad9518026 100644 --- a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/EsqlSpecIT.java +++ b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/EsqlSpecIT.java @@ -64,7 +64,7 @@ protected boolean supportsExponentialHistograms() { @Override protected boolean supportsTDigestField() { - return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_FIELD_TYPE_SUPPORT_V4.capabilityName())); + return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_TECH_PREVIEW.capabilityName())); } @Before diff --git a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java index d6982b7c0653a..b0af0d9078447 100644 --- a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java +++ b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java @@ -317,7 +317,7 @@ protected boolean supportsExponentialHistograms() { } protected boolean supportsTDigestField() { - return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_FIELD_TYPE_SUPPORT_V4.capabilityName())); + return RestEsqlTestCase.hasCapabilities(client(), List.of(EsqlCapabilities.Cap.TDIGEST_TECH_PREVIEW.capabilityName())); } protected boolean supportsHistogramDataType() { diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/tdigest.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/tdigest.csv-spec index c691995e5a5ca..85bc0e0bf22f4 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/tdigest.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/tdigest.csv-spec @@ -1,5 +1,5 @@ load -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE STARTS_WITH(instance, "hand-rolled") @@ -13,7 +13,7 @@ FROM tdigest_standard_index allAggsUngrouped -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE NOT STARTS_WITH(instance, "hand-rolled") @@ -33,7 +33,7 @@ min:double | max:double | p90:double | sum:double | avg:double allAggsGrouped -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE NOT STARTS_WITH(instance, "hand-rolled") @@ -57,7 +57,7 @@ instance-2 | 2.2E-4 | 2.744054 | 0.1 | 27.706021 | 0.008197 ungroupedPercentiles -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE NOT STARTS_WITH(instance, "hand-rolled") @@ -73,7 +73,7 @@ p0:double | p50:double | p95:double | p100:double groupedPercentiles -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE NOT STARTS_WITH(instance, "hand-rolled") @@ -92,7 +92,7 @@ instance-2 | 2.2E-4 | 0.0 | 0.1 | 2.744054 percentileOnEmptyTDigest -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE instance == "hand-rolled-empty" @@ -107,7 +107,7 @@ NULL allAggsFiltered -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | STATS min = MIN(responseTime) WHERE instance == "instance-0", @@ -126,7 +126,7 @@ min:double | max:double | p95:double | sum:double | avg:double allAggsGroupedFiltered -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | WHERE NOT STARTS_WITH(instance, "hand-rolled") @@ -150,7 +150,7 @@ instance-2 | null | null | null | null | 0.008197 allAggsGroupedEmptyGroups -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview FROM tdigest_standard_index | STATS min = MIN(responseTime) WHERE instance == "idontexist" , @@ -168,7 +168,7 @@ NULL | NULL | NULL | NULL | NULL timeseriesAllAggsUngrouped -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview required_capability: ts_command_v0 TS tdigest_timeseries_index @@ -183,7 +183,7 @@ min:double | max:double | p90:double | sum:double | avg:double ; timeseriesAllAggsGrouped -required_capability: tdigest_field_type_support_v4 +required_capability: tdigest_tech_preview required_capability: ts_command_v0 TS tdigest_timeseries_index diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index 4a71a3e313dea..32eafc3d17820 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -19,8 +19,6 @@ import java.util.Locale; import java.util.Set; -import static org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT; - /** * A {@link Set} of "capabilities" supported by the {@link RestEsqlQueryAction} * and {@link RestEsqlAsyncQueryAction} APIs. These are exposed over the @@ -1601,7 +1599,10 @@ public enum Cap { */ EXPONENTIAL_HISTOGRAM_TECH_PREVIEW, - TDIGEST_FIELD_TYPE_SUPPORT_V4(T_DIGEST_ESQL_SUPPORT), + /** + * Support for the T-Digest elasticsearch field mapper and ES|QL type when they were released into tech preview. + */ + TDIGEST_TECH_PREVIEW, /** * Development capability for the histogram field integration diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index fe28007ea8fc8..386a73b29ea34 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -25,6 +25,7 @@ import static org.elasticsearch.xpack.esql.core.type.DataType.EXPONENTIAL_HISTOGRAM; import static org.elasticsearch.xpack.esql.core.type.DataType.IP; import static org.elasticsearch.xpack.esql.core.type.DataType.NULL; +import static org.elasticsearch.xpack.esql.core.type.DataType.TDIGEST; import static org.elasticsearch.xpack.esql.core.type.DataType.isRepresentable; import static org.elasticsearch.xpack.esql.core.type.DataType.isSpatialOrGrid; @@ -80,21 +81,25 @@ public static TypeResolution isDate(Expression e, String operationName, ParamOrd /** * @see DataType#isRepresentable(DataType) */ - public static TypeResolution isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( + public static TypeResolution isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram( Expression e, String operationName, ParamOrdinal paramOrd ) { return isType( e, - dt -> isRepresentable(dt) && dt != DENSE_VECTOR && dt != AGGREGATE_METRIC_DOUBLE && dt != EXPONENTIAL_HISTOGRAM, + dt -> isRepresentable(dt) + && dt != DENSE_VECTOR + && dt != AGGREGATE_METRIC_DOUBLE + && dt != EXPONENTIAL_HISTOGRAM + && dt != TDIGEST, operationName, paramOrd, - "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ); } - public static TypeResolution isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndExponentialHistogram( + public static TypeResolution isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndHistogram( Expression e, String operationName, ParamOrdinal paramOrd @@ -105,10 +110,11 @@ public static TypeResolution isRepresentableExceptCountersSpatialDenseVectorAggr && DataType.isRepresentable(t) && t != DENSE_VECTOR && t != AGGREGATE_METRIC_DOUBLE - && t != EXPONENTIAL_HISTOGRAM, + && t != EXPONENTIAL_HISTOGRAM + && t != TDIGEST, operationName, paramOrd, - "any type except counter, spatial types, dense_vector, aggregate_metric_double or exponential_histogram" + "any type except counter, spatial types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java index 832a83983d3d3..2bcd1a9cc44a9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java @@ -380,7 +380,7 @@ public enum DataType implements Writeable { builder().esType("tdigest") .estimatedSize(16 * 160)// guess 160 buckets (OTEL default for positive values only histograms) with 16 bytes per bucket .docValues() - .underConstruction(DataTypesTransportVersions.ESQL_SERIALIZEABLE_TDIGEST) + .supportedSince(DataTypesTransportVersions.ESQL_SERIALIZEABLE_TDIGEST, DataTypesTransportVersions.ESQL_TDIGEST_TECH_PREVIEW) ), @@ -1071,5 +1071,10 @@ public static class DataTypesTransportVersions { */ public static final TransportVersion ESQL_HISTOGRAM_DATATYPE = TransportVersion.fromName("esql_histogram_datatype"); + /** + * Transport version for when the feature flag for the ESQL TDigest type was removed. + */ + public static final TransportVersion ESQL_TDIGEST_TECH_PREVIEW = TransportVersion.fromName("esql_tdigest_tech_preview"); + } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Count.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Count.java index e047e78fea4ff..de7c04d4265ae 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Count.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Count.java @@ -146,10 +146,10 @@ public Nullability nullable() { protected TypeResolution resolveType() { return isType( field(), - dt -> dt.isCounter() == false && dt != DataType.DENSE_VECTOR && dt != DataType.EXPONENTIAL_HISTOGRAM, + dt -> dt.isCounter() == false && dt != DataType.DENSE_VECTOR && dt != DataType.EXPONENTIAL_HISTOGRAM && dt != DataType.TDIGEST, sourceText(), DEFAULT, - "any type except counter types, dense_vector or exponential_histogram" + "any type except counter types, dense_vector, tdigest or exponential_histogram" ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Sample.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Sample.java index d5e8c8c67eab9..395422979e3ea 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Sample.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Sample.java @@ -40,7 +40,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType; import static org.elasticsearch.xpack.esql.expression.Foldables.TypeResolutionValidator.forPostOptimizationValidation; import static org.elasticsearch.xpack.esql.expression.Foldables.TypeResolutionValidator.forPreOptimizationValidation; @@ -122,12 +122,9 @@ protected TypeResolution resolveType() { if (childrenResolved() == false) { return new TypeResolution("Unresolved children"); } - var typeResolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field(), - sourceText(), - FIRST - ).and(isNotNull(limitField(), sourceText(), SECOND)) - .and(isType(limitField(), dt -> dt == DataType.INTEGER, sourceText(), SECOND, "integer")); + var typeResolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), FIRST).and( + isNotNull(limitField(), sourceText(), SECOND) + ).and(isType(limitField(), dt -> dt == DataType.INTEGER, sourceText(), SECOND, "integer")); if (typeResolution.unresolved()) { return typeResolution; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Values.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Values.java index e43f477ff726b..2170a2b415339 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Values.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/aggregate/Values.java @@ -165,11 +165,7 @@ public DataType dataType() { @Override protected TypeResolution resolveType() { - return TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field(), - sourceText(), - DEFAULT - ); + return TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Case.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Case.java index f497882ec798d..a2f9c6aa6e6a5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Case.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Case.java @@ -48,6 +48,7 @@ import static org.elasticsearch.common.logging.LoggerMessageFormat.format; import static org.elasticsearch.xpack.esql.core.type.DataType.AGGREGATE_METRIC_DOUBLE; import static org.elasticsearch.xpack.esql.core.type.DataType.NULL; +import static org.elasticsearch.xpack.esql.core.type.DataType.TDIGEST; public final class Case extends EsqlScalarFunction { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Case", Case::new); @@ -211,15 +212,15 @@ private TypeResolution resolveValueType(Expression value, int position) { dataType = value.dataType().noText(); return TypeResolutions.isType( value, - t -> t != AGGREGATE_METRIC_DOUBLE, + t -> t != AGGREGATE_METRIC_DOUBLE && t != TDIGEST, sourceText(), TypeResolutions.ParamOrdinal.fromIndex(position), - originalWasNull ? NULL.typeName() : "any but aggregate_metric_double" + originalWasNull ? NULL.typeName() : "any but aggregate_metric_double or tdigest" ); } return TypeResolutions.isType( value, - t -> t.noText() == dataType && t != AGGREGATE_METRIC_DOUBLE, + t -> t.noText() == dataType && t != AGGREGATE_METRIC_DOUBLE && t != TDIGEST, sourceText(), TypeResolutions.ParamOrdinal.fromIndex(position), dataType.typeName() diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/internal/PackDimension.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/internal/PackDimension.java index 22e3d874a3569..dd8fb71ab8562 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/internal/PackDimension.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/internal/PackDimension.java @@ -41,11 +41,7 @@ public PackDimension(Source source, Expression field) { @Override protected TypeResolution resolveType() { - return TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field(), - sourceText(), - DEFAULT - ); + return TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppend.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppend.java index 18f736d0e27f6..b366ef45fe78c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppend.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppend.java @@ -40,7 +40,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType; /** @@ -148,18 +148,14 @@ protected TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field1, - sourceText(), - FIRST - ); + TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field1, sourceText(), FIRST); if (resolution.unresolved()) { return resolution; } dataType = field1.dataType().noText(); if (dataType == DataType.NULL) { dataType = field2.dataType().noText(); - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(field2, sourceText(), SECOND); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field2, sourceText(), SECOND); } return isType(field2, t -> t.noText() == dataType, sourceText(), SECOND, dataType.typeName()); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContains.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContains.java index 40b0d9183da6f..d90b277cc322f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContains.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContains.java @@ -41,7 +41,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType; /** @@ -146,16 +146,12 @@ protected TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - left(), - sourceText(), - FIRST - ); + TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(left(), sourceText(), FIRST); if (resolution.unresolved()) { return resolution; } if (left().dataType() == DataType.NULL) { - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(right(), sourceText(), SECOND); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(right(), sourceText(), SECOND); } return isType(right(), t -> t.noText() == left().dataType().noText(), sourceText(), SECOND, left().dataType().noText().typeName()); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCount.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCount.java index 573a19d9f368a..631ec64b28d44 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCount.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCount.java @@ -26,7 +26,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; /** * Reduce a multivalued field to a single valued field containing the count of values. @@ -79,7 +79,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupe.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupe.java index 8102a1aecef2d..7c0888ef24933 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupe.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupe.java @@ -23,7 +23,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; /** * Removes duplicate values from a multivalued field. @@ -95,7 +95,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirst.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirst.java index 6b2720efcea8b..773f4db219814 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirst.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirst.java @@ -31,7 +31,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; /** * Reduce a multivalued field to a single valued field containing the minimum value. @@ -110,7 +110,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvIntersection.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvIntersection.java index 156addbf3eea6..71a3aae256b93 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvIntersection.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvIntersection.java @@ -46,7 +46,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType; /** @@ -217,7 +217,7 @@ protected TypeResolution resolveType() { this.dataType = evaluatedField.dataType().noText(); - TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( + TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram( evaluatedField, sourceText(), FIRST diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLast.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLast.java index b85df4b2add4c..13b965b675954 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLast.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLast.java @@ -31,7 +31,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; /** * Reduce a multivalued field to a single valued field containing the minimum value. @@ -110,7 +110,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMax.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMax.java index da83deb4416db..85d5d9082d9ec 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMax.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMax.java @@ -30,7 +30,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndHistogram; /** * Reduce a multivalued field to a single valued field containing the maximum value. @@ -72,7 +72,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMin.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMin.java index 75ae89f751613..b5a43fbe8986b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMin.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMin.java @@ -30,7 +30,7 @@ import java.util.List; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndHistogram; /** * Reduce a multivalued field to a single valued field containing the minimum value. @@ -72,7 +72,7 @@ public String getWriteableName() { @Override protected TypeResolution resolveFieldType() { - return isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndExponentialHistogram(field(), sourceText(), DEFAULT); + return isRepresentableExceptCountersSpatialDenseVectorAggregateMetricDoubleAndHistogram(field(), sourceText(), DEFAULT); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSlice.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSlice.java index bb8ee018fee5e..bdca0960f1e55 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSlice.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSlice.java @@ -42,7 +42,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.THIRD; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER; import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.stringToInt; @@ -168,11 +168,7 @@ protected TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field, - sourceText(), - FIRST - ); + TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field, sourceText(), FIRST); if (resolution.unresolved()) { return resolution; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSort.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSort.java index 8f6d9cf150e02..dc45d6f3771a7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSort.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSort.java @@ -52,7 +52,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; import static org.elasticsearch.xpack.esql.expression.Validations.isFoldable; @@ -127,11 +127,7 @@ protected TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndExponentialHistogram( - field, - sourceText(), - FIRST - ); + TypeResolution resolution = isRepresentableExceptCountersDenseVectorAggregateMetricDoubleAndHistogram(field, sourceText(), FIRST); if (resolution.unresolved()) { return resolution; diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 30036bb1df55b..92414ea2b80bd 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1175,7 +1175,7 @@ public void testAggregateOnCounter() { error("FROM test | STATS count(network.bytes_out)", tsdb), equalTo( "1:19: argument of [count(network.bytes_out)] must be" - + " [any type except counter types, dense_vector or exponential_histogram]," + + " [any type except counter types, dense_vector, tdigest or exponential_histogram]," + " found value [network.bytes_out] type [counter_long]" ) ); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/MultiRowTestCaseSupplier.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/MultiRowTestCaseSupplier.java index 8384466d4c476..8c828cbd78345 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/MultiRowTestCaseSupplier.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/MultiRowTestCaseSupplier.java @@ -24,7 +24,6 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.WriteableExponentialHistogram; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.versionfield.Version; @@ -518,10 +517,8 @@ public static List exponentialHistogramCases(int minRows, int public static List tdigestCases(int minRows, int maxRows) { List cases = new ArrayList<>(); - if (EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()) { - addSuppliers(cases, minRows, maxRows, "empty T-Digest", DataType.TDIGEST, TDigestHolder::empty); - addSuppliers(cases, minRows, maxRows, "random T-Digest", DataType.TDIGEST, EsqlTestUtils::randomTDigest); - } + addSuppliers(cases, minRows, maxRows, "empty T-Digest", DataType.TDIGEST, TDigestHolder::empty); + addSuppliers(cases, minRows, maxRows, "random T-Digest", DataType.TDIGEST, EsqlTestUtils::randomTDigest); return cases; } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/AbsentTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/AbsentTests.java index 7886244729cca..df3058934c132 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/AbsentTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/AbsentTests.java @@ -11,7 +11,6 @@ import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.expression.function.AbstractAggregationTestCase; @@ -81,11 +80,9 @@ public static Iterable parameters() { DataType.TEXT, DataType.UNSIGNED_LONG, DataType.VERSION, - DataType.EXPONENTIAL_HISTOGRAM + DataType.EXPONENTIAL_HISTOGRAM, + DataType.TDIGEST ); - if (EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()) { - types = Stream.concat(types.stream(), Stream.of(DataType.TDIGEST)).toList(); - } for (var dataType : types) { suppliers.add( new TestCaseSupplier( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/CountErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/CountErrorTests.java index d943f3ec1eff9..c426ca7c7ad53 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/CountErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/CountErrorTests.java @@ -37,13 +37,16 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, tdigest or exponential_histogram" ) ); } @Override protected void assertCheckedSignatures(Set> invalidSignatureSamples) { - assertThat(invalidSignatureSamples, equalTo(Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM)))); + assertThat( + invalidSignatureSamples, + equalTo(Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.TDIGEST))) + ); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/PresentTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/PresentTests.java index 1d7bde2cade0f..f0285ea29b393 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/PresentTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/PresentTests.java @@ -11,7 +11,6 @@ import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.expression.function.AbstractAggregationTestCase; @@ -81,11 +80,9 @@ public static Iterable parameters() { DataType.TEXT, DataType.UNSIGNED_LONG, DataType.VERSION, - DataType.EXPONENTIAL_HISTOGRAM + DataType.EXPONENTIAL_HISTOGRAM, + DataType.TDIGEST ); - if (EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()) { - types = Stream.concat(types.stream(), Stream.of(DataType.TDIGEST)).toList(); - } for (var dataType : types) { suppliers.add( new TestCaseSupplier( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/SampleErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/SampleErrorTests.java index e419b58270bbc..5e8d8ce806822 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/SampleErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/SampleErrorTests.java @@ -42,7 +42,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP signature, (v, p) -> p == 1 ? "integer" - : "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + : "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/ValuesErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/ValuesErrorTests.java index 0f54c7e09bcb2..71b98896cfd9c 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/ValuesErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/aggregate/ValuesErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } @@ -47,7 +47,12 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl assertThat( invalidSignatureSamples, equalTo( - Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.AGGREGATE_METRIC_DOUBLE)) + Set.of( + List.of(DataType.DENSE_VECTOR), + List.of(DataType.EXPONENTIAL_HISTOGRAM), + List.of(DataType.AGGREGATE_METRIC_DOUBLE), + List.of(DataType.TDIGEST) + ) ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseErrorTests.java index f0756b9da10cf..17db1200eabed 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseErrorTests.java @@ -38,8 +38,8 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP return typeErrorMessage(signature, 0, "boolean"); } DataType mainType = signature.get(1).noText(); - if (mainType == DataType.AGGREGATE_METRIC_DOUBLE) { - return typeErrorMessage(signature, 1, "any but aggregate_metric_double"); + if (mainType == DataType.AGGREGATE_METRIC_DOUBLE || mainType == DataType.TDIGEST) { + return typeErrorMessage(signature, 1, "any but aggregate_metric_double or tdigest"); } for (int i = 2; i < signature.size(); i++) { if (i % 2 == 0 && i != signature.size() - 1) { @@ -52,8 +52,8 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP if (signature.get(i).noText() != mainType) { return typeErrorMessage(signature, i, mainType.typeName()); } - if (signature.get(i) == DataType.AGGREGATE_METRIC_DOUBLE) { - return typeErrorMessage(signature, i, "any but aggregate_metric_double"); + if (signature.get(i) == DataType.AGGREGATE_METRIC_DOUBLE || signature.get(i) == DataType.TDIGEST) { + return typeErrorMessage(signature, i, "any but aggregate_metric_double or tdigest"); } } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToStringErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToStringErrorTests.java index c71ae6d976f25..3e0c0de1e57ab 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToStringErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/convert/ToStringErrorTests.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.esql.expression.function.scalar.convert; import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.Literal; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.expression.function.ErrorsForCasesWithoutExamplesTestCase; @@ -32,13 +33,8 @@ protected Expression build(Source source, List args) { @Override protected Matcher expectedTypeErrorMatcher(List> validPerPosition, List signature) { - return equalTo(typeErrorMessage(false, validPerPosition, signature, (v, p) -> { - /* - * In general ToString should support all signatures. While building a - * new type you may we to temporarily remove this. - */ - throw new UnsupportedOperationException("all signatures should be supported"); - })); + String supportTypeNames = ToString.supportedTypesNames(new ToString(Source.EMPTY, Literal.NULL).supportedTypes()); + return equalTo(typeErrorMessage(false, validPerPosition, signature, (v, p) -> supportTypeNames)); } @Override @@ -47,6 +43,10 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl * In general ToString should support all signatures. While building a * new type you may we to temporarily relax this. */ - assertThat("all signatures should be supported", invalidSignatureSamples, equalTo(Set.of())); + assertThat( + "all signatures except for TDigest should be supported", + invalidSignatureSamples, + equalTo(Set.of(List.of(DataType.TDIGEST))) + ); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/ExtractHistogramComponentTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/ExtractHistogramComponentTests.java index 3c4a1c7b60204..a6f04a9c43dcd 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/ExtractHistogramComponentTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/ExtractHistogramComponentTests.java @@ -15,7 +15,6 @@ import org.elasticsearch.compute.data.TDigestHolder; import org.elasticsearch.exponentialhistogram.ExponentialHistogram; import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.expression.function.AbstractScalarFunctionTestCase; @@ -24,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +import java.util.stream.Stream; import static org.hamcrest.Matchers.equalTo; @@ -44,10 +44,10 @@ public static Iterable parameters() { DataType.INTEGER, true ); - List histogramSuppliers = new ArrayList<>(TestCaseSupplier.exponentialHistogramCases()); - if (EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()) { - histogramSuppliers.addAll(TestCaseSupplier.tdigestCases()); - } + List histogramSuppliers = Stream.concat( + TestCaseSupplier.exponentialHistogramCases().stream(), + TestCaseSupplier.tdigestCases().stream() + ).toList(); for (TestCaseSupplier.TypedDataSupplier histoSupplier : histogramSuppliers) { suppliers.add( new TestCaseSupplier( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/HistogramPercentileTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/HistogramPercentileTests.java index 9f7ac7629ed7c..f045dad6fe844 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/HistogramPercentileTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/histogram/HistogramPercentileTests.java @@ -16,7 +16,6 @@ import org.elasticsearch.exponentialhistogram.ExponentialHistogramQuantile; import org.elasticsearch.search.aggregations.metrics.TDigestState; import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.expression.function.AbstractScalarFunctionTestCase; @@ -63,9 +62,7 @@ public static Iterable parameters() { List histogramInputs = new ArrayList<>(); histogramInputs.addAll(TestCaseSupplier.exponentialHistogramCases()); - if (EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()) { - histogramInputs.addAll(TestCaseSupplier.tdigestCases()); - } + histogramInputs.addAll(TestCaseSupplier.tdigestCases()); TestCaseSupplier.casesCrossProduct((histogramObj, percentileObj) -> { Number percentile = (Number) percentileObj; diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppendErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppendErrorTests.java index f3b329e9ff866..f868a3326cb34 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppendErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvAppendErrorTests.java @@ -33,7 +33,12 @@ protected Expression build(Source source, List args) { @Override protected Matcher expectedTypeErrorMatcher(List> validPerPosition, List signature) { - var unsupportedTypes = List.of(DataType.AGGREGATE_METRIC_DOUBLE, DataType.DENSE_VECTOR, DataType.EXPONENTIAL_HISTOGRAM); + var unsupportedTypes = List.of( + DataType.AGGREGATE_METRIC_DOUBLE, + DataType.DENSE_VECTOR, + DataType.EXPONENTIAL_HISTOGRAM, + DataType.TDIGEST + ); if (unsupportedTypes.contains(signature.getFirst()) || signature.getFirst() == DataType.NULL && unsupportedTypes.contains(signature.get(1))) { return containsString( @@ -41,7 +46,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } else { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContainsErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContainsErrorTests.java index adea254b5e51b..ca11a99193df6 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContainsErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvContainsErrorTests.java @@ -33,7 +33,12 @@ protected Expression build(Source source, List args) { @Override protected Matcher expectedTypeErrorMatcher(List> validPerPosition, List signature) { - var unsupportedTypes = List.of(DataType.AGGREGATE_METRIC_DOUBLE, DataType.DENSE_VECTOR, DataType.EXPONENTIAL_HISTOGRAM); + var unsupportedTypes = List.of( + DataType.AGGREGATE_METRIC_DOUBLE, + DataType.DENSE_VECTOR, + DataType.EXPONENTIAL_HISTOGRAM, + DataType.TDIGEST + ); if (unsupportedTypes.contains(signature.getFirst()) || signature.getFirst() == DataType.NULL && unsupportedTypes.contains(signature.get(1))) { return containsString( @@ -41,7 +46,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } else { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCountErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCountErrorTests.java index c6e835d7c29c4..c6d5de3d3a70c 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCountErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvCountErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } @@ -47,7 +47,12 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl assertThat( invalidSignatureSamples, equalTo( - Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.AGGREGATE_METRIC_DOUBLE)) + Set.of( + List.of(DataType.DENSE_VECTOR), + List.of(DataType.EXPONENTIAL_HISTOGRAM), + List.of(DataType.AGGREGATE_METRIC_DOUBLE), + List.of(DataType.TDIGEST) + ) ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupeErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupeErrorTests.java index 23227bbfcf1cf..a8268a4bd5791 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupeErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvDedupeErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } @@ -51,7 +51,12 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl assertThat( invalidSignatureSamples, equalTo( - Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.AGGREGATE_METRIC_DOUBLE)) + Set.of( + List.of(DataType.DENSE_VECTOR), + List.of(DataType.EXPONENTIAL_HISTOGRAM), + List.of(DataType.AGGREGATE_METRIC_DOUBLE), + List.of(DataType.TDIGEST) + ) ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirstErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirstErrorTests.java index 4996083e8c248..d008992e0bcec 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirstErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvFirstErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } @@ -47,7 +47,12 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl assertThat( invalidSignatureSamples, equalTo( - Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.AGGREGATE_METRIC_DOUBLE)) + Set.of( + List.of(DataType.DENSE_VECTOR), + List.of(DataType.EXPONENTIAL_HISTOGRAM), + List.of(DataType.AGGREGATE_METRIC_DOUBLE), + List.of(DataType.TDIGEST) + ) ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLastErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLastErrorTests.java index 92d3b37ebcca7..01919960479f6 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLastErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvLastErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } @@ -47,7 +47,12 @@ protected void assertCheckedSignatures(Set> invalidSignatureSampl assertThat( invalidSignatureSamples, equalTo( - Set.of(List.of(DataType.DENSE_VECTOR), List.of(DataType.EXPONENTIAL_HISTOGRAM), List.of(DataType.AGGREGATE_METRIC_DOUBLE)) + Set.of( + List.of(DataType.DENSE_VECTOR), + List.of(DataType.EXPONENTIAL_HISTOGRAM), + List.of(DataType.AGGREGATE_METRIC_DOUBLE), + List.of(DataType.TDIGEST) + ) ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMaxErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMaxErrorTests.java index 1df79e8ff111c..04db2be71e7ba 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMaxErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMaxErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter, spatial types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter, spatial types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMinErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMinErrorTests.java index 1a47a610efde8..a04373a29e39d 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMinErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvMinErrorTests.java @@ -37,7 +37,7 @@ protected Matcher expectedTypeErrorMatcher(List> validPerP false, validPerPosition, signature, - (v, p) -> "any type except counter, spatial types, dense_vector, aggregate_metric_double or exponential_histogram" + (v, p) -> "any type except counter, spatial types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram" ) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSliceErrorTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSliceErrorTests.java index 6c1a0a87643a2..999ae43225863 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSliceErrorTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/multivalue/MvSliceErrorTests.java @@ -34,7 +34,7 @@ protected Expression build(Source source, List args) { protected Matcher expectedTypeErrorMatcher(List> validPerPosition, List signature) { return equalTo(typeErrorMessage(true, validPerPosition, signature, (v, p) -> switch (p) { case 1, 2 -> "integer"; - default -> "any type except counter types, dense_vector, aggregate_metric_double or exponential_histogram"; + default -> "any type except counter types, dense_vector, aggregate_metric_double, tdigest or exponential_histogram"; })); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullTests.java index 4a6c4fad419ae..bfa541b7e3ff6 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullTests.java @@ -42,9 +42,6 @@ public static Iterable parameters() { if (type.supportedVersion().supportedLocally() == false) { continue; } - if (type == DataType.TDIGEST) { - continue; - } if (type != DataType.NULL) { suppliers.add( new TestCaseSupplier( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/AbstractLogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/AbstractLogicalPlanOptimizerTests.java index bbe170199605e..02ee388ea6128 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/AbstractLogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/AbstractLogicalPlanOptimizerTests.java @@ -12,7 +12,6 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.VerificationException; -import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; import org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils; import org.elasticsearch.xpack.esql.analysis.EnrichResolution; @@ -173,18 +172,14 @@ public static void init() { ); List metricIndices = new ArrayList<>(); - if (EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_TECH_PREVIEW.isEnabled()) { - Map expHistoMetricMapping = loadMapping("exp_histo_sample-mappings.json"); - metricIndices.add( - EsIndexGenerator.esIndex("exp_histo_sample", expHistoMetricMapping, Map.of("exp_histo_sample", IndexMode.TIME_SERIES)) - ); - } - if (EsqlCapabilities.Cap.TDIGEST_FIELD_TYPE_SUPPORT_V4.isEnabled()) { - Map mapping = loadMapping("tdigest_timeseries_index-mappings.json"); - metricIndices.add( - EsIndexGenerator.esIndex("tdigest_timeseries_index", mapping, Map.of("tdigest_timeseries_index", IndexMode.TIME_SERIES)) - ); - } + Map expHistoMetricMapping = loadMapping("exp_histo_sample-mappings.json"); + metricIndices.add( + EsIndexGenerator.esIndex("exp_histo_sample", expHistoMetricMapping, Map.of("exp_histo_sample", IndexMode.TIME_SERIES)) + ); + Map tdigestMapping = loadMapping("tdigest_timeseries_index-mappings.json"); + metricIndices.add( + EsIndexGenerator.esIndex("tdigest_timeseries_index", tdigestMapping, Map.of("tdigest_timeseries_index", IndexMode.TIME_SERIES)) + ); metricMapping = loadMapping("k8s-mappings.json"); metricIndices.add(EsIndexGenerator.esIndex("k8s", metricMapping, Map.of("k8s", IndexMode.TIME_SERIES))); metricsAnalyzer = new Analyzer( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index a8ea8c00bd9e0..40d2bb362dedb 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -41,7 +41,6 @@ import org.elasticsearch.xpack.esql.core.expression.ReferenceAttribute; import org.elasticsearch.xpack.esql.core.expression.UnresolvedAttribute; import org.elasticsearch.xpack.esql.core.expression.predicate.operator.comparison.BinaryComparison; -import org.elasticsearch.xpack.esql.core.plugin.EsqlCorePlugin; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.type.PotentiallyUnmappedKeywordEsField; @@ -8023,7 +8022,6 @@ public void testTranslateHistogramPercentileWithImplicitMergeOverTimeAndFilter() } public void testTranslateTDigestSumWithImplicitMergeOverTime() { - assumeTrue("TDigest support", EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()); var query = """ TS tdigest_timeseries_index | STATS SUM(responseTime) BY bucket(@timestamp, 1 minute) | LIMIT 10 """; @@ -8055,7 +8053,6 @@ public void testTranslateTDigestSumWithImplicitMergeOverTime() { } public void testTranslateTDigestPercentileWithImplicitMergeOverTime() { - assumeTrue("TDigest support", EsqlCorePlugin.T_DIGEST_ESQL_SUPPORT.isEnabled()); var query = """ TS tdigest_timeseries_index | STATS PERCENTILE(responseTime, 50) BY bucket(@timestamp, 1 minute) | LIMIT 10 """; diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml index bdf509e1f6cba..d02b05427c7d3 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/analytics/t_digest_fieldtype.yml @@ -1,4 +1,7 @@ setup: + - requires: + cluster_features: [ "mapper.tdigest_type" ] + reason: tdigest field type was introduced - skip: features: headers - do: