From 645b078ec0c84c31a7826c0f1021d0f306830a95 Mon Sep 17 00:00:00 2001 From: Mikel Vuka Date: Tue, 17 Oct 2023 23:09:50 +0200 Subject: [PATCH 1/4] feat: add week time grain for elasticsearch --- superset/db_engine_specs/elasticsearch.py | 1 + .../db_engine_specs/elasticsearch_tests.py | 66 +++++++++++++++++++ 2 files changed, 67 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..c7a51e704bdc9 --- /dev/null +++ b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py @@ -0,0 +1,66 @@ +# 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. +import unittest.mock as mock + +import pytest +from pandas import DataFrame +from sqlalchemy import column + +from superset.connectors.sqla.models import TableColumn +from superset.db_engine_specs.base import BaseEngineSpec +from superset.db_engine_specs.elasticsearch import ElasticSearchEngineSpec +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.sql_parse import Table +from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +from tests.integration_tests.fixtures.birth_names_dashboard import ( + load_birth_names_dashboard_with_slices, + load_birth_names_data, +) + + +class TestElasticsearchDbEngineSpec(TestDbEngineSpec): + def test_timegrain_week_expression(self): + """ + DB Eng Specs (elasticsearch): Test time grain expressions + """ + col = column("ts") + test_cases = { + "date": "DATE_TRUNC('week', ts)", + "date_nanos": "DATE_TRUNC('week', ts)", + } + for type_, expected in test_cases.items(): + col.type = type_ + actual = ElasticSearchEngineSpec.get_timestamp_expr( + col=col, pdf=None, time_grain="P1W" + ) + self.assertEqual(str(actual), expected) + + def test_timegrain_hour_expression(self): + """ + DB Eng Specs (elasticsearch): Test time grain expressions + """ + col = column("ts") + test_cases = { + "date": "HISTOGRAM(ts, INTERVAL 1 HOUR)", + "date_nanos": "HISTOGRAM(ts, INTERVAL 1 HOUR)", + } + for type_, expected in test_cases.items(): + col.type = type_ + actual = ElasticSearchEngineSpec.get_timestamp_expr( + col=col, pdf=None, time_grain="PT1H" + ) + self.assertEqual(str(actual), expected) From 73e71b472fc5a94616d5f53e3713ef8d0af25d5d Mon Sep 17 00:00:00 2001 From: Mikel Vuka Date: Tue, 17 Oct 2023 23:17:31 +0200 Subject: [PATCH 2/4] feat: remove unused imports from test --- .../db_engine_specs/elasticsearch_tests.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py index c7a51e704bdc9..37b6e1c0ed5fe 100644 --- a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py +++ b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py @@ -14,22 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import unittest.mock as mock - -import pytest -from pandas import DataFrame from sqlalchemy import column - -from superset.connectors.sqla.models import TableColumn -from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.elasticsearch import ElasticSearchEngineSpec -from superset.errors import ErrorLevel, SupersetError, SupersetErrorType -from superset.sql_parse import Table from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec -from tests.integration_tests.fixtures.birth_names_dashboard import ( - load_birth_names_dashboard_with_slices, - load_birth_names_data, -) class TestElasticsearchDbEngineSpec(TestDbEngineSpec): From e07d2ddf258a6b6cacffda54ac8cb4334242805a Mon Sep 17 00:00:00 2001 From: Mikel Vuka Date: Wed, 18 Oct 2023 23:06:37 +0200 Subject: [PATCH 3/4] feat: fix pre-commit --- tests/integration_tests/db_engine_specs/elasticsearch_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py index 37b6e1c0ed5fe..e2a990ec2386c 100644 --- a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py +++ b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py @@ -15,6 +15,7 @@ # 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 From 164820ce4469d6307afa59f519c666cefbfbec41 Mon Sep 17 00:00:00 2001 From: Mikel Vuka Date: Thu, 19 Oct 2023 00:28:07 +0200 Subject: [PATCH 4/4] feat: fix tests --- .../db_engine_specs/elasticsearch_tests.py | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py index e2a990ec2386c..7140e10ee13cb 100644 --- a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py +++ b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py @@ -21,34 +21,20 @@ class TestElasticsearchDbEngineSpec(TestDbEngineSpec): - def test_timegrain_week_expression(self): - """ - DB Eng Specs (elasticsearch): Test time grain expressions - """ + def test_time_grain_week_expression(self): col = column("ts") - test_cases = { - "date": "DATE_TRUNC('week', ts)", - "date_nanos": "DATE_TRUNC('week', ts)", - } - for type_, expected in test_cases.items(): - col.type = type_ - actual = ElasticSearchEngineSpec.get_timestamp_expr( - col=col, pdf=None, time_grain="P1W" - ) - self.assertEqual(str(actual), expected) + 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_timegrain_hour_expression(self): - """ - DB Eng Specs (elasticsearch): Test time grain expressions - """ + def test_time_grain_hour_expression(self): col = column("ts") - test_cases = { - "date": "HISTOGRAM(ts, INTERVAL 1 HOUR)", - "date_nanos": "HISTOGRAM(ts, INTERVAL 1 HOUR)", - } - for type_, expected in test_cases.items(): - col.type = type_ - actual = ElasticSearchEngineSpec.get_timestamp_expr( - col=col, pdf=None, time_grain="PT1H" - ) - self.assertEqual(str(actual), expected) + 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)