diff --git a/.buildkite/pipelines/dra-workflow.yml b/.buildkite/pipelines/dra-workflow.yml
index e7bf19816356f..32a2b7d22134a 100644
--- a/.buildkite/pipelines/dra-workflow.yml
+++ b/.buildkite/pipelines/dra-workflow.yml
@@ -7,6 +7,7 @@ steps:
image: family/elasticsearch-ubuntu-2204
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
# The hadoop build depends on the ES artifact
# So let's trigger the hadoop build any time we build a new staging artifact
diff --git a/.buildkite/pipelines/intake.template.yml b/.buildkite/pipelines/intake.template.yml
index f530f237113a9..1a513971b2c10 100644
--- a/.buildkite/pipelines/intake.template.yml
+++ b/.buildkite/pipelines/intake.template.yml
@@ -7,6 +7,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
- label: part1
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart1
@@ -16,6 +17,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part2
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart2
timeout_in_minutes: 300
@@ -24,6 +26,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part3
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart3
timeout_in_minutes: 300
@@ -32,6 +35,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part4
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart4
timeout_in_minutes: 300
@@ -40,6 +44,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part5
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart5
timeout_in_minutes: 300
@@ -48,6 +53,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- group: bwc-snapshots
steps:
- label: "{{matrix.BWC_VERSION}} / bwc-snapshots"
@@ -61,6 +67,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: "{{matrix.BWC_VERSION}}"
- label: rest-compat
@@ -71,6 +78,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
- trigger: elasticsearch-dra-workflow
label: Trigger DRA snapshot workflow
diff --git a/.buildkite/pipelines/intake.yml b/.buildkite/pipelines/intake.yml
index b33fc98ccb01b..4124d4e550d11 100644
--- a/.buildkite/pipelines/intake.yml
+++ b/.buildkite/pipelines/intake.yml
@@ -8,6 +8,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
- label: part1
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart1
@@ -17,6 +18,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part2
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart2
timeout_in_minutes: 300
@@ -25,6 +27,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part3
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart3
timeout_in_minutes: 300
@@ -33,6 +36,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part4
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart4
timeout_in_minutes: 300
@@ -41,6 +45,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part5
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart5
timeout_in_minutes: 300
@@ -49,6 +54,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- group: bwc-snapshots
steps:
- label: "{{matrix.BWC_VERSION}} / bwc-snapshots"
@@ -62,6 +68,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: "{{matrix.BWC_VERSION}}"
- label: rest-compat
@@ -72,6 +79,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
- trigger: elasticsearch-dra-workflow
label: Trigger DRA snapshot workflow
diff --git a/.buildkite/pipelines/lucene-snapshot/build-snapshot.yml b/.buildkite/pipelines/lucene-snapshot/build-snapshot.yml
index 8cf2a8aacbece..1f69b8faa7ab4 100644
--- a/.buildkite/pipelines/lucene-snapshot/build-snapshot.yml
+++ b/.buildkite/pipelines/lucene-snapshot/build-snapshot.yml
@@ -15,6 +15,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait
- trigger: "elasticsearch-lucene-snapshot-tests"
build:
diff --git a/.buildkite/pipelines/lucene-snapshot/run-tests.yml b/.buildkite/pipelines/lucene-snapshot/run-tests.yml
index c76c54a56494e..49c3396488d82 100644
--- a/.buildkite/pipelines/lucene-snapshot/run-tests.yml
+++ b/.buildkite/pipelines/lucene-snapshot/run-tests.yml
@@ -7,6 +7,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- wait: null
- label: part1
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart1
@@ -16,6 +17,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part2
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart2
timeout_in_minutes: 300
@@ -24,6 +26,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part3
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart3
timeout_in_minutes: 300
@@ -32,6 +35,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part4
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart4
timeout_in_minutes: 300
@@ -40,6 +44,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: part5
command: .ci/scripts/run-gradle.sh -Dbwc.checkout.align=true -Dorg.elasticsearch.build.cache.push=true -Dignore.tests.seed -Dscan.capture-task-input-files checkPart5
timeout_in_minutes: 300
@@ -48,6 +53,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- group: bwc-snapshots
steps:
- label: "{{matrix.BWC_VERSION}} / bwc-snapshots"
@@ -64,6 +70,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: "{{matrix.BWC_VERSION}}"
- label: rest-compat
@@ -74,3 +81,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/periodic-packaging.bwc.template.yml b/.buildkite/pipelines/periodic-packaging.bwc.template.yml
index b06bc80d3535d..8a6fa2553b204 100644
--- a/.buildkite/pipelines/periodic-packaging.bwc.template.yml
+++ b/.buildkite/pipelines/periodic-packaging.bwc.template.yml
@@ -11,5 +11,6 @@
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: $BWC_VERSION
diff --git a/.buildkite/pipelines/periodic-packaging.yml b/.buildkite/pipelines/periodic-packaging.yml
index 406331dda881b..4217fc91bf0fd 100644
--- a/.buildkite/pipelines/periodic-packaging.yml
+++ b/.buildkite/pipelines/periodic-packaging.yml
@@ -46,6 +46,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.0.1
@@ -62,6 +63,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.1.1
@@ -78,6 +80,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.2.1
@@ -94,6 +97,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.3.2
@@ -110,6 +114,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.4.2
@@ -126,6 +131,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.5.2
@@ -142,6 +148,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.6.2
@@ -158,6 +165,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.7.1
@@ -174,6 +182,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.8.1
@@ -190,6 +199,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.9.3
@@ -206,6 +216,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.10.2
@@ -222,6 +233,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.11.2
@@ -238,6 +250,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.12.1
@@ -254,6 +267,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.13.4
@@ -270,6 +284,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.14.2
@@ -286,6 +301,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.15.2
@@ -302,6 +318,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.16.3
@@ -318,6 +335,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 7.17.23
@@ -334,6 +352,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.0.1
@@ -350,6 +369,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.1.3
@@ -366,6 +386,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.2.3
@@ -382,6 +403,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.3.3
@@ -398,6 +420,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.4.3
@@ -414,6 +437,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.5.3
@@ -430,6 +454,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.6.2
@@ -446,6 +471,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.7.1
@@ -462,6 +488,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.8.2
@@ -478,6 +505,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.9.2
@@ -494,6 +522,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.10.4
@@ -510,6 +539,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.11.4
@@ -526,6 +556,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.12.2
@@ -542,6 +573,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.13.4
@@ -558,6 +590,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.14.2
@@ -574,6 +607,7 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: 8.15.0
diff --git a/.buildkite/pipelines/periodic-platform-support.yml b/.buildkite/pipelines/periodic-platform-support.yml
index d8c5d55fc7e4f..867ebe41ed6af 100644
--- a/.buildkite/pipelines/periodic-platform-support.yml
+++ b/.buildkite/pipelines/periodic-platform-support.yml
@@ -30,6 +30,7 @@ steps:
localSsds: 1
localSsdInterface: nvme
machineType: custom-32-98304
+ diskSizeGb: 250
env: {}
- group: platform-support-windows
steps:
diff --git a/.buildkite/pipelines/periodic.bwc.template.yml b/.buildkite/pipelines/periodic.bwc.template.yml
index 43a0a7438d656..b22270dbf221c 100644
--- a/.buildkite/pipelines/periodic.bwc.template.yml
+++ b/.buildkite/pipelines/periodic.bwc.template.yml
@@ -7,6 +7,7 @@
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: $BWC_VERSION
retry:
diff --git a/.buildkite/pipelines/periodic.template.yml b/.buildkite/pipelines/periodic.template.yml
index 207a332ed6717..87e30a0ea73ba 100644
--- a/.buildkite/pipelines/periodic.template.yml
+++ b/.buildkite/pipelines/periodic.template.yml
@@ -25,6 +25,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: example-plugins
command: |-
cd $$WORKSPACE/plugins/examples
@@ -36,6 +37,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- group: java-fips-matrix
steps:
- label: "{{matrix.ES_RUNTIME_JAVA}} / {{matrix.GRADLE_TASK}} / java-fips-matrix"
@@ -57,6 +59,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
GRADLE_TASK: "{{matrix.GRADLE_TASK}}"
@@ -73,6 +76,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
BWC_VERSION: "{{matrix.BWC_VERSION}}"
@@ -101,6 +105,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
GRADLE_TASK: "{{matrix.GRADLE_TASK}}"
@@ -121,6 +126,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
BWC_VERSION: "{{matrix.BWC_VERSION}}"
@@ -156,6 +162,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / azure
command: |
export azure_storage_container=elasticsearch-ci-thirdparty
@@ -170,6 +177,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / gcs
command: |
export google_storage_bucket=elasticsearch-ci-thirdparty
@@ -184,6 +192,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / geoip
command: |
.ci/scripts/run-gradle.sh :modules:ingest-geoip:internalClusterTest -Dtests.jvm.argline="-Dgeoip_use_service=true"
@@ -193,6 +202,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / s3
command: |
export amazon_s3_bucket=elasticsearch-ci.us-west-2
@@ -207,6 +217,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: Upload Snyk Dependency Graph
command: .ci/scripts/run-gradle.sh uploadSnykDependencyGraph -PsnykTargetReference=$BUILDKITE_BRANCH
env:
@@ -217,6 +228,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
if: build.branch == "main" || build.branch == "7.17"
- label: check-branch-consistency
command: .ci/scripts/run-gradle.sh branchConsistency
@@ -225,6 +237,7 @@ steps:
provider: gcp
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-2
+ diskSizeGb: 250
- label: check-branch-protection-rules
command: .buildkite/scripts/branch-protection.sh
timeout_in_minutes: 5
diff --git a/.buildkite/pipelines/periodic.yml b/.buildkite/pipelines/periodic.yml
index 32da1db652239..06e7ffbc8fb1c 100644
--- a/.buildkite/pipelines/periodic.yml
+++ b/.buildkite/pipelines/periodic.yml
@@ -11,6 +11,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.0.1
retry:
@@ -30,6 +31,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.1.1
retry:
@@ -49,6 +51,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.2.1
retry:
@@ -68,6 +71,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.3.2
retry:
@@ -87,6 +91,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.4.2
retry:
@@ -106,6 +111,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.5.2
retry:
@@ -125,6 +131,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.6.2
retry:
@@ -144,6 +151,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.7.1
retry:
@@ -163,6 +171,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.8.1
retry:
@@ -182,6 +191,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.9.3
retry:
@@ -201,6 +211,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.10.2
retry:
@@ -220,6 +231,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.11.2
retry:
@@ -239,6 +251,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.12.1
retry:
@@ -258,6 +271,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.13.4
retry:
@@ -277,6 +291,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.14.2
retry:
@@ -296,6 +311,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.15.2
retry:
@@ -315,6 +331,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.16.3
retry:
@@ -334,6 +351,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 7.17.23
retry:
@@ -353,6 +371,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.0.1
retry:
@@ -372,6 +391,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.1.3
retry:
@@ -391,6 +411,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.2.3
retry:
@@ -410,6 +431,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.3.3
retry:
@@ -429,6 +451,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.4.3
retry:
@@ -448,6 +471,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.5.3
retry:
@@ -467,6 +491,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.6.2
retry:
@@ -486,6 +511,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.7.1
retry:
@@ -505,6 +531,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.8.2
retry:
@@ -524,6 +551,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.9.2
retry:
@@ -543,6 +571,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.10.4
retry:
@@ -562,6 +591,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.11.4
retry:
@@ -581,6 +611,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.12.2
retry:
@@ -600,6 +631,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.13.4
retry:
@@ -619,6 +651,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.14.2
retry:
@@ -638,6 +671,7 @@ steps:
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
preemptible: true
+ diskSizeGb: 250
env:
BWC_VERSION: 8.15.0
retry:
@@ -672,6 +706,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: example-plugins
command: |-
cd $$WORKSPACE/plugins/examples
@@ -683,6 +718,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- group: java-fips-matrix
steps:
- label: "{{matrix.ES_RUNTIME_JAVA}} / {{matrix.GRADLE_TASK}} / java-fips-matrix"
@@ -704,6 +740,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
GRADLE_TASK: "{{matrix.GRADLE_TASK}}"
@@ -720,6 +757,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
BWC_VERSION: "{{matrix.BWC_VERSION}}"
@@ -748,6 +786,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
GRADLE_TASK: "{{matrix.GRADLE_TASK}}"
@@ -768,6 +807,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
ES_RUNTIME_JAVA: "{{matrix.ES_RUNTIME_JAVA}}"
BWC_VERSION: "{{matrix.BWC_VERSION}}"
@@ -803,6 +843,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / azure
command: |
export azure_storage_container=elasticsearch-ci-thirdparty
@@ -817,6 +858,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / gcs
command: |
export google_storage_bucket=elasticsearch-ci-thirdparty
@@ -831,6 +873,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / geoip
command: |
.ci/scripts/run-gradle.sh :modules:ingest-geoip:internalClusterTest -Dtests.jvm.argline="-Dgeoip_use_service=true"
@@ -840,6 +883,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: third-party / s3
command: |
export amazon_s3_bucket=elasticsearch-ci.us-west-2
@@ -854,6 +898,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
- label: Upload Snyk Dependency Graph
command: .ci/scripts/run-gradle.sh uploadSnykDependencyGraph -PsnykTargetReference=$BUILDKITE_BRANCH
env:
@@ -864,6 +909,7 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-8
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
if: build.branch == "main" || build.branch == "7.17"
- label: check-branch-consistency
command: .ci/scripts/run-gradle.sh branchConsistency
@@ -872,6 +918,7 @@ steps:
provider: gcp
image: family/elasticsearch-ubuntu-2004
machineType: n2-standard-2
+ diskSizeGb: 250
- label: check-branch-protection-rules
command: .buildkite/scripts/branch-protection.sh
timeout_in_minutes: 5
diff --git a/.buildkite/pipelines/pull-request/build-benchmark.yml b/.buildkite/pipelines/pull-request/build-benchmark.yml
index 8d3215b8393ce..96330bee03638 100644
--- a/.buildkite/pipelines/pull-request/build-benchmark.yml
+++ b/.buildkite/pipelines/pull-request/build-benchmark.yml
@@ -22,3 +22,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/bwc-snapshots.yml b/.buildkite/pipelines/pull-request/bwc-snapshots.yml
index 5a9fc2d938ac0..8f59e593b286f 100644
--- a/.buildkite/pipelines/pull-request/bwc-snapshots.yml
+++ b/.buildkite/pipelines/pull-request/bwc-snapshots.yml
@@ -18,3 +18,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: n1-standard-32
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/cloud-deploy.yml b/.buildkite/pipelines/pull-request/cloud-deploy.yml
index ce8e8206d51ff..2932f874c5cf8 100644
--- a/.buildkite/pipelines/pull-request/cloud-deploy.yml
+++ b/.buildkite/pipelines/pull-request/cloud-deploy.yml
@@ -11,3 +11,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/docs-check.yml b/.buildkite/pipelines/pull-request/docs-check.yml
index 2201eb2d1e4ea..3bf1e43697a7c 100644
--- a/.buildkite/pipelines/pull-request/docs-check.yml
+++ b/.buildkite/pipelines/pull-request/docs-check.yml
@@ -12,3 +12,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/eql-correctness.yml b/.buildkite/pipelines/pull-request/eql-correctness.yml
index 8f7ca6942c0e9..d85827d10e886 100644
--- a/.buildkite/pipelines/pull-request/eql-correctness.yml
+++ b/.buildkite/pipelines/pull-request/eql-correctness.yml
@@ -7,3 +7,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/example-plugins.yml b/.buildkite/pipelines/pull-request/example-plugins.yml
index 18d0de6594980..fb4a17fb214cb 100644
--- a/.buildkite/pipelines/pull-request/example-plugins.yml
+++ b/.buildkite/pipelines/pull-request/example-plugins.yml
@@ -16,3 +16,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/full-bwc.yml b/.buildkite/pipelines/pull-request/full-bwc.yml
index d3fa8eccaf7d9..c404069bd0e60 100644
--- a/.buildkite/pipelines/pull-request/full-bwc.yml
+++ b/.buildkite/pipelines/pull-request/full-bwc.yml
@@ -13,3 +13,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/packaging-upgrade-tests.yml b/.buildkite/pipelines/pull-request/packaging-upgrade-tests.yml
index c62cf23310422..970dafbb28647 100644
--- a/.buildkite/pipelines/pull-request/packaging-upgrade-tests.yml
+++ b/.buildkite/pipelines/pull-request/packaging-upgrade-tests.yml
@@ -18,5 +18,6 @@ steps:
image: family/elasticsearch-{{matrix.image}}
machineType: custom-16-32768
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
env:
BWC_VERSION: $BWC_VERSION
diff --git a/.buildkite/pipelines/pull-request/part-1-fips.yml b/.buildkite/pipelines/pull-request/part-1-fips.yml
index 42f930c1bde9a..99544e7f5a80b 100644
--- a/.buildkite/pipelines/pull-request/part-1-fips.yml
+++ b/.buildkite/pipelines/pull-request/part-1-fips.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-1.yml b/.buildkite/pipelines/pull-request/part-1.yml
index 3d467c6c41e43..b4b9d5469ec41 100644
--- a/.buildkite/pipelines/pull-request/part-1.yml
+++ b/.buildkite/pipelines/pull-request/part-1.yml
@@ -7,3 +7,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-2-fips.yml b/.buildkite/pipelines/pull-request/part-2-fips.yml
index 6a3647ceb50ae..36a9801547d78 100644
--- a/.buildkite/pipelines/pull-request/part-2-fips.yml
+++ b/.buildkite/pipelines/pull-request/part-2-fips.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-2.yml b/.buildkite/pipelines/pull-request/part-2.yml
index 43de69bbcd945..12bd78cf895fd 100644
--- a/.buildkite/pipelines/pull-request/part-2.yml
+++ b/.buildkite/pipelines/pull-request/part-2.yml
@@ -7,3 +7,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-3-fips.yml b/.buildkite/pipelines/pull-request/part-3-fips.yml
index cee3ea153acb9..4a2df3026e782 100644
--- a/.buildkite/pipelines/pull-request/part-3-fips.yml
+++ b/.buildkite/pipelines/pull-request/part-3-fips.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-3.yml b/.buildkite/pipelines/pull-request/part-3.yml
index 12abae7634822..6991c05da85c6 100644
--- a/.buildkite/pipelines/pull-request/part-3.yml
+++ b/.buildkite/pipelines/pull-request/part-3.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-4-fips.yml b/.buildkite/pipelines/pull-request/part-4-fips.yml
index 11a50456ca4c0..734f8af816895 100644
--- a/.buildkite/pipelines/pull-request/part-4-fips.yml
+++ b/.buildkite/pipelines/pull-request/part-4-fips.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-4.yml b/.buildkite/pipelines/pull-request/part-4.yml
index af11f08953d07..59f2f2898a590 100644
--- a/.buildkite/pipelines/pull-request/part-4.yml
+++ b/.buildkite/pipelines/pull-request/part-4.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-5-fips.yml b/.buildkite/pipelines/pull-request/part-5-fips.yml
index 4e193ac751086..801b812bb99c0 100644
--- a/.buildkite/pipelines/pull-request/part-5-fips.yml
+++ b/.buildkite/pipelines/pull-request/part-5-fips.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/part-5.yml b/.buildkite/pipelines/pull-request/part-5.yml
index 306ce7533d0ed..c7e50631d1cdd 100644
--- a/.buildkite/pipelines/pull-request/part-5.yml
+++ b/.buildkite/pipelines/pull-request/part-5.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/precommit.yml b/.buildkite/pipelines/pull-request/precommit.yml
index f6548dfeed9b2..8d1458b1b60c8 100644
--- a/.buildkite/pipelines/pull-request/precommit.yml
+++ b/.buildkite/pipelines/pull-request/precommit.yml
@@ -10,3 +10,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/rest-compatibility.yml b/.buildkite/pipelines/pull-request/rest-compatibility.yml
index a69810e23d960..16144a2a0780f 100644
--- a/.buildkite/pipelines/pull-request/rest-compatibility.yml
+++ b/.buildkite/pipelines/pull-request/rest-compatibility.yml
@@ -9,3 +9,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/.buildkite/pipelines/pull-request/validate-changelogs.yml b/.buildkite/pipelines/pull-request/validate-changelogs.yml
index 9451d321a9b39..296ef11637118 100644
--- a/.buildkite/pipelines/pull-request/validate-changelogs.yml
+++ b/.buildkite/pipelines/pull-request/validate-changelogs.yml
@@ -7,3 +7,4 @@ steps:
image: family/elasticsearch-ubuntu-2004
machineType: custom-32-98304
buildDirectory: /dev/shm/bk
+ diskSizeGb: 250
diff --git a/docs/changelog/109657.yaml b/docs/changelog/109657.yaml
new file mode 100644
index 0000000000000..35b315b7568c9
--- /dev/null
+++ b/docs/changelog/109657.yaml
@@ -0,0 +1,5 @@
+pr: 109657
+summary: Track `RequestedRangeNotSatisfiedException` separately in S3 Metrics
+area: Snapshot/Restore
+type: enhancement
+issues: []
diff --git a/docs/changelog/109779.yaml b/docs/changelog/109779.yaml
new file mode 100644
index 0000000000000..4ccd8d475ec8d
--- /dev/null
+++ b/docs/changelog/109779.yaml
@@ -0,0 +1,5 @@
+pr: 109779
+summary: Include component templates in retention validaiton
+area: Data streams
+type: bug
+issues: []
diff --git a/modules/repository-s3/src/internalClusterTest/java/org/elasticsearch/repositories/s3/S3BlobStoreRepositoryMetricsTests.java b/modules/repository-s3/src/internalClusterTest/java/org/elasticsearch/repositories/s3/S3BlobStoreRepositoryMetricsTests.java
index f8503bca3ec67..640293ecb80b0 100644
--- a/modules/repository-s3/src/internalClusterTest/java/org/elasticsearch/repositories/s3/S3BlobStoreRepositoryMetricsTests.java
+++ b/modules/repository-s3/src/internalClusterTest/java/org/elasticsearch/repositories/s3/S3BlobStoreRepositoryMetricsTests.java
@@ -14,7 +14,6 @@
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.blobstore.BlobContainer;
import org.elasticsearch.common.blobstore.BlobPath;
-import org.elasticsearch.common.blobstore.BlobStore;
import org.elasticsearch.common.blobstore.OperationPurpose;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.collect.Iterators;
@@ -23,6 +22,7 @@
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
+import org.elasticsearch.repositories.blobstore.RequestedRangeNotSatisfiedException;
import org.elasticsearch.repositories.s3.S3BlobStore.Operation;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.telemetry.Measurement;
@@ -39,6 +39,7 @@
import static org.elasticsearch.repositories.RepositoriesMetrics.HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_EXCEPTIONS_HISTOGRAM;
+import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_EXCEPTIONS_REQUEST_RANGE_NOT_SATISFIED_TOTAL;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_EXCEPTIONS_TOTAL;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_OPERATIONS_TOTAL;
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_REQUESTS_TOTAL;
@@ -47,8 +48,10 @@
import static org.elasticsearch.repositories.RepositoriesMetrics.METRIC_UNSUCCESSFUL_OPERATIONS_TOTAL;
import static org.elasticsearch.rest.RestStatus.INTERNAL_SERVER_ERROR;
import static org.elasticsearch.rest.RestStatus.NOT_FOUND;
+import static org.elasticsearch.rest.RestStatus.REQUESTED_RANGE_NOT_SATISFIED;
import static org.elasticsearch.rest.RestStatus.TOO_MANY_REQUESTS;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
@SuppressForbidden(reason = "this test uses a HttpServer to emulate an S3 endpoint")
// Need to set up a new cluster for each test because cluster settings use randomized authentication settings
@@ -80,22 +83,29 @@ protected Settings nodeSettings(int nodeOrdinal, Settings otherSettings) {
.build();
}
- public void testMetricsWithErrors() throws IOException {
- final String repository = createRepository(randomRepositoryName());
-
- final String dataNodeName = internalCluster().getNodeNameThat(DiscoveryNode::canContainData);
- final var blobStoreRepository = (BlobStoreRepository) internalCluster().getInstance(RepositoriesService.class, dataNodeName)
- .repository(repository);
- final BlobStore blobStore = blobStoreRepository.blobStore();
- final TestTelemetryPlugin plugin = internalCluster().getInstance(PluginsService.class, dataNodeName)
+ private static TestTelemetryPlugin getPlugin(String dataNodeName) {
+ var plugin = internalCluster().getInstance(PluginsService.class, dataNodeName)
.filterPlugins(TestTelemetryPlugin.class)
.findFirst()
.orElseThrow();
-
plugin.resetMeter();
+ return plugin;
+ }
+
+ private static BlobContainer getBlobContainer(String dataNodeName, String repository) {
+ final var blobStoreRepository = (BlobStoreRepository) internalCluster().getInstance(RepositoriesService.class, dataNodeName)
+ .repository(repository);
+ return blobStoreRepository.blobStore().blobContainer(BlobPath.EMPTY.add(randomIdentifier()));
+ }
+
+ public void testMetricsWithErrors() throws IOException {
+ final String repository = createRepository(randomRepositoryName());
+
+ final String dataNodeName = internalCluster().getNodeNameThat(DiscoveryNode::canContainData);
+ final TestTelemetryPlugin plugin = getPlugin(dataNodeName);
final OperationPurpose purpose = randomFrom(OperationPurpose.values());
- final BlobContainer blobContainer = blobStore.blobContainer(BlobPath.EMPTY.add(randomIdentifier()));
+ final BlobContainer blobContainer = getBlobContainer(dataNodeName, repository);
final String blobName = randomIdentifier();
// Put a blob
@@ -132,6 +142,9 @@ public void testMetricsWithErrors() throws IOException {
assertThat(getLongHistogramValue(plugin, METRIC_EXCEPTIONS_HISTOGRAM, Operation.GET_OBJECT), equalTo(batch));
assertThat(getLongHistogramValue(plugin, METRIC_THROTTLES_HISTOGRAM, Operation.GET_OBJECT), equalTo(batch));
assertThat(getNumberOfMeasurements(plugin, HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM, Operation.GET_OBJECT), equalTo(batch));
+
+ // Make sure we don't hit the request range not satisfied counters
+ assertThat(getLongCounterValue(plugin, METRIC_EXCEPTIONS_REQUEST_RANGE_NOT_SATISFIED_TOTAL, Operation.GET_OBJECT), equalTo(0L));
}
// List retry exhausted
@@ -166,6 +179,39 @@ public void testMetricsWithErrors() throws IOException {
assertThat(getNumberOfMeasurements(plugin, HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM, Operation.DELETE_OBJECTS), equalTo(1L));
}
+ public void testMetricsForRequestRangeNotSatisfied() {
+ final String repository = createRepository(randomRepositoryName());
+ final String dataNodeName = internalCluster().getNodeNameThat(DiscoveryNode::canContainData);
+ final BlobContainer blobContainer = getBlobContainer(dataNodeName, repository);
+ final TestTelemetryPlugin plugin = getPlugin(dataNodeName);
+
+ final OperationPurpose purpose = randomFrom(OperationPurpose.values());
+ final String blobName = randomIdentifier();
+
+ for (int i = 0; i < randomIntBetween(1, 3); i++) {
+ final long batch = i + 1;
+ addErrorStatus(TOO_MANY_REQUESTS, TOO_MANY_REQUESTS, REQUESTED_RANGE_NOT_SATISFIED);
+ try {
+ blobContainer.readBlob(purpose, blobName).close();
+ } catch (Exception e) {
+ assertThat(e, instanceOf(RequestedRangeNotSatisfiedException.class));
+ }
+
+ assertThat(getLongCounterValue(plugin, METRIC_REQUESTS_TOTAL, Operation.GET_OBJECT), equalTo(3 * batch));
+ assertThat(getLongCounterValue(plugin, METRIC_OPERATIONS_TOTAL, Operation.GET_OBJECT), equalTo(batch));
+ assertThat(getLongCounterValue(plugin, METRIC_UNSUCCESSFUL_OPERATIONS_TOTAL, Operation.GET_OBJECT), equalTo(batch));
+ assertThat(getLongCounterValue(plugin, METRIC_EXCEPTIONS_TOTAL, Operation.GET_OBJECT), equalTo(batch));
+ assertThat(getLongHistogramValue(plugin, METRIC_EXCEPTIONS_HISTOGRAM, Operation.GET_OBJECT), equalTo(batch));
+ assertThat(
+ getLongCounterValue(plugin, METRIC_EXCEPTIONS_REQUEST_RANGE_NOT_SATISFIED_TOTAL, Operation.GET_OBJECT),
+ equalTo(batch)
+ );
+ assertThat(getLongCounterValue(plugin, METRIC_THROTTLES_TOTAL, Operation.GET_OBJECT), equalTo(2 * batch));
+ assertThat(getLongHistogramValue(plugin, METRIC_THROTTLES_HISTOGRAM, Operation.GET_OBJECT), equalTo(2 * batch));
+ assertThat(getNumberOfMeasurements(plugin, HTTP_REQUEST_TIME_IN_MICROS_HISTOGRAM, Operation.GET_OBJECT), equalTo(batch));
+ }
+ }
+
private void addErrorStatus(RestStatus... statuses) {
errorStatusQueue.addAll(Arrays.asList(statuses));
}
diff --git a/modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobStore.java b/modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobStore.java
index 2aff610dc82e9..5af53364fb765 100644
--- a/modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobStore.java
+++ b/modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3BlobStore.java
@@ -52,6 +52,7 @@
import java.util.stream.Collectors;
import static org.elasticsearch.core.Strings.format;
+import static org.elasticsearch.rest.RestStatus.REQUESTED_RANGE_NOT_SATISFIED;
class S3BlobStore implements BlobStore {
@@ -177,6 +178,23 @@ public final void collectMetrics(Request> request, Response> response) {
.map(List::size)
.orElse(0);
+ if (exceptionCount > 0) {
+ final List
*/
public abstract class EsqlScalarFunction extends ScalarFunction implements EvaluatorMapper {
+ public static List getNamedWriteables() {
+ return List.of(
+ Case.ENTRY,
+ Coalesce.ENTRY,
+ Concat.ENTRY,
+ Greatest.ENTRY,
+ InsensitiveEquals.ENTRY,
+ DateExtract.ENTRY,
+ DateDiff.ENTRY,
+ DateFormat.ENTRY,
+ DateParse.ENTRY,
+ DateTrunc.ENTRY,
+ Least.ENTRY,
+ Now.ENTRY,
+ ToLower.ENTRY,
+ ToUpper.ENTRY
+ );
+ }
protected EsqlScalarFunction(Source source) {
super(source);
@@ -38,5 +71,4 @@ protected EsqlScalarFunction(Source source, List fields) {
public Object fold() {
return EvaluatorMapper.super.fold();
}
-
}
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/UnaryScalarFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/UnaryScalarFunction.java
index 0866f97b67724..eb2e5ab94487f 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/UnaryScalarFunction.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/UnaryScalarFunction.java
@@ -12,6 +12,9 @@
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.xpack.esql.core.expression.Expression;
import org.elasticsearch.xpack.esql.core.expression.TypeResolutions;
+import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Not;
+import org.elasticsearch.xpack.esql.core.expression.predicate.nulls.IsNotNull;
+import org.elasticsearch.xpack.esql.core.expression.predicate.nulls.IsNull;
import org.elasticsearch.xpack.esql.core.tree.Source;
import org.elasticsearch.xpack.esql.core.type.DataType;
import org.elasticsearch.xpack.esql.expression.function.scalar.convert.FromBase64;
@@ -76,10 +79,13 @@ public static List getNamedWriteables() {
Cosh.ENTRY,
Floor.ENTRY,
FromBase64.ENTRY,
+ IsNotNull.ENTRY,
+ IsNull.ENTRY,
Length.ENTRY,
Log10.ENTRY,
LTrim.ENTRY,
Neg.ENTRY,
+ Not.ENTRY,
RTrim.ENTRY,
Signum.ENTRY,
Sin.ENTRY,
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 f98f5c45acd16..50d0e5484756e 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
@@ -7,6 +7,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.data.Block;
import org.elasticsearch.compute.data.BooleanBlock;
import org.elasticsearch.compute.data.ElementType;
@@ -27,8 +30,11 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.planner.PlannerUtils;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
@@ -37,8 +43,12 @@
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
import static org.elasticsearch.xpack.esql.core.type.DataType.NULL;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanReader.readerFromPlanReader;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanWriter.writerFromPlanWriter;
public final class Case extends EsqlScalarFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Case", Case::new);
+
record Condition(Expression condition, Expression value) {}
private final List conditions;
@@ -110,6 +120,26 @@ public Case(
elseValue = elseValueIsExplicit() ? children().get(children().size() - 1) : new Literal(source, null, NULL);
}
+ private Case(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeCollection(children().subList(1, children().size()), writerFromPlanWriter(PlanStreamOutput::writeExpression));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
private boolean elseValueIsExplicit() {
return children().size() % 2 == 1;
}
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Greatest.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Greatest.java
index 8062019b4c51c..580e2f9900208 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Greatest.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Greatest.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
import org.elasticsearch.xpack.esql.EsqlIllegalArgumentException;
@@ -23,17 +26,24 @@
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
import org.elasticsearch.xpack.esql.expression.function.scalar.multivalue.MvMax;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
+import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import static org.elasticsearch.xpack.esql.core.type.DataType.NULL;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanReader.readerFromPlanReader;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanWriter.writerFromPlanWriter;
/**
* Returns the maximum value of multiple columns.
*/
public class Greatest extends EsqlScalarFunction implements OptionalArgument {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Greatest", Greatest::new);
+
private DataType dataType;
@FunctionInfo(
@@ -61,6 +71,26 @@ public Greatest(
super(source, Stream.concat(Stream.of(first), rest.stream()).toList());
}
+ private Greatest(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeCollection(children().subList(1, children().size()), writerFromPlanWriter(PlanStreamOutput::writeExpression));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
if (dataType == null) {
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Least.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Least.java
index f983e0125a4db..2255fed9d4947 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Least.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/Least.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
import org.elasticsearch.xpack.esql.EsqlIllegalArgumentException;
@@ -23,17 +26,24 @@
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
import org.elasticsearch.xpack.esql.expression.function.scalar.multivalue.MvMin;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
+import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import static org.elasticsearch.xpack.esql.core.type.DataType.NULL;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanReader.readerFromPlanReader;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanWriter.writerFromPlanWriter;
/**
* Returns the minimum value of multiple columns.
*/
public class Least extends EsqlScalarFunction implements OptionalArgument {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Least", Least::new);
+
private DataType dataType;
@FunctionInfo(
@@ -59,6 +69,26 @@ public Least(
super(source, Stream.concat(Stream.of(first), rest.stream()).toList());
}
+ private Least(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeCollection(children().subList(1, children().size()), writerFromPlanWriter(PlanStreamOutput::writeExpression));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
if (dataType == null) {
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiff.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiff.java
index 42e20a9a4615e..2a224598253f9 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiff.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiff.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
@@ -20,7 +23,10 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
+import java.io.IOException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
@@ -47,6 +53,7 @@
* If the second argument (start) is greater than the third argument (end), then negative values are returned.
*/
public class DateDiff extends EsqlScalarFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "DateDiff", DateDiff::new);
public static final ZoneId UTC = ZoneId.of("Z");
@@ -166,6 +173,40 @@ public DateDiff(
this.endTimestamp = endTimestamp;
}
+ private DateDiff(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ ((PlanStreamInput) in).readExpression(),
+ ((PlanStreamInput) in).readExpression()
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ Source.EMPTY.writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(unit);
+ ((PlanStreamOutput) out).writeExpression(startTimestamp);
+ ((PlanStreamOutput) out).writeExpression(endTimestamp);
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
+ Expression unit() {
+ return unit;
+ }
+
+ Expression startTimestamp() {
+ return startTimestamp;
+ }
+
+ Expression endTimestamp() {
+ return endTimestamp;
+ }
+
@Evaluator(extraName = "Constant", warnExceptions = { IllegalArgumentException.class, InvalidArgumentException.class })
static int process(@Fixed Part datePartFieldUnit, long startTimestamp, long endTimestamp) throws IllegalArgumentException {
ZonedDateTime zdtStart = ZonedDateTime.ofInstant(Instant.ofEpochMilli(startTimestamp), UTC);
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtract.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtract.java
index c28c5e417c152..f3448a2b7c5ff 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtract.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtract.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
@@ -22,8 +25,11 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlConfigurationFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.type.EsqlDataTypes;
+import java.io.IOException;
import java.time.ZoneId;
import java.time.temporal.ChronoField;
import java.util.List;
@@ -35,6 +41,11 @@
import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.chronoToLong;
public class DateExtract extends EsqlConfigurationFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
+ Expression.class,
+ "DateExtract",
+ DateExtract::new
+ );
private ChronoField chronoField;
@@ -69,6 +80,35 @@ public DateExtract(
super(source, List.of(chronoFieldExp, field), configuration);
}
+ private DateExtract(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ ((PlanStreamInput) in).readExpression(),
+ ((PlanStreamInput) in).configuration()
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(datePart());
+ ((PlanStreamOutput) out).writeExpression(field());
+ }
+
+ Expression datePart() {
+ return children().get(0);
+ }
+
+ Expression field() {
+ return children().get(1);
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public ExpressionEvaluator.Factory toEvaluator(Function toEvaluator) {
var fieldEvaluator = toEvaluator.apply(children().get(1));
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormat.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormat.java
index bcc5d7cb16050..9a789c2bb6fb2 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormat.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormat.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.time.DateFormatter;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
@@ -22,9 +25,12 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlConfigurationFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.session.EsqlConfiguration;
import org.elasticsearch.xpack.esql.type.EsqlDataTypes;
+import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
@@ -37,6 +43,11 @@
import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.dateTimeToString;
public class DateFormat extends EsqlConfigurationFunction implements OptionalArgument {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
+ Expression.class,
+ "DateFormat",
+ DateFormat::new
+ );
private final Expression field;
private final Expression format;
@@ -59,6 +70,35 @@ Date format (optional). If no format is specified, the `yyyy-MM-dd'T'HH:mm:ss.S
this.format = date != null ? format : null;
}
+ private DateFormat(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readOptionalWriteable(i -> ((PlanStreamInput) i).readExpression()),
+ ((PlanStreamInput) in).configuration()
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeOptionalWriteable(children().size() == 1 ? null : o -> ((PlanStreamOutput) o).writeExpression(children().get(1)));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
+ Expression field() {
+ return field;
+ }
+
+ Expression format() {
+ return format;
+ }
+
@Override
public DataType dataType() {
return DataType.KEYWORD;
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParse.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParse.java
index d68664afe8418..12ffe092287ed 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParse.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParse.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.time.DateFormatter;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
@@ -22,8 +25,11 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.type.EsqlDataTypes;
+import java.io.IOException;
import java.time.ZoneId;
import java.util.List;
import java.util.function.Function;
@@ -38,6 +44,11 @@
import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.dateTimeToLong;
public class DateParse extends EsqlScalarFunction implements OptionalArgument {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
+ Expression.class,
+ "DateParse",
+ DateParse::new
+ );
private final Expression field;
private final Expression format;
@@ -64,6 +75,26 @@ public DateParse(
this.format = second != null ? first : null;
}
+ private DateParse(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readOptionalWriteable(i -> ((PlanStreamInput) i).readExpression())
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeOptionalWriteable(children().size() == 2 ? o -> ((PlanStreamOutput) out).writeExpression(children().get(1)) : null);
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
return DataType.DATETIME;
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTrunc.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTrunc.java
index ddd51d281105d..995e525dda9ec 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTrunc.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTrunc.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import org.elasticsearch.common.Rounding;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
@@ -20,8 +23,11 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.type.EsqlDataTypes;
+import java.io.IOException;
import java.time.Duration;
import java.time.Period;
import java.time.ZoneId;
@@ -36,6 +42,12 @@
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType;
public class DateTrunc extends EsqlScalarFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
+ Expression.class,
+ "DateTrunc",
+ DateTrunc::new
+ );
+
private final Expression interval;
private final Expression timestampField;
protected static final ZoneId DEFAULT_TZ = ZoneOffset.UTC;
@@ -69,6 +81,30 @@ public DateTrunc(
this.timestampField = field;
}
+ private DateTrunc(StreamInput in) throws IOException {
+ this(Source.readFrom((PlanStreamInput) in), ((PlanStreamInput) in).readExpression(), ((PlanStreamInput) in).readExpression());
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(interval);
+ ((PlanStreamOutput) out).writeExpression(timestampField);
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
+ Expression interval() {
+ return interval;
+ }
+
+ Expression field() {
+ return timestampField;
+ }
+
@Override
protected TypeResolution resolveType() {
if (childrenResolved() == false) {
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/Now.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/Now.java
index fe54cfd186fec..0f401e3de8045 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/Now.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/Now.java
@@ -7,6 +7,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
@@ -18,11 +21,14 @@
import org.elasticsearch.xpack.esql.expression.function.Example;
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlConfigurationFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import java.io.IOException;
import java.util.List;
import java.util.function.Function;
public class Now extends EsqlConfigurationFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Now", Now::new);
private final long now;
@@ -38,13 +44,18 @@ public Now(Source source, Configuration configuration) {
this.now = configuration.now() == null ? System.currentTimeMillis() : configuration.now().toInstant().toEpochMilli();
}
- private Now(Source source, long now) {
- super(source, List.of(), null);
- this.now = now;
+ private Now(StreamInput in) throws IOException {
+ this(Source.readFrom((PlanStreamInput) in), ((PlanStreamInput) in).configuration());
}
- public static Now newInstance(Source source, long now) {
- return new Now(source, now);
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ Source.EMPTY.writeTo(out);
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
}
@Override
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/Coalesce.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/Coalesce.java
index ff7cd83eedbe2..6a02eb4b94f12 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/Coalesce.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/Coalesce.java
@@ -7,6 +7,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.nulls;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.data.Block;
import org.elasticsearch.compute.data.ElementType;
import org.elasticsearch.compute.data.Page;
@@ -27,19 +30,26 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
import org.elasticsearch.xpack.esql.planner.PlannerUtils;
+import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static org.elasticsearch.xpack.esql.core.type.DataType.NULL;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanReader.readerFromPlanReader;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanWriter.writerFromPlanWriter;
/**
* Function returning the first non-null value.
*/
public class Coalesce extends EsqlScalarFunction implements OptionalArgument {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Coalesce", Coalesce::new);
+
private DataType dataType;
@FunctionInfo(
@@ -100,6 +110,26 @@ public Coalesce(
super(source, Stream.concat(Stream.of(first), rest.stream()).toList());
}
+ private Coalesce(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeCollection(children().subList(1, children().size()), writerFromPlanWriter(PlanStreamOutput::writeExpression));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
if (dataType == null) {
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/Concat.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/Concat.java
index d01edbe7024e8..69464787f9288 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/Concat.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/Concat.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.string;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
import org.elasticsearch.compute.operator.BreakingBytesRefBuilder;
@@ -22,7 +25,10 @@
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput;
+import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
@@ -30,11 +36,14 @@
import static org.elasticsearch.common.unit.ByteSizeUnit.MB;
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT;
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanReader.readerFromPlanReader;
+import static org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.PlanWriter.writerFromPlanWriter;
/**
* Join strings.
*/
public class Concat extends EsqlScalarFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Concat", Concat::new);
static final long MAX_CONCAT_LENGTH = MB.toBytes(1);
@@ -51,6 +60,26 @@ public Concat(
super(source, Stream.concat(Stream.of(first), rest.stream()).toList());
}
+ private Concat(StreamInput in) throws IOException {
+ this(
+ Source.readFrom((PlanStreamInput) in),
+ ((PlanStreamInput) in).readExpression(),
+ in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
+ );
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ source().writeTo(out);
+ ((PlanStreamOutput) out).writeExpression(children().get(0));
+ out.writeCollection(children().subList(1, children().size()), writerFromPlanWriter(PlanStreamOutput::writeExpression));
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
return DataType.KEYWORD;
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLower.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLower.java
index f14df4f56929a..aadb0b3ac7886 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLower.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLower.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.string;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.lucene.BytesRefs;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
@@ -17,12 +20,15 @@
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
import org.elasticsearch.xpack.esql.core.tree.Source;
import org.elasticsearch.xpack.esql.core.type.DataType;
+import org.elasticsearch.xpack.esql.core.util.PlanStreamOutput;
import org.elasticsearch.xpack.esql.expression.function.Example;
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlConfigurationFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
import org.elasticsearch.xpack.esql.session.EsqlConfiguration;
+import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
@@ -31,6 +37,7 @@
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString;
public class ToLower extends EsqlConfigurationFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "ToLower", ToLower::new);
private final Expression field;
@@ -52,6 +59,20 @@ public ToLower(
this.field = field;
}
+ private ToLower(StreamInput in) throws IOException {
+ this(Source.EMPTY, ((PlanStreamInput) in).readExpression(), ((PlanStreamInput) in).configuration());
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ ((PlanStreamOutput) out).writeExpression(field());
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
return field.dataType();
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpper.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpper.java
index 6c903b4bfddeb..398fe1c76a49f 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpper.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpper.java
@@ -8,6 +8,9 @@
package org.elasticsearch.xpack.esql.expression.function.scalar.string;
import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.common.io.stream.StreamInput;
+import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.lucene.BytesRefs;
import org.elasticsearch.compute.ann.Evaluator;
import org.elasticsearch.compute.ann.Fixed;
@@ -17,12 +20,15 @@
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
import org.elasticsearch.xpack.esql.core.tree.Source;
import org.elasticsearch.xpack.esql.core.type.DataType;
+import org.elasticsearch.xpack.esql.core.util.PlanStreamOutput;
import org.elasticsearch.xpack.esql.expression.function.Example;
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
import org.elasticsearch.xpack.esql.expression.function.Param;
import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlConfigurationFunction;
+import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput;
import org.elasticsearch.xpack.esql.session.EsqlConfiguration;
+import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
@@ -31,6 +37,7 @@
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString;
public class ToUpper extends EsqlConfigurationFunction {
+ public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "ToUpper", ToUpper::new);
private final Expression field;
@@ -52,6 +59,20 @@ public ToUpper(
this.field = field;
}
+ private ToUpper(StreamInput in) throws IOException {
+ this(Source.EMPTY, ((PlanStreamInput) in).readExpression(), ((PlanStreamInput) in).configuration());
+ }
+
+ @Override
+ public void writeTo(StreamOutput out) throws IOException {
+ ((PlanStreamOutput) out).writeExpression(field());
+ }
+
+ @Override
+ public String getWriteableName() {
+ return ENTRY.name;
+ }
+
@Override
public DataType dataType() {
return field.dataType();
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
index 831d105a89076..74e8661596e41 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
@@ -62,16 +62,8 @@
import org.elasticsearch.xpack.esql.expression.function.aggregate.Values;
import org.elasticsearch.xpack.esql.expression.function.grouping.Bucket;
import org.elasticsearch.xpack.esql.expression.function.grouping.GroupingFunction;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
import org.elasticsearch.xpack.esql.expression.function.scalar.UnaryScalarFunction;
-import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Case;
-import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Greatest;
-import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Least;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.DateDiff;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.DateExtract;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.DateFormat;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.DateParse;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.DateTrunc;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.Now;
import org.elasticsearch.xpack.esql.expression.function.scalar.ip.CIDRMatch;
import org.elasticsearch.xpack.esql.expression.function.scalar.ip.IpPrefix;
import org.elasticsearch.xpack.esql.expression.function.scalar.math.Atan2;
@@ -82,13 +74,11 @@
import org.elasticsearch.xpack.esql.expression.function.scalar.math.Round;
import org.elasticsearch.xpack.esql.expression.function.scalar.math.Tau;
import org.elasticsearch.xpack.esql.expression.function.scalar.multivalue.AbstractMultivalueFunction;
-import org.elasticsearch.xpack.esql.expression.function.scalar.nulls.Coalesce;
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialContains;
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialDisjoint;
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialIntersects;
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesFunction;
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialWithin;
-import org.elasticsearch.xpack.esql.expression.function.scalar.string.Concat;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.EndsWith;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.Left;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.Locate;
@@ -99,13 +89,10 @@
import org.elasticsearch.xpack.esql.expression.function.scalar.string.Split;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.StartsWith;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.Substring;
-import org.elasticsearch.xpack.esql.expression.function.scalar.string.ToLower;
-import org.elasticsearch.xpack.esql.expression.function.scalar.string.ToUpper;
import org.elasticsearch.xpack.esql.expression.function.scalar.string.WildcardLike;
import org.elasticsearch.xpack.esql.expression.predicate.operator.arithmetic.EsqlArithmeticOperation;
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.EsqlBinaryComparison;
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.In;
-import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.InsensitiveEquals;
import org.elasticsearch.xpack.esql.plan.logical.Aggregate;
import org.elasticsearch.xpack.esql.plan.logical.Dissect;
import org.elasticsearch.xpack.esql.plan.logical.Dissect.Parser;
@@ -246,27 +233,12 @@ public static List namedTypeEntries() {
// BinaryLogic
of(BinaryLogic.class, And.class, PlanNamedTypes::writeBinaryLogic, PlanNamedTypes::readBinaryLogic),
of(BinaryLogic.class, Or.class, PlanNamedTypes::writeBinaryLogic, PlanNamedTypes::readBinaryLogic),
- // UnaryScalarFunction
- of(QL_UNARY_SCLR_CLS, IsNotNull.class, PlanNamedTypes::writeQLUnaryScalar, PlanNamedTypes::readQLUnaryScalar),
- of(QL_UNARY_SCLR_CLS, IsNull.class, PlanNamedTypes::writeQLUnaryScalar, PlanNamedTypes::readQLUnaryScalar),
- of(QL_UNARY_SCLR_CLS, Not.class, PlanNamedTypes::writeQLUnaryScalar, PlanNamedTypes::readQLUnaryScalar),
// ScalarFunction
of(ScalarFunction.class, Atan2.class, PlanNamedTypes::writeAtan2, PlanNamedTypes::readAtan2),
- of(ScalarFunction.class, Case.class, PlanNamedTypes::writeVararg, PlanNamedTypes::readVarag),
of(ScalarFunction.class, CIDRMatch.class, PlanNamedTypes::writeCIDRMatch, PlanNamedTypes::readCIDRMatch),
- of(ScalarFunction.class, Coalesce.class, PlanNamedTypes::writeVararg, PlanNamedTypes::readVarag),
- of(ScalarFunction.class, Concat.class, PlanNamedTypes::writeVararg, PlanNamedTypes::readVarag),
- of(ScalarFunction.class, DateDiff.class, PlanNamedTypes::writeDateDiff, PlanNamedTypes::readDateDiff),
- of(ScalarFunction.class, DateExtract.class, PlanNamedTypes::writeDateExtract, PlanNamedTypes::readDateExtract),
- of(ScalarFunction.class, DateFormat.class, PlanNamedTypes::writeDateFormat, PlanNamedTypes::readDateFormat),
- of(ScalarFunction.class, DateParse.class, PlanNamedTypes::writeDateTimeParse, PlanNamedTypes::readDateTimeParse),
- of(ScalarFunction.class, DateTrunc.class, PlanNamedTypes::writeDateTrunc, PlanNamedTypes::readDateTrunc),
of(ScalarFunction.class, E.class, PlanNamedTypes::writeNoArgScalar, PlanNamedTypes::readNoArgScalar),
- of(ScalarFunction.class, Greatest.class, PlanNamedTypes::writeVararg, PlanNamedTypes::readVarag),
of(ScalarFunction.class, IpPrefix.class, (out, prefix) -> prefix.writeTo(out), IpPrefix::readFrom),
- of(ScalarFunction.class, Least.class, PlanNamedTypes::writeVararg, PlanNamedTypes::readVarag),
of(ScalarFunction.class, Log.class, PlanNamedTypes::writeLog, PlanNamedTypes::readLog),
- of(ScalarFunction.class, Now.class, PlanNamedTypes::writeNow, PlanNamedTypes::readNow),
of(ScalarFunction.class, Pi.class, PlanNamedTypes::writeNoArgScalar, PlanNamedTypes::readNoArgScalar),
of(ScalarFunction.class, Round.class, PlanNamedTypes::writeRound, PlanNamedTypes::readRound),
of(ScalarFunction.class, Pow.class, PlanNamedTypes::writePow, PlanNamedTypes::readPow),
@@ -284,8 +256,6 @@ public static List namedTypeEntries() {
of(ScalarFunction.class, Split.class, PlanNamedTypes::writeSplit, PlanNamedTypes::readSplit),
of(ScalarFunction.class, Tau.class, PlanNamedTypes::writeNoArgScalar, PlanNamedTypes::readNoArgScalar),
of(ScalarFunction.class, Replace.class, PlanNamedTypes::writeReplace, PlanNamedTypes::readReplace),
- of(ScalarFunction.class, ToLower.class, PlanNamedTypes::writeToLower, PlanNamedTypes::readToLower),
- of(ScalarFunction.class, ToUpper.class, PlanNamedTypes::writeToUpper, PlanNamedTypes::readToUpper),
// GroupingFunctions
of(GroupingFunction.class, Bucket.class, PlanNamedTypes::writeBucket, PlanNamedTypes::readBucket),
// AggregateFunctions
@@ -309,10 +279,11 @@ public static List namedTypeEntries() {
AbstractMultivalueFunction.getNamedWriteables(),
EsqlArithmeticOperation.getNamedWriteables(),
EsqlBinaryComparison.getNamedWriteables(),
+ EsqlScalarFunction.getNamedWriteables(),
FullTextPredicate.getNamedWriteables(),
NamedExpression.getNamedWriteables(),
UnaryScalarFunction.getNamedWriteables(),
- List.of(UnsupportedAttribute.ENTRY, InsensitiveEquals.ENTRY, Literal.ENTRY, org.elasticsearch.xpack.esql.expression.Order.ENTRY)
+ List.of(UnsupportedAttribute.ENTRY, Literal.ENTRY, org.elasticsearch.xpack.esql.expression.Order.ENTRY)
)) {
for (NamedWriteableRegistry.Entry e : ee) {
entries.add(of(Expression.class, e));
@@ -1081,32 +1052,6 @@ static void writeBucket(PlanStreamOutput out, Bucket bucket) throws IOException
out.writeOptionalExpression(bucket.to());
}
- static final Map, ScalarFunction>> VARARG_CTORS = Map.ofEntries(
- entry(name(Case.class), Case::new),
- entry(name(Coalesce.class), Coalesce::new),
- entry(name(Concat.class), Concat::new),
- entry(name(Greatest.class), Greatest::new),
- entry(name(Least.class), Least::new)
- );
-
- static ScalarFunction readVarag(PlanStreamInput in, String name) throws IOException {
- return VARARG_CTORS.get(name)
- .apply(
- Source.readFrom(in),
- in.readExpression(),
- in.readCollectionAsList(readerFromPlanReader(PlanStreamInput::readExpression))
- );
- }
-
- static void writeVararg(PlanStreamOutput out, ScalarFunction vararg) throws IOException {
- vararg.source().writeTo(out);
- out.writeExpression(vararg.children().get(0));
- out.writeCollection(
- vararg.children().subList(1, vararg.children().size()),
- writerFromPlanWriter(PlanStreamOutput::writeExpression)
- );
- }
-
static CountDistinct readCountDistinct(PlanStreamInput in) throws IOException {
return new CountDistinct(Source.readFrom(in), in.readExpression(), in.readOptionalNamed(Expression.class));
}
@@ -1119,67 +1064,6 @@ static void writeCountDistinct(PlanStreamOutput out, CountDistinct countDistinct
out.writeOptionalWriteable(fields.size() == 2 ? o -> out.writeExpression(fields.get(1)) : null);
}
- static DateDiff readDateDiff(PlanStreamInput in) throws IOException {
- return new DateDiff(Source.readFrom(in), in.readExpression(), in.readExpression(), in.readExpression());
- }
-
- static void writeDateDiff(PlanStreamOutput out, DateDiff function) throws IOException {
- Source.EMPTY.writeTo(out);
- List fields = function.children();
- assert fields.size() == 3;
- out.writeExpression(fields.get(0));
- out.writeExpression(fields.get(1));
- out.writeExpression(fields.get(2));
- }
-
- static DateExtract readDateExtract(PlanStreamInput in) throws IOException {
- return new DateExtract(Source.readFrom(in), in.readExpression(), in.readExpression(), in.configuration());
- }
-
- static void writeDateExtract(PlanStreamOutput out, DateExtract function) throws IOException {
- function.source().writeTo(out);
- List fields = function.children();
- assert fields.size() == 2;
- out.writeExpression(fields.get(0));
- out.writeExpression(fields.get(1));
- }
-
- static DateFormat readDateFormat(PlanStreamInput in) throws IOException {
- return new DateFormat(Source.readFrom(in), in.readExpression(), in.readOptionalNamed(Expression.class), in.configuration());
- }
-
- static void writeDateFormat(PlanStreamOutput out, DateFormat dateFormat) throws IOException {
- dateFormat.source().writeTo(out);
- List fields = dateFormat.children();
- assert fields.size() == 1 || fields.size() == 2;
- out.writeExpression(fields.get(0));
- out.writeOptionalWriteable(fields.size() == 2 ? o -> out.writeExpression(fields.get(1)) : null);
- }
-
- static DateParse readDateTimeParse(PlanStreamInput in) throws IOException {
- return new DateParse(Source.readFrom(in), in.readExpression(), in.readOptionalNamed(Expression.class));
- }
-
- static void writeDateTimeParse(PlanStreamOutput out, DateParse function) throws IOException {
- function.source().writeTo(out);
- List fields = function.children();
- assert fields.size() == 1 || fields.size() == 2;
- out.writeExpression(fields.get(0));
- out.writeOptionalWriteable(fields.size() == 2 ? o -> out.writeExpression(fields.get(1)) : null);
- }
-
- static DateTrunc readDateTrunc(PlanStreamInput in) throws IOException {
- return new DateTrunc(Source.readFrom(in), in.readExpression(), in.readExpression());
- }
-
- static void writeDateTrunc(PlanStreamOutput out, DateTrunc dateTrunc) throws IOException {
- dateTrunc.source().writeTo(out);
- List fields = dateTrunc.children();
- assert fields.size() == 2;
- out.writeExpression(fields.get(0));
- out.writeExpression(fields.get(1));
- }
-
static SpatialIntersects readIntersects(PlanStreamInput in) throws IOException {
return new SpatialIntersects(Source.EMPTY, in.readExpression(), in.readExpression());
}
@@ -1201,14 +1085,6 @@ static void writeSpatialRelatesFunction(PlanStreamOutput out, SpatialRelatesFunc
out.writeExpression(spatialRelatesFunction.right());
}
- static Now readNow(PlanStreamInput in) throws IOException {
- return new Now(Source.readFrom(in), in.configuration());
- }
-
- static void writeNow(PlanStreamOutput out, Now function) throws IOException {
- Source.EMPTY.writeTo(out);
- }
-
static Round readRound(PlanStreamInput in) throws IOException {
return new Round(Source.readFrom(in), in.readExpression(), in.readOptionalNamed(Expression.class));
}
@@ -1303,22 +1179,6 @@ static void writeReplace(PlanStreamOutput out, Replace replace) throws IOExcepti
out.writeExpression(fields.get(2));
}
- static ToLower readToLower(PlanStreamInput in) throws IOException {
- return new ToLower(Source.EMPTY, in.readExpression(), in.configuration());
- }
-
- static void writeToLower(PlanStreamOutput out, ToLower toLower) throws IOException {
- out.writeExpression(toLower.field());
- }
-
- static ToUpper readToUpper(PlanStreamInput in) throws IOException {
- return new ToUpper(Source.EMPTY, in.readExpression(), in.configuration());
- }
-
- static void writeToUpper(PlanStreamOutput out, ToUpper toUpper) throws IOException {
- out.writeExpression(toUpper.field());
- }
-
static Left readLeft(PlanStreamInput in) throws IOException {
return new Left(Source.readFrom(in), in.readExpression(), in.readExpression());
}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractExpressionSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractExpressionSerializationTests.java
index 9b33af9f0a2e0..33f9cb3123b8d 100644
--- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractExpressionSerializationTests.java
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractExpressionSerializationTests.java
@@ -78,6 +78,10 @@ protected boolean alwaysEmptySource() {
protected abstract List getNamedWriteables();
+ public EsqlConfiguration configuration() {
+ return config;
+ }
+
@Override
protected final NamedWriteableRegistry getNamedWriteableRegistry() {
List entries = new ArrayList<>(NamedExpression.getNamedWriteables());
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractVarargsSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractVarargsSerializationTests.java
new file mode 100644
index 0000000000000..67195fa99114b
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/AbstractVarargsSerializationTests.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression;
+
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+
+import java.io.IOException;
+import java.util.List;
+
+public abstract class AbstractVarargsSerializationTests extends AbstractExpressionSerializationTests {
+ protected abstract T create(Source source, Expression first, List rest);
+
+ @Override
+ protected final T createTestInstance() {
+ Source source = randomSource();
+ Expression first = randomChild();
+ List rest = randomList(0, 10, AbstractExpressionSerializationTests::randomChild);
+ return create(source, first, rest);
+ }
+
+ @Override
+ protected final T mutateInstance(T instance) throws IOException {
+ Source source = instance.source();
+ Expression first = instance.children().get(0);
+ List rest = instance.children().subList(1, instance.children().size());
+ if (randomBoolean()) {
+ first = randomValueOtherThan(first, AbstractExpressionSerializationTests::randomChild);
+ } else {
+ rest = randomValueOtherThan(rest, () -> randomList(0, 10, AbstractExpressionSerializationTests::randomChild));
+ }
+ return create(instance.source(), first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/NotSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/NotSerializationTests.java
new file mode 100644
index 0000000000000..61e3690f1633f
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/NotSerializationTests.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Not;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+
+import java.io.IOException;
+import java.util.List;
+
+public class NotSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return UnaryScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Not createTestInstance() {
+ return new Not(randomSource(), randomChild());
+ }
+
+ @Override
+ protected Not mutateInstance(Not instance) throws IOException {
+ Source source = instance.source();
+ Expression child = randomValueOtherThan(instance.field(), AbstractExpressionSerializationTests::randomChild);
+ return new Not(source, child);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseSerializationTests.java
new file mode 100644
index 0000000000000..69bbf2f76937f
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/CaseSerializationTests.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractVarargsSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.util.List;
+
+public class CaseSerializationTests extends AbstractVarargsSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Case create(Source source, Expression first, List rest) {
+ return new Case(source, first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/GreatestSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/GreatestSerializationTests.java
new file mode 100644
index 0000000000000..43e1fe405911a
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/GreatestSerializationTests.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractVarargsSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.util.List;
+
+public class GreatestSerializationTests extends AbstractVarargsSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Greatest create(Source source, Expression first, List rest) {
+ return new Greatest(source, first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/LeastSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/LeastSerializationTests.java
new file mode 100644
index 0000000000000..f552713af4dbe
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/conditional/LeastSerializationTests.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.conditional;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractVarargsSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.util.List;
+
+public class LeastSerializationTests extends AbstractVarargsSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Least create(Source source, Expression first, List rest) {
+ return new Least(source, first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiffSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiffSerializationTests.java
new file mode 100644
index 0000000000000..b1dc1b064ae5a
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateDiffSerializationTests.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DateDiffSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected DateDiff createTestInstance() {
+ Source source = randomSource();
+ Expression unit = randomChild();
+ Expression startTimestamp = randomChild();
+ Expression endTimestamp = randomChild();
+ return new DateDiff(source, unit, startTimestamp, endTimestamp);
+ }
+
+ @Override
+ protected DateDiff mutateInstance(DateDiff instance) throws IOException {
+ Source source = instance.source();
+ Expression unit = instance.unit();
+ Expression startTimestamp = instance.startTimestamp();
+ Expression endTimestamp = instance.endTimestamp();
+ switch (between(0, 2)) {
+ case 0 -> unit = randomValueOtherThan(unit, AbstractExpressionSerializationTests::randomChild);
+ case 1 -> startTimestamp = randomValueOtherThan(startTimestamp, AbstractExpressionSerializationTests::randomChild);
+ case 2 -> endTimestamp = randomValueOtherThan(endTimestamp, AbstractExpressionSerializationTests::randomChild);
+ }
+ return new DateDiff(source, unit, startTimestamp, endTimestamp);
+ }
+
+ @Override
+ protected boolean alwaysEmptySource() {
+ return true;
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtractSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtractSerializationTests.java
new file mode 100644
index 0000000000000..6e1c061c84f2e
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateExtractSerializationTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DateExtractSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected DateExtract createTestInstance() {
+ Source source = randomSource();
+ Expression datePart = randomChild();
+ Expression field = randomChild();
+ return new DateExtract(source, datePart, field, configuration());
+ }
+
+ @Override
+ protected DateExtract mutateInstance(DateExtract instance) throws IOException {
+ Source source = instance.source();
+ Expression datePart = instance.datePart();
+ Expression field = instance.field();
+ if (randomBoolean()) {
+ datePart = randomValueOtherThan(field, AbstractExpressionSerializationTests::randomChild);
+ } else {
+ field = randomValueOtherThan(field, AbstractExpressionSerializationTests::randomChild);
+ }
+ return new DateExtract(source, datePart, field, configuration());
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormatSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormatSerializationTests.java
new file mode 100644
index 0000000000000..4dff735318558
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateFormatSerializationTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DateFormatSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected DateFormat createTestInstance() {
+ Source source = randomSource();
+ Expression field = randomChild();
+ Expression format = randomBoolean() ? null : randomChild();
+ return new DateFormat(source, field, format, configuration());
+ }
+
+ @Override
+ protected DateFormat mutateInstance(DateFormat instance) throws IOException {
+ Source source = instance.source();
+ Expression field = instance.field();
+ Expression format = instance.format();
+ if (randomBoolean()) {
+ field = randomValueOtherThan(field, AbstractExpressionSerializationTests::randomChild);
+ } else {
+ format = randomValueOtherThan(format, () -> randomBoolean() ? null : randomChild());
+ }
+ return new DateFormat(source, field, format, configuration());
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParseSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParseSerializationTests.java
new file mode 100644
index 0000000000000..e816f2c4a20fb
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateParseSerializationTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DateParseSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected DateParse createTestInstance() {
+ Source source = randomSource();
+ Expression first = randomChild();
+ Expression second = randomBoolean() ? null : randomChild();
+ return new DateParse(source, first, second);
+ }
+
+ @Override
+ protected DateParse mutateInstance(DateParse instance) throws IOException {
+ Source source = instance.source();
+ Expression first = instance.children().get(0);
+ Expression second = instance.children().size() == 1 ? null : instance.children().get(1);
+ if (randomBoolean()) {
+ first = randomValueOtherThan(first, AbstractExpressionSerializationTests::randomChild);
+ } else {
+ second = randomValueOtherThan(second, () -> randomBoolean() ? null : randomChild());
+ }
+ return new DateParse(source, first, second);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTruncSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTruncSerializationTests.java
new file mode 100644
index 0000000000000..09d2e06003128
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/DateTruncSerializationTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DateTruncSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected DateTrunc createTestInstance() {
+ Source source = randomSource();
+ Expression interval = randomChild();
+ Expression field = randomChild();
+ return new DateTrunc(source, interval, field);
+ }
+
+ @Override
+ protected DateTrunc mutateInstance(DateTrunc instance) throws IOException {
+ Source source = instance.source();
+ Expression interval = instance.interval();
+ Expression field = instance.field();
+ if (randomBoolean()) {
+ interval = randomValueOtherThan(interval, AbstractExpressionSerializationTests::randomChild);
+ } else {
+ field = randomValueOtherThan(field, AbstractExpressionSerializationTests::randomChild);
+ }
+ return new DateTrunc(source, interval, field);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowSerializationTests.java
new file mode 100644
index 0000000000000..3bb8c2f260561
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowSerializationTests.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class NowSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Now createTestInstance() {
+ return new Now(randomSource(), configuration());
+ }
+
+ @Override
+ protected Now mutateInstance(Now instance) throws IOException {
+ return null;
+ }
+
+ @Override
+ protected boolean alwaysEmptySource() {
+ return true;
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/NowTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowTests.java
similarity index 97%
rename from x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/NowTests.java
rename to x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowTests.java
index 2c1322abf8cda..8edc21db427d2 100644
--- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/math/NowTests.java
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/date/NowTests.java
@@ -5,7 +5,7 @@
* 2.0.
*/
-package org.elasticsearch.xpack.esql.expression.function.scalar.math;
+package org.elasticsearch.xpack.esql.expression.function.scalar.date;
import com.carrotsearch.randomizedtesting.annotations.Name;
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
@@ -18,7 +18,6 @@
import org.elasticsearch.xpack.esql.core.type.DataType;
import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier;
import org.elasticsearch.xpack.esql.expression.function.scalar.AbstractConfigurationFunctionTestCase;
-import org.elasticsearch.xpack.esql.expression.function.scalar.date.Now;
import org.elasticsearch.xpack.esql.session.EsqlConfiguration;
import org.hamcrest.Matcher;
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/CoalesceSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/CoalesceSerializationTests.java
new file mode 100644
index 0000000000000..7cab0a957b235
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/CoalesceSerializationTests.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.nulls;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractVarargsSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.util.List;
+
+public class CoalesceSerializationTests extends AbstractVarargsSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Coalesce create(Source source, Expression first, List rest) {
+ return new Coalesce(source, first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNotNullSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNotNullSerializationTests.java
new file mode 100644
index 0000000000000..23545b3627a1a
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNotNullSerializationTests.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.nulls;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.expression.predicate.nulls.IsNotNull;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.UnaryScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class IsNotNullSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return UnaryScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected IsNotNull createTestInstance() {
+ return new IsNotNull(randomSource(), randomChild());
+ }
+
+ @Override
+ protected IsNotNull mutateInstance(IsNotNull instance) throws IOException {
+ Source source = instance.source();
+ Expression child = randomValueOtherThan(instance.field(), AbstractExpressionSerializationTests::randomChild);
+ return new IsNotNull(source, child);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullSerializationTests.java
new file mode 100644
index 0000000000000..354a2129d7ec0
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/IsNullSerializationTests.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.nulls;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.expression.predicate.nulls.IsNull;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.UnaryScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class IsNullSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return UnaryScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected IsNull createTestInstance() {
+ return new IsNull(randomSource(), randomChild());
+ }
+
+ @Override
+ protected IsNull mutateInstance(IsNull instance) throws IOException {
+ Source source = instance.source();
+ Expression child = randomValueOtherThan(instance.field(), AbstractExpressionSerializationTests::randomChild);
+ return new IsNull(source, child);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ConcatSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ConcatSerializationTests.java
new file mode 100644
index 0000000000000..30f6acffbaf8a
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ConcatSerializationTests.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.string;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractVarargsSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.util.List;
+
+public class ConcatSerializationTests extends AbstractVarargsSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected Concat create(Source source, Expression first, List rest) {
+ return new Concat(source, first, rest);
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLowerSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLowerSerializationTests.java
new file mode 100644
index 0000000000000..f2dbdbd74470a
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLowerSerializationTests.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.string;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class ToLowerSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected ToLower createTestInstance() {
+ return new ToLower(randomSource(), randomChild(), configuration());
+ }
+
+ @Override
+ protected ToLower mutateInstance(ToLower instance) throws IOException {
+ Source source = instance.source();
+ Expression child = randomValueOtherThan(instance.field(), AbstractExpressionSerializationTests::randomChild);
+ return new ToLower(source, child, configuration());
+ }
+
+ @Override
+ protected boolean alwaysEmptySource() {
+ return true;
+ }
+}
diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpperSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpperSerializationTests.java
new file mode 100644
index 0000000000000..e57aedd79fdfd
--- /dev/null
+++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToUpperSerializationTests.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.xpack.esql.expression.function.scalar.string;
+
+import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
+import org.elasticsearch.xpack.esql.core.expression.Expression;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.AbstractExpressionSerializationTests;
+import org.elasticsearch.xpack.esql.expression.function.scalar.EsqlScalarFunction;
+
+import java.io.IOException;
+import java.util.List;
+
+public class ToUpperSerializationTests extends AbstractExpressionSerializationTests {
+ @Override
+ protected List getNamedWriteables() {
+ return EsqlScalarFunction.getNamedWriteables();
+ }
+
+ @Override
+ protected ToUpper createTestInstance() {
+ return new ToUpper(randomSource(), randomChild(), configuration());
+ }
+
+ @Override
+ protected ToUpper mutateInstance(ToUpper instance) throws IOException {
+ Source source = instance.source();
+ Expression child = randomValueOtherThan(instance.field(), AbstractExpressionSerializationTests::randomChild);
+ return new ToUpper(source, child, configuration());
+ }
+
+ @Override
+ protected boolean alwaysEmptySource() {
+ return true;
+ }
+}