From e7cdfeeb2c6af386ae1d9d13c460485b25407652 Mon Sep 17 00:00:00 2001 From: Mikel Vuka Date: Thu, 19 Oct 2023 04:39:16 +0200 Subject: [PATCH] feat: Add week time grain for Elasticsearch datasets (#25683) Co-authored-by: Mikel Vuka --- superset/db_engine_specs/elasticsearch.py | 1 + .../db_engine_specs/elasticsearch_tests.py | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/integration_tests/db_engine_specs/elasticsearch_tests.py diff --git a/superset/db_engine_specs/elasticsearch.py b/superset/db_engine_specs/elasticsearch.py index ae6d9b9628b33..4f18397d8c716 100644 --- a/superset/db_engine_specs/elasticsearch.py +++ b/superset/db_engine_specs/elasticsearch.py @@ -46,6 +46,7 @@ class ElasticSearchEngineSpec(BaseEngineSpec): # pylint: disable=abstract-metho TimeGrain.MINUTE: "HISTOGRAM({col}, INTERVAL 1 MINUTE)", TimeGrain.HOUR: "HISTOGRAM({col}, INTERVAL 1 HOUR)", TimeGrain.DAY: "HISTOGRAM({col}, INTERVAL 1 DAY)", + TimeGrain.WEEK: "DATE_TRUNC('week', {col})", TimeGrain.MONTH: "HISTOGRAM({col}, INTERVAL 1 MONTH)", TimeGrain.YEAR: "HISTOGRAM({col}, INTERVAL 1 YEAR)", } diff --git a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py new file mode 100644 index 0000000000000..7140e10ee13cb --- /dev/null +++ b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from sqlalchemy import column + +from superset.db_engine_specs.elasticsearch import ElasticSearchEngineSpec +from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec + + +class TestElasticsearchDbEngineSpec(TestDbEngineSpec): + def test_time_grain_week_expression(self): + col = column("ts") + col.type = "datetime" + expected_time_grain_expression = "DATE_TRUNC('week', ts)" + actual = ElasticSearchEngineSpec.get_timestamp_expr( + col=col, pdf=None, time_grain="P1W" + ) + self.assertEqual(str(actual), expected_time_grain_expression) + + def test_time_grain_hour_expression(self): + col = column("ts") + col.type = "datetime" + expected_time_grain_expression = "HISTOGRAM(ts, INTERVAL 1 HOUR)" + actual = ElasticSearchEngineSpec.get_timestamp_expr( + col=col, pdf=None, time_grain="PT1H" + ) + self.assertEqual(str(actual), expected_time_grain_expression)