diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2586551a9..50e403f78 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,7 +60,7 @@ Once your changes and tests are ready to submit for review: Ensure that all tests pass by running `make check-all`. This runs sequentially lint checks, unit tests and integration tests. These can be executed in isolation using `make lint`, `make test` and `make it` respectively, in case you need to iterate over a subset of tests. - Note: Integration tests are much slower than unit tests. + Note: Integration tests are much slower than unit tests and require `docker-compose`. 3. Sign the Contributor License Agreement diff --git a/docs/track.rst b/docs/track.rst index beb13ebf1..cab0d59df 100644 --- a/docs/track.rst +++ b/docs/track.rst @@ -3138,12 +3138,13 @@ The operation returns no meta-data. esql ~~~~~~~~~~~~~ -With the operation type ``esql`` you can execute `ES|QL query `_. +With the operation type ``esql`` you can execute an `ES|QL query `_. Properties """""""""" -* ``query`` (mandatory): An ES|QL query starts with a source command followed processing commands. +* ``query`` (mandatory): An ES|QL query which starts with a source command followed by processing commands. +* ``version`` (optional): The version of the ES|QL query language. Defaults to the first released version, ``2024.04.01``. See the docs for `available versions `_. * ``filter`` (optional): A query filter defined in `Elasticsearch query DSL `_. * ``body`` (optional): The query body. @@ -3153,6 +3154,7 @@ Example:: "name": "default", "operation-type": "esql", "query": "FROM logs-* | STATS count=count(*) BY agent.hostname | SORT count DESC | LIMIT 20", + "version": "2024.04.01", "filter": { "range": { "timestamp": { diff --git a/esrally/driver/runner.py b/esrally/driver/runner.py index 137bf4a4d..3f0058598 100644 --- a/esrally/driver/runner.py +++ b/esrally/driver/runner.py @@ -2892,6 +2892,7 @@ async def __call__(self, es, params): query = mandatory(params, "query", self) body = params.get("body", {}) body["query"] = query + body["version"] = params.get("version", "2024.04.01") query_filter = params.get("filter") if query_filter: body["filter"] = query_filter diff --git a/tests/driver/runner_test.py b/tests/driver/runner_test.py index 910c1de95..26dc70a6e 100644 --- a/tests/driver/runner_test.py +++ b/tests/driver/runner_test.py @@ -7686,7 +7686,7 @@ async def test_esql_without_query_filter(self, es): esql = runner.Esql() result = await esql(es, params={"query": "from logs-* | stats c = count(*)"}) assert result == {"weight": 1, "unit": "ops", "success": True} - expected_body = {"query": "from logs-* | stats c = count(*)"} + expected_body = {"query": "from logs-* | stats c = count(*)", "version": "2024.04.01"} es.perform_request.assert_awaited_once_with(method="POST", path="/_query", headers=None, body=expected_body, params={}) @mock.patch("elasticsearch.Elasticsearch") @@ -7698,7 +7698,7 @@ async def test_esql_with_query_filter(self, es): query_filter = {"range": {"@timestamp": {"gte": "2023"}}} result = await esql(es, params={"query": "from * | limit 1", "filter": query_filter}) assert result == {"weight": 1, "unit": "ops", "success": True} - expected_body = {"query": "from * | limit 1", "filter": query_filter} + expected_body = {"query": "from * | limit 1", "version": "2024.04.01", "filter": query_filter} es.perform_request.assert_awaited_once_with(method="POST", path="/_query", headers=None, body=expected_body, params={}) @mock.patch("elasticsearch.Elasticsearch") @@ -7711,5 +7711,16 @@ async def test_esql_with_body(self, es): result = await esql(es, params={"query": "from * | limit 1", "body": {"pragma": pragma}}) assert result == {"weight": 1, "unit": "ops", "success": True} - expected_body = {"pragma": pragma, "query": "from * | limit 1"} + expected_body = {"pragma": pragma, "query": "from * | limit 1", "version": "2024.04.01"} + es.perform_request.assert_awaited_once_with(method="POST", path="/_query", headers=None, body=expected_body, params={}) + + @mock.patch("elasticsearch.Elasticsearch") + @pytest.mark.asyncio + async def test_esql_with_version(self, es): + es.options.return_value = es + es.perform_request = mock.AsyncMock() + esql = runner.Esql() + result = await esql(es, params={"query": "from * | limit 1", "version": "wow"}) + assert result == {"weight": 1, "unit": "ops", "success": True} + expected_body = {"query": "from * | limit 1", "version": "wow"} es.perform_request.assert_awaited_once_with(method="POST", path="/_query", headers=None, body=expected_body, params={})