diff --git a/MIT_LICENSE.txt b/LICENSE.txt similarity index 100% rename from MIT_LICENSE.txt rename to LICENSE.txt diff --git a/dockerfile b/dockerfile index 8fee113..11586c8 100644 --- a/dockerfile +++ b/dockerfile @@ -51,7 +51,8 @@ RUN mkdir -p /${MELTANO_PROJ_ROOT}/data/dev/ \ && mkdir -p /${MELTANO_PROJ_ROOT}/data/prod/ \ && /${MELTANO_PROJ_ROOT}/${DUCKDB_CLI_FOLDER}/duckdb /${MELTANO_PROJ_ROOT}/data/dev/data.duckdb "select * from pg_tables;" \ && /${MELTANO_PROJ_ROOT}/${DUCKDB_CLI_FOLDER}/duckdb /${MELTANO_PROJ_ROOT}/data/test/data.duckdb "select * from pg_tables;" \ -&& /${MELTANO_PROJ_ROOT}/${DUCKDB_CLI_FOLDER}/duckdb /${MELTANO_PROJ_ROOT}/data/prod/data.duckdb "select * from pg_tables;" +&& /${MELTANO_PROJ_ROOT}/${DUCKDB_CLI_FOLDER}/duckdb /${MELTANO_PROJ_ROOT}/data/prod/data.duckdb "select * from pg_tables;" \ +&& meltano invoke dbt-duckdb:deps ###RUN chmod -R u+x /project/data/ diff --git a/meltano.yml b/meltano.yml index 7eab47e..eaab872 100644 --- a/meltano.yml +++ b/meltano.yml @@ -60,6 +60,18 @@ plugins: params: date: $ENV_DATE_GIE #date: '2023-02-15' + stream_maps: + stg_gie_storage: + key_hash: md5(config['hash_seed'] + (gasDayStart + code)) + #__alias__: stg_gie_storage_vX + stg_gie_company: + key_hash: md5(config['hash_seed'] + (gasDayStart + code)) + stg_gie_country: + key_hash: md5(config['hash_seed'] + (gasDayStart + code)) + stg_gie_region: + key_hash: md5(config['hash_seed'] + (gasDayStart + code)) + stream_map_config: + hash_seed: 01AWZh7A6DzGm6iJZZ2T streams: - name: stg_gie_storage path: /api @@ -132,7 +144,6 @@ plugins: pip_url: target-duckdb~=0.4 config: add_metadata_columns: true - #default_target_schema: gie_stage default_target_schema: main filepath: $DB_LOCATION data_flattening_max_level: 10 @@ -140,7 +151,6 @@ plugins: inherit_from: target-duckdb config: add_metadata_columns: true - #default_target_schema: usgs_stage default_target_schema: main filepath: $DB_LOCATION data_flattening_max_level: 10 @@ -149,7 +159,6 @@ plugins: inherit_from: target-duckdb config: add_metadata_columns: true - #default_target_schema: gie default_target_schema: main filepath: $DB_LOCATION data_flattening_max_level: 10 @@ -158,10 +167,6 @@ plugins: - name: airflow variant: apache pip_url: apache-airflow==2.1.2 --constraint https://raw.githubusercontent.com/apache/airflow/constraints-2.1.2/constraints-${MELTANO__PYTHON_VERSION}.txt -# transformers: -# - name: dbt-duckdb -# variant: jwills -# pip_url: dbt-core~=1.2.0 dbt-duckdb~=1.2.0 files: - name: files-airflow variant: meltano @@ -169,13 +174,11 @@ plugins: utilities: - name: superset variant: apache - #pip_url: apache-superset==1.5.0 markupsafe==2.0.1 duckdb-engine==0.6.4 pip_url: apache-superset==2.0.0 flask==2.0.3 werkzeug==2.0.3 jinja2==3.0.1 wtforms==2.3.3 git+https://github.com/meltano/superset-ext.git@main cryptography==3.4.7 markupsafe==2.0.1 duckdb-engine==0.7.0 - name: dbt-duckdb variant: jwills - #pip_url: dbt-core~=1.3.0 dbt-duckdb~=1.3.0 git+https://github.com/meltano/dbt-ext.git@main pip_url: dbt-core~=1.4.0 dbt-duckdb~=1.4.0 git+https://github.com/meltano/dbt-ext.git@main commands: usgs: @@ -188,12 +191,6 @@ jobs: tasks: - stg_usgs target-duckdb-usgs dbt-duckdb:usgs schedules: -#- name: USGS-Earthquake -# interval: 35 */1 * * * -# extractor: stg_usgs -# loader: target-duckdb-usgs -# transform: skip -# start_date: 2023-01-01 15:40:21.295936 - name: USGS-Earthquake interval: 35 */1 * * * job: usgs-to-duckdb-rpt diff --git a/meltano_transform/models/gie_rpt/rpt_gie_storage.sql b/meltano_transform/models/gie_rpt/rpt_gie_storage.sql index 04ab3d8..bb272c8 100644 --- a/meltano_transform/models/gie_rpt/rpt_gie_storage.sql +++ b/meltano_transform/models/gie_rpt/rpt_gie_storage.sql @@ -6,6 +6,7 @@ SSO AS gasdaystart::DATE gasdaystart, split_part(url, '/', 2) as country, split_part(url, '/', 3) as company_eic, + key_hash, code as sso_eic, name as sso_name, status, @@ -36,6 +37,7 @@ FROM select _sdc_batched_at, _sdc_extracted_at, + key_hash, sso.gasdaystart, country, SSO.company_eic, diff --git a/meltano_transform/models/gie_rpt/rpt_gie_storage.yml b/meltano_transform/models/gie_rpt/rpt_gie_storage.yml index f7fe67e..56ad3e9 100644 --- a/meltano_transform/models/gie_rpt/rpt_gie_storage.yml +++ b/meltano_transform/models/gie_rpt/rpt_gie_storage.yml @@ -6,6 +6,12 @@ models: +tags: - gie + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - sso_eic + - gasdaystart + columns: - name: _sdc_batched_at description: Timestamp when the data was captured in the database. @@ -13,6 +19,12 @@ models: - name: _sdc_extracted_at description: Timestamp when the data was retrieved from the REST API. + - name: key_hash + description: Has of sso_eic and gasdaystart. + tests: + - unique + - not_null + - name: gasdaystart description: Date of the observation. Ex. the injection field refers to the injection on this date. gasinstorage as per end of the gasdaystart. tests: diff --git a/meltano_transform/models/overview.md b/meltano_transform/models/overview.md index 31c53e8..e3c6844 100644 --- a/meltano_transform/models/overview.md +++ b/meltano_transform/models/overview.md @@ -2,6 +2,10 @@ ![mimodast Logo](https://github.com/EJOOSTEROP/mimodast/blob/master/assets/hatchful/logo_transparent.png) + + + + # Mimodast dbt Project Mimodast is a minimal modern data stack with working data pipelines in a single Docker container. diff --git a/meltano_transform/packages.yml b/meltano_transform/packages.yml new file mode 100644 index 0000000..d7c5292 --- /dev/null +++ b/meltano_transform/packages.yml @@ -0,0 +1,3 @@ +packages: + - package: dbt-labs/dbt_utils + version: 1.0.0 \ No newline at end of file diff --git a/meltano_transform/tests/richter_max.sql b/meltano_transform/tests/richter_max.sql new file mode 100644 index 0000000..cb53098 --- /dev/null +++ b/meltano_transform/tests/richter_max.sql @@ -0,0 +1,3 @@ +SELECT * +FROM {{ ref('rpt_usgs_events')}} +WHERE magnitude > 10 \ No newline at end of file diff --git a/meltano_transform/tests/stage_timing.sql b/meltano_transform/tests/storage_max.sql similarity index 50% rename from meltano_transform/tests/stage_timing.sql rename to meltano_transform/tests/storage_max.sql index f4481c2..ad8bcb5 100644 --- a/meltano_transform/tests/stage_timing.sql +++ b/meltano_transform/tests/storage_max.sql @@ -1,3 +1,3 @@ SELECT * FROM {{ ref('rpt_gie_storage')}} -WHERE _sdc_batched_at < _sdc_extracted_at \ No newline at end of file +WHERE gasinstorage - workinggasvolume > 1 \ No newline at end of file diff --git a/meltano_transform/tests/stage_timing.yml b/meltano_transform/tests/storage_max.yml similarity index 88% rename from meltano_transform/tests/stage_timing.yml rename to meltano_transform/tests/storage_max.yml index d10fd97..d5c0b30 100644 --- a/meltano_transform/tests/stage_timing.yml +++ b/meltano_transform/tests/storage_max.yml @@ -2,5 +2,5 @@ version: 2 # NOTE: THIS DOES NOT WORK. UNCLEAR IF YOU CAN DOCUMENT A TEST AT THIS STAGE. tests: - - name: stage_timing + - name: storage_max description: Data needs to be extracted before it can be stored in the database. \ No newline at end of file diff --git a/readme.md b/readme.md index 1671695..3a08ad9 100644 --- a/readme.md +++ b/readme.md @@ -98,9 +98,9 @@ A minimal modern data stack with working data pipelines in a single Docker conta - [Superset][Superset-url] - data visualization and exploration platform - Sample data pipelines with [USGS Earthquake][USGSEarthquakeAPI-url] data and [European Gas Inventory][GIEAPI-url] levels. -Mimodast can be used to explore the functionality of the tools by using the examples as-is; and to modify and expand on the exmples for further exploration. +Explore the functionality of the tools by using the examples as-is; and to modify and expand on the exmples for further exploration. -It is a starting point for exploration. The project is not a showcase of all or even the best functionality that each tool has to offer. The tools have more functionality than is accounted for in Mimodast. +This is a convenient starting point for exploration. The project is not a showcase of all or even the best functionality that each tool has to offer.
- - ## Usage -The pipelines include the injection of data from source into a database, transformation, data testing, documentation and reporting. Various tools are leveraged. +Two basic examples are used to illustrate an extensive date pipeline encompassing the following components: -This section highlights some of the key items for the tools being used. For full documentation refer to the respective websites of each tool. +- obtaining the data from source +- capturing the data in a database +- transformation +- scheduling +- testing of data +- reporting +- integrated documentation of the process - +The two pipelines involve [USGS Earthquake][USGSEarthquakeAPI-url] data and [European Gas Inventory][GIEAPI-url] data. +Below we highlight the core configuration for these components. For (much) more additional information refer to the respective documentation of the tools. + + ### Definition and Configuration @@ -207,99 +204,210 @@ The data pipelines are fully defined in a set of files. This includes the source These files are all found in the `/project/mimodast/` folder in the Docker container. It is best practice to capture this folder in a version control tool. Git is included in the Docker image. -The core files include: +Some of the core files include: - `/project/mimodast/meltano.yml` - this contains items like the source specification, destination database and schedule. - `/project/mimodast/orhestration/dags/gie_dag.py` - python code defining how to orchestrate a data pipeline in Airflow. Note that the GIE data uses this manually created file, whereas the USGS data orhestration relies purely on logic defined in `meltano.yml`. - `/project/mimodast/tranformation/` - this folder contains transformation logic (under `models/`) and also tests and documentation. + + +### USGS Earthquake Data Pipeline + +#### Obtaining the data from source + +The `meltano.yml` file specifies how to obtain the data from source. Specifically, configuring the connection to the data source is centered around this `tap` section in `meltano.yml` (To be found at `/project/mimodast/meltano.yml` in the Docker container.): + +```yaml + - name: stg_usgs + inherit_from: tap-rest-api-msdk + config: + api_url: https://earthquake.usgs.gov/fdsnws +``` + +In the example, this tap is inherited from a publicly available tap for a REST API: -### Meltano +```yaml +plugins: + extractors: + - name: tap-rest-api-msdk + variant: widen + pip_url: tap-rest-api-msdk + ``` -Meltano's functionality is largely driven by the meltano.yml file. It is used to install most of the other tools contained in the image, to define the ELT pipeline and to schedule the [USGS Earthquake][USGSEarthquakeAPI-url] pipeline. The file can be found at: `/project/mimodast/meltano.yml`. +`pip_url` specifies the location of the source code for the tap plug-in. In this case the actual location is derived by Meltano based on the tap name. Note that the tap for the other data pipeline (Gas Inventory data) also inherits from the same tap, but is clearly configured differently. -This file can for example be edited to change the period or minimum earthquake magnitude selected when getting data from USGS. Search the file for `name: stg_usgs` and review the fews lines following, especially the settings for `starttime` and `minmagnitude`. +`meltano.yml` contains the ful configuration of the tap. For example the following element specifies to select only earthquakes with a minimum magnitute: -Meltano can be used to invoke many of the tools. For example the following command preforms the tests defined in dbt: `meltano invoke dbt-duckdb:test`. +```yaml + minmagnitude: 6 +``` + +Many more items are configured for this tap. +#### Capturing data in a database + +The following section in `meltano.yml` configures the database where the data will be stored: + +```yaml + - name: target-duckdb + pip_url: target-duckdb~=0.4 + config: + add_metadata_columns: true + default_target_schema: main + filepath: $DB_LOCATION + data_flattening_max_level: 10 +``` -### Airflow +A [duckdb][DuckDB-url] database is used in this example. This database contains the data captured from source and is accessed for reporting. The database file is located at `/project/data/dev/data.duckdb`. This database location is specified in `meltano.yml`. -Airflow is used to trigger the ELT pipelines based on a schedule. The Airflow UI can be access from `localhost:8085`, with `admin/admin` as user/password. There are three pipelines: one for USGS and two for GIE. +The image contains the DuckDB command line interface. Use the command: -The USGS pipeline and schedule are fully managed by meltano.yml. Note that one may need to wait (up to a minute) for changes in meltano.yml to be recognized by Airflow. +```sh +/project/duckdb_cli/duckdb /project/data/dev/data.duckdb +``` -The GIE pipeline and schedule are defined as DAGs in a python file located at `/project/mimodast/orchestrate/dags/gie_dag.py`. The GIE pipelines are initially paused as they will not function without the API key referenced above. Once the API key has been provided the GIE pipelines can be activated using the Airflow UI. +to start the CLI and browse the database using SQL (the CLI has a help function and is documented online). -The GIE backfill pipeline uses Airflow variables to select the period for which to capture historic data. These variables can be changed using the Airflow UI. Again one may need to wait (up to a minute) for any changes to be recognized by Airflow. Note that this is not a [best practice][AirflowBestPractices-url] design but is used for simplicity. +Note that the database maybe unavailable if another process (pipeline, reporting) is already accessing it, resulting in an error message. +#### Transformation -### Superset +Transformation is performed by [dbt][dbt-url] and specified by a set of `SQL` files. In the container these are located at: `/project/mimodast/transform/models/usgs_rpt/`. -Superset is used to visualize/dashboard the data. The Superset UI can be accessed from `localhost:8093`, with `admin/admin` as user/password. Two dashboards exist. +For this example pipeline the transformation is fully captured in `rpt_usgs_events.sql`. In this case the 'transformation' simply copies some source attributes into a reporting table. -At the start the database in mimodast is empty so make sure to run the datapipeline(s) before reviewing the dashboards. + -Due to an incorrect setup in mimodast individual charts in a dashboard frequently do not show. For now: +#### Scheduling -- Refresh each chart by selecting this option in the right top corner of each chart. -- Possibly wait for other processes accessing the database (say the data pipelines) to complete. +The following section of `meltano.yml` configures the pipeline's run schedule: - +```yaml +schedules: +- name: USGS-Earthquake + interval: 35 */1 * * * + job: usgs-to-duckdb-rpt + start_date: 2023-01-01 15:40:21.295936 +``` +The scheduling `interval` uses the [Cron job][Cron-url] format. In this case the pipeline is schedulted to run 35 minutes after every hour. -### DuckDB +This section refers to a `job`, wich is configured in the same file. This job consists of a `tap` to obtain data from source, a loader specifying where the data needs to be stored and a transformation component: -The data for the pipelines is captured in a DuckDB database. The database is located at `/project/data/dev/data.duckdb`. +```yaml +jobs: +- name: usgs-to-duckdb-rpt + tasks: + - stg_usgs target-duckdb-usgs dbt-duckdb:usgs +``` -The image contains the DuckDB command line interface which can be used to query the database. The command `/project/duckdb_cli/duckdb /project/data/dev/data.duckdb` will start the CLI and open the database (the CLI has a help function and is documented online). +In this docker container [Airflow][Airflow-url] is used as the scheduler/orchestrator. Meltano ensures that the specified schedule is set in Airflow. Note that the schedule can also be set directly in Airflow, as is the case for our [GIE Gas Inventory][GIEAPI-url] pipeline. -Note that the database maybe unavailable if another process (pipeline, reporting) is already accessing it. +To monitor job progress access the Airflow UI from `localhost:8085`, with `admin/admin` as user/password. There are three pipelines: one for USGS and two for GIE. +#### Testing -### dbt -dbt defines data transformations. Mimodast contains transformations from staged data to data used for reporting. dbt is configured by using the files in `/project/mimodast/transformers/`. +Data tests are specified in two locations: -New transformations can be triggered by running the pipelines in Airflow; or manually triggered using `meltano invoke dbt-duckdb:run` from within the `/project/mimodast/` folder. +- SQL files in the `/project/mimodast/transform/models/tests/` folder. (In this specific case just a basic test that the magnitude of an earthquake is not unrealistically high.) Tests are performed by dbt. +- yml files in the `/project/mimodast/transform/models/usgs_rpt/` folder. For example the following tests that the `id` field is not null: -Data tests and documentation have also been setup in mimodast. +```yaml + - name: id + description: Unique ID of earthquake or related event assigned by USGS. + tests: + - not_null +``` -The documentation can be viewed at `localhost:8094`. The tests can be triggered by invoking `meltano invoked dbt-duckdb:test` from within the `/project/mimodast/` folder. +Tests can be initiated manually from the command line in the Docker container: +```sh +cd /project/mimodast/ +meltano invoke dbt-duckdb:test +``` + +#### Reporting + +[Superset][Superset-url] is used to visualize/dashboard the data. The Superset UI can be accessed from `localhost:8093`, with `admin/admin` as user/password. + +Initially the database in mimodast is empty so make sure to run the datapipeline(s) before reviewing the dashboards. + +Due to an outstanding issue in mimodast, individual charts in a dashboard frequently do not show. For now: + +- Refresh each chart by selecting this option in the right top corner of each chart. +- Possibly wait for other processes accessing the database (say the data pipelines) to complete +#### Documentation +dbt is used for documentation of data and processes. Documentation is maitained in .yml files and `overview.md` in the `/project/mimodast/transform/models/` folder. +This documentation can be consulted at `localhost:8094`. + + +### Gas Inventory Pipeline + +The [Gas][GIEAPI-url] pipeline is setup in a similar way as the USGS earthquake pipeline. + +The following differences are noteworthy: + +1. The pipeline requires an account to be setup. This is free, quick and avaiable to everyone. Refer here for instructions. + - Note that for this reasong the jobs/DAGs for this pipeline are initially paused in Airflow. Once the API key is obtained an setup in the docker container use the Airflow UI to unpause the jobs. +2. The `meltano.yml` file is configured to obtain this key from an environment variable as follows: + +```yaml + headers: + x-key: $ENV_GIE_XKEY +``` + +3. Schedule/orhestration is not configured using `meltano.yml` but instead with two manually coded Airflow DAGs. The Python file containing the code for these can be found at `/project/mimodast/orchestrate/dags/gie_dag.py`. + - The backfill dag captures historic data from source. To specify the date range, two Airflow variables are used. These values can be changed using the Airflow UI. + - It takes some time (<1 minute) for the new date range to be reflected in the DAG. + - Note that using Airflow variables in a DAG in this way is not a [best practice][AirflowBestPractices-url] design but is used for simplicity. +4. Meltano's inline data mapping functionality is used to create hashed ID fields when obtaining data from source using the following configuration in `meltano.yml`: + +```yaml + stream_maps: + stg_gie_storage: + key_hash: md5(config['hash_seed'] + (gasDayStart + code)) +``` +5. Additional test types are included. For example (from `rpt_gie_storage.yml`): +```yaml + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - sso_eic + - gasdaystart +``` + + ## Roadmap - [ ] Include [Great Expectations][GreatExpectations-url] for data quality purposes. - [ ] Add a dbt model using [PRQL][PRQL-url] language instead of SQL. +- [ ] Add a metadata framework like Amundsen, OpenLineage or similar. -See the [open issues](https://github.com/EJOOSTEROP/mimodast/issues) for a full list of proposed features (and known issues). - - - +See the [open issues](https://github.com/EJOOSTEROP/mimodast/issues) for a full list of proposed features and known issues. - - ## Contributing @@ -317,12 +425,10 @@ Don't forget to give the project a star! Thanks again! - - ## License -Distributed under the MIT License. The tools and the sample data are subject to their own respective licenses. +Distributed under the MIT License. See `LICENSE.txt` for more information. The tools and the sample data are subject to their own respective licenses. @@ -395,6 +501,7 @@ Project Link: [https://github.com/EJOOSTEROP/mimodast](https://github.com/EJOOST [GreatExpectations-url]: https://greatexpectations.io/ [PRQL-url]: https://prql-lang.org/ +[Cron-url]: https://en.wikipedia.org/wiki/Cron [DockerDesktop-url]: https://www.docker.com/products/docker-desktop/ [USGSEarthquakeAPI-url]: https://earthquake.usgs.gov/fdsnws/event/1/ [GIEAPI-url]: https://agsi.gie.eu/ diff --git a/standup/dashboards prior.zip b/standup/dashboards prior.zip new file mode 100644 index 0000000..bfe4b19 Binary files /dev/null and b/standup/dashboards prior.zip differ diff --git a/standup/dashboards.zip b/standup/dashboards.zip index bfe4b19..10c00a7 100644 Binary files a/standup/dashboards.zip and b/standup/dashboards.zip differ diff --git a/standup/datasources.yml b/standup/datasources.yml deleted file mode 100644 index 7ce5f1b..0000000 --- a/standup/datasources.yml +++ /dev/null @@ -1,5 +0,0 @@ -databases: -- database_name: DuckDB - sqlalchemy_uri: duckdb:////project/data/dev/data.duckdb - cache_timeout: null - expose_in_sqllab: true \ No newline at end of file diff --git a/superset/dashboards/20221125_035050.json b/superset/dashboards/20221125_035050.json deleted file mode 100644 index 503db89..0000000 --- a/superset/dashboards/20221125_035050.json +++ /dev/null @@ -1,307 +0,0 @@ -{ - "dashboards": [ - { - "__Dashboard__": { - "css": "", - "dashboard_title": "Staging GEI - European Gas Storage", - "description": null, - "json_metadata": "{\"show_native_filters\": true, \"shared_label_colors\": {}, \"color_scheme\": \"\", \"refresh_frequency\": 0, \"expanded_slices\": {}, \"label_colors\": {}, \"timed_refresh_immune_slices\": [], \"default_filters\": \"{}\", \"chart_configuration\": {}, \"remote_id\": 1}", - "position_json": "{\"CHART-_0I8kiR-xr\":{\"children\":[],\"id\":\"CHART-_0I8kiR-xr\",\"meta\":{\"chartId\":1,\"height\":52,\"sliceName\":\"Fill Ratio\",\"sliceNameOverride\":\"Fill Ratio\",\"uuid\":\"563d16f8-808a-4509-9b51-e3bbcc5ee1c8\",\"width\":3},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-Zm9Q2PUZMz\"],\"type\":\"CHART\"},\"CHART-p3i4Bkt9CF\":{\"children\":[],\"id\":\"CHART-p3i4Bkt9CF\",\"meta\":{\"chartId\":3,\"height\":52,\"sliceName\":\"Injection and Withdrawal\",\"uuid\":\"ca9f9177-255c-4149-8727-985b44f7dfe7\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-Zm9Q2PUZMz\"],\"type\":\"CHART\"},\"CHART-pw59cYzQyD\":{\"children\":[],\"id\":\"CHART-pw59cYzQyD\",\"meta\":{\"chartId\":2,\"height\":52,\"sliceName\":\"Calendar View\",\"uuid\":\"e490cbe6-ba7c-45d8-afbb-ec7d7e9a04c3\",\"width\":3},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-Zm9Q2PUZMz\"],\"type\":\"CHART\"},\"DASHBOARD_VERSION_KEY\":\"v2\",\"GRID_ID\":{\"children\":[\"HEADER-KRT7hPQf5s\",\"ROW-Zm9Q2PUZMz\"],\"id\":\"GRID_ID\",\"parents\":[\"ROOT_ID\"],\"type\":\"GRID\"},\"HEADER-KRT7hPQf5s\":{\"children\":[],\"id\":\"HEADER-KRT7hPQf5s\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\",\"headerSize\":\"MEDIUM_HEADER\",\"text\":\"Total Gas Stored as Percentage of Capacity\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"HEADER\"},\"HEADER_ID\":{\"id\":\"HEADER_ID\",\"meta\":{\"text\":\"Staging GEI - European Gas Storage\"},\"type\":\"HEADER\"},\"ROOT_ID\":{\"children\":[\"GRID_ID\"],\"id\":\"ROOT_ID\",\"type\":\"ROOT\"},\"ROW-Zm9Q2PUZMz\":{\"children\":[\"CHART-_0I8kiR-xr\",\"CHART-pw59cYzQyD\",\"CHART-p3i4Bkt9CF\"],\"id\":\"ROW-Zm9Q2PUZMz\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"ROW\"}}", - "slices": [ - { - "__Slice__": { - "cache_timeout": null, - "datasource_name": "main.STG_STORED", - "datasource_type": "table", - "id": 1, - "params": "{\"adhoc_filters\": [], \"color_picker\": {\"a\": 1, \"b\": 135, \"g\": 122, \"r\": 0}, \"datasource\": \"1__table\", \"extra_form_data\": {}, \"granularity_sqla\": \"REPORTING_DATE\", \"header_font_size\": 0.4, \"metric\": {\"aggregate\": \"MIN\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"FILL_RATIO\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": false, \"id\": 65, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"MIN(FILL_RATIO)\", \"optionName\": \"metric_v4b50ld4vuc_gev7u7z7ud7\", \"sqlExpression\": null}, \"rolling_type\": \"None\", \"show_timestamp\": true, \"show_trend_line\": true, \"slice_id\": 1, \"start_y_axis_at_zero\": false, \"subheader_font_size\": 0.15, \"time_format\": \"smart_date\", \"time_grain_sqla\": \"P1D\", \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"big_number\", \"y_axis_format\": \"SMART_NUMBER\", \"remote_id\": 1, \"datasource_name\": \"STG_STORED\", \"schema\": \"main\", \"database_name\": \"DuckDB\"}", - "query_context": "{\"datasource\":{\"id\":1,\"type\":\"table\"},\"force\":false,\"queries\":[{\"time_range\":\"No filter\",\"granularity\":\"REPORTING_DATE\",\"filters\":[],\"extras\":{\"time_grain_sqla\":\"P1D\",\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"having\":\"\",\"having_druid\":[],\"where\":\"\"},\"applied_time_extras\":{},\"columns\":[],\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":65,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_v4b50ld4vuc_gev7u7z7ud7\"}],\"annotation_layers\":[],\"timeseries_limit\":0,\"order_desc\":true,\"url_params\":{},\"custom_params\":{},\"custom_form_data\":{},\"is_timeseries\":true,\"post_processing\":[{\"operation\":\"pivot\",\"options\":{\"index\":[\"__timestamp\"],\"columns\":[],\"aggregates\":{\"MIN(FILL_RATIO)\":{\"operator\":\"mean\"}},\"drop_missing_columns\":false,\"flatten_columns\":false,\"reset_index\":false}},null,null,{\"operation\":\"flatten\"}]}],\"form_data\":{\"viz_type\":\"big_number\",\"datasource\":\"1__table\",\"slice_id\":1,\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"granularity_sqla\":\"REPORTING_DATE\",\"time_grain_sqla\":\"P1D\",\"time_range\":\"No filter\",\"metric\":{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":65,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_v4b50ld4vuc_gev7u7z7ud7\"},\"adhoc_filters\":[],\"show_timestamp\":true,\"show_trend_line\":true,\"start_y_axis_at_zero\":false,\"color_picker\":{\"a\":1,\"b\":135,\"g\":122,\"r\":0},\"header_font_size\":0.4,\"subheader_font_size\":0.15,\"y_axis_format\":\"SMART_NUMBER\",\"time_format\":\"smart_date\",\"rolling_type\":\"None\",\"extra_form_data\":{},\"force\":false,\"result_format\":\"json\",\"result_type\":\"full\"},\"result_format\":\"json\",\"result_type\":\"full\"}", - "slice_name": "Fill Ratio", - "viz_type": "big_number" - } - }, - { - "__Slice__": { - "cache_timeout": null, - "datasource_name": "main.STG_STORED", - "datasource_type": "table", - "id": 2, - "params": "{\"adhoc_filters\": [], \"cell_padding\": 3, \"cell_radius\": 6, \"cell_size\": 20, \"datasource\": \"1__table\", \"domain_granularity\": \"month\", \"extra_form_data\": {}, \"granularity_sqla\": \"REPORTING_DATE\", \"linear_color_scheme\": \"schemeRdBu\", \"metrics\": [{\"aggregate\": \"MIN\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"FILL_RATIO\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": false, \"id\": 65, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"MIN(FILL_RATIO)\", \"optionName\": \"metric_9m38fcu6hl7_7x1hendj3a6\", \"sqlExpression\": null}], \"show_legend\": true, \"show_metric_name\": false, \"show_values\": false, \"slice_id\": 2, \"steps\": 10, \"subdomain_granularity\": \"day\", \"time_range\": \"Last month\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"cal_heatmap\", \"x_axis_time_format\": \"smart_date\", \"y_axis_format\": \"SMART_NUMBER\", \"remote_id\": 2, \"datasource_name\": \"STG_STORED\", \"schema\": \"main\", \"database_name\": \"DuckDB\"}", - "query_context": "{\"datasource\":{\"id\":1,\"type\":\"table\"},\"force\":false,\"queries\":[{\"time_range\":\"Last month\",\"granularity\":\"REPORTING_DATE\",\"filters\":[],\"extras\":{\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"having\":\"\",\"having_druid\":[],\"where\":\"\"},\"applied_time_extras\":{},\"columns\":[],\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":65,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_9m38fcu6hl7_7x1hendj3a6\"}],\"annotation_layers\":[],\"timeseries_limit\":0,\"order_desc\":true,\"url_params\":{},\"custom_params\":{},\"custom_form_data\":{}}],\"form_data\":{\"viz_type\":\"cal_heatmap\",\"datasource\":\"1__table\",\"slice_id\":2,\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"granularity_sqla\":\"REPORTING_DATE\",\"time_range\":\"Last month\",\"domain_granularity\":\"month\",\"subdomain_granularity\":\"day\",\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":65,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_9m38fcu6hl7_7x1hendj3a6\"}],\"adhoc_filters\":[],\"linear_color_scheme\":\"schemeRdBu\",\"cell_size\":20,\"cell_padding\":3,\"cell_radius\":6,\"steps\":10,\"y_axis_format\":\"SMART_NUMBER\",\"x_axis_time_format\":\"smart_date\",\"show_legend\":true,\"show_values\":false,\"show_metric_name\":false,\"extra_form_data\":{},\"force\":false,\"result_format\":\"json\",\"result_type\":\"full\"},\"result_format\":\"json\",\"result_type\":\"full\"}", - "slice_name": "Calendar View", - "viz_type": "cal_heatmap" - } - }, - { - "__Slice__": { - "cache_timeout": null, - "datasource_name": "main.STG_STORED", - "datasource_type": "table", - "id": 3, - "params": "{\"adhoc_filters\": [], \"annotation_layers\": [], \"color_scheme\": \"d3Category10\", \"comparison_type\": \"values\", \"datasource\": \"1__table\", \"extra_form_data\": {}, \"forecastEnabled\": false, \"forecastInterval\": 0.8, \"forecastPeriods\": \"2\", \"forecastSeasonalityDaily\": false, \"forecastSeasonalityWeekly\": false, \"forecastSeasonalityYearly\": false, \"granularity_sqla\": \"REPORTING_DATE\", \"groupby\": [], \"legendOrientation\": \"top\", \"legendType\": \"scroll\", \"logAxis\": false, \"markerEnabled\": false, \"markerSize\": 6, \"metrics\": [{\"aggregate\": \"SUM\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"GAS_INJECTION\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": false, \"id\": 63, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": true, \"isNew\": false, \"label\": \"Injection\", \"optionName\": \"metric_kvv4pul1p8_zlhrk6ugdf\", \"sqlExpression\": null}, {\"aggregate\": \"SUM\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"GAS_WITHDRAWAL\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": false, \"id\": 64, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": true, \"isNew\": false, \"label\": \"Withdrawal\", \"optionName\": \"metric_rc8n3jgl3w_zr0b31evfme\", \"sqlExpression\": null}], \"minorSplitLine\": true, \"only_total\": true, \"opacity\": 0.4, \"order_desc\": true, \"rich_tooltip\": true, \"row_limit\": 10000, \"seriesType\": \"line\", \"show_legend\": true, \"show_value\": false, \"slice_id\": 3, \"stack\": false, \"time_grain_sqla\": \"P1D\", \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"tooltipTimeFormat\": \"smart_date\", \"truncateYAxis\": false, \"viz_type\": \"echarts_area\", \"xAxisLabelRotation\": 45, \"x_axis_time_format\": \"%d/%m/%Y\", \"x_axis_title_margin\": 15, \"y_axis_bounds\": [null, null], \"y_axis_format\": \".3s\", \"y_axis_title\": \"Volume\", \"y_axis_title_margin\": 15, \"y_axis_title_position\": \"Left\", \"zoomable\": false, \"remote_id\": 3, \"datasource_name\": \"STG_STORED\", \"schema\": \"main\", \"database_name\": \"DuckDB\"}", - "query_context": "{\"datasource\":{\"id\":1,\"type\":\"table\"},\"force\":false,\"queries\":[{\"time_range\":\"No filter\",\"granularity\":\"REPORTING_DATE\",\"filters\":[],\"extras\":{\"time_grain_sqla\":\"P1D\",\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"having\":\"\",\"having_druid\":[],\"where\":\"\"},\"applied_time_extras\":{},\"columns\":[],\"metrics\":[{\"aggregate\":\"SUM\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"id\":63,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"expressionType\":\"SIMPLE\",\"hasCustomLabel\":true,\"isNew\":false,\"label\":\"Injection\",\"optionName\":\"metric_kvv4pul1p8_zlhrk6ugdf\",\"sqlExpression\":null},{\"aggregate\":\"SUM\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_WITHDRAWAL\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"id\":64,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"expressionType\":\"SIMPLE\",\"hasCustomLabel\":true,\"isNew\":false,\"label\":\"Withdrawal\",\"optionName\":\"metric_rc8n3jgl3w_zr0b31evfme\",\"sqlExpression\":null}],\"orderby\":[[{\"aggregate\":\"SUM\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"id\":63,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"expressionType\":\"SIMPLE\",\"hasCustomLabel\":true,\"isNew\":false,\"label\":\"Injection\",\"optionName\":\"metric_kvv4pul1p8_zlhrk6ugdf\",\"sqlExpression\":null},false]],\"annotation_layers\":[],\"row_limit\":10000,\"series_columns\":[],\"timeseries_limit\":0,\"order_desc\":true,\"url_params\":{},\"custom_params\":{},\"custom_form_data\":{},\"is_timeseries\":true,\"time_offsets\":[],\"post_processing\":[{\"operation\":\"pivot\",\"options\":{\"index\":[\"__timestamp\"],\"columns\":[],\"aggregates\":{\"Injection\":{\"operator\":\"mean\"},\"Withdrawal\":{\"operator\":\"mean\"}},\"drop_missing_columns\":false,\"flatten_columns\":false,\"reset_index\":false}},null,null,null,null,{\"operation\":\"flatten\"},null,null]}],\"form_data\":{\"viz_type\":\"echarts_area\",\"datasource\":\"1__table\",\"slice_id\":3,\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"granularity_sqla\":\"REPORTING_DATE\",\"time_grain_sqla\":\"P1D\",\"time_range\":\"No filter\",\"metrics\":[{\"aggregate\":\"SUM\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"id\":63,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"expressionType\":\"SIMPLE\",\"hasCustomLabel\":true,\"isNew\":false,\"label\":\"Injection\",\"optionName\":\"metric_kvv4pul1p8_zlhrk6ugdf\",\"sqlExpression\":null},{\"aggregate\":\"SUM\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_WITHDRAWAL\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":false,\"id\":64,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"expressionType\":\"SIMPLE\",\"hasCustomLabel\":true,\"isNew\":false,\"label\":\"Withdrawal\",\"optionName\":\"metric_rc8n3jgl3w_zr0b31evfme\",\"sqlExpression\":null}],\"groupby\":[],\"adhoc_filters\":[],\"order_desc\":true,\"row_limit\":10000,\"comparison_type\":\"values\",\"annotation_layers\":[],\"forecastEnabled\":false,\"forecastPeriods\":\"2\",\"forecastInterval\":0.8,\"forecastSeasonalityYearly\":false,\"forecastSeasonalityWeekly\":false,\"forecastSeasonalityDaily\":false,\"x_axis_title_margin\":15,\"y_axis_title\":\"Volume\",\"y_axis_title_margin\":15,\"y_axis_title_position\":\"Left\",\"color_scheme\":\"d3Category10\",\"seriesType\":\"line\",\"opacity\":0.4,\"show_value\":false,\"stack\":false,\"only_total\":true,\"markerEnabled\":false,\"markerSize\":6,\"zoomable\":false,\"show_legend\":true,\"legendType\":\"scroll\",\"legendOrientation\":\"top\",\"x_axis_time_format\":\"%d/%m/%Y\",\"xAxisLabelRotation\":45,\"rich_tooltip\":true,\"tooltipTimeFormat\":\"smart_date\",\"y_axis_format\":\".3s\",\"logAxis\":false,\"minorSplitLine\":true,\"truncateYAxis\":false,\"y_axis_bounds\":[null,null],\"extra_form_data\":{},\"force\":false,\"result_format\":\"json\",\"result_type\":\"full\"},\"result_format\":\"json\",\"result_type\":\"full\"}", - "slice_name": "Injection and Withdrawal", - "viz_type": "echarts_area" - } - } - ], - "slug": null - } - } - ], - "datasources": [ - { - "__SqlaTable__": { - "cache_timeout": null, - "columns": [ - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:32:13" - }, - "column_name": "REPORTING_DATE", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:31:17" - }, - "description": null, - "expression": "", - "extra": "{}", - "filterable": true, - "groupby": true, - "id": 31, - "is_active": null, - "is_dttm": true, - "python_date_format": null, - "table_id": 1, - "type": "DATE", - "uuid": "948348e2-88ce-4f42-8628-8cf0a73b1e0a", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:32:13" - }, - "column_name": "day(_sdc_batched_at)", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:31:17" - }, - "description": null, - "expression": "", - "extra": "{}", - "filterable": true, - "groupby": true, - "id": 32, - "is_active": null, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "fcb97929-cc87-4f64-ae64-67ca355a5ad5", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "column_name": "count_star()", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:31:17" - }, - "description": null, - "expression": "", - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 33, - "is_active": null, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "7feda35d-e44a-4d41-8791-e7500e25ae48", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:32:13" - }, - "column_name": "GAS_STORED", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:31:17" - }, - "description": null, - "expression": "", - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 34, - "is_active": null, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "299afe25-0400-4bd4-ae82-09a3f80aced6", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:32:13" - }, - "column_name": "CAPACITY", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:31:17" - }, - "description": null, - "expression": "", - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 35, - "is_active": null, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "3a79b399-262c-4397-8aa9-859029e0a249", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "column_name": "GAS_INJECTION", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "description": null, - "expression": null, - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 63, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "66dc16a0-91ca-4bf5-9685-65295e9ec094", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "column_name": "GAS_WITHDRAWAL", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "description": null, - "expression": null, - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 64, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "144e188d-ab7d-44ae-93d4-bde4115e2b0d", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "column_name": "FILL_RATIO", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-25T00:35:39" - }, - "description": null, - "expression": null, - "extra": "{}", - "filterable": true, - "groupby": false, - "id": 65, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "4abead9d-bda5-46a7-bd7c-617f7b0de11b", - "verbose_name": null - } - } - ], - "database_id": 1, - "default_endpoint": null, - "description": null, - "extra": null, - "fetch_values_predicate": null, - "filter_select_enabled": false, - "main_dttm_col": "REPORTING_DATE", - "metrics": [ - { - "__SqlMetric__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-11-25T00:32:13" - }, - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-11-24T01:06:17" - }, - "d3format": null, - "description": null, - "expression": "COUNT(*)", - "extra": "{\"warning_markdown\":\"\"}", - "id": 1, - "metric_name": "count", - "metric_type": null, - "table_id": 1, - "uuid": "70980057-3b66-4e6f-8894-453486d00207", - "verbose_name": "COUNT(*)", - "warning_text": null - } - } - ], - "offset": 0, - "params": "{\"remote_id\": 1, \"database_name\": \"DuckDB\"}", - "schema": "main", - "sql": "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\nSELECT \n gasdaystart::DATE as REPORTING_DATE, \n day(_sdc_batched_at), \n count(*) , \n sum(TRY_CAST(injection as DOUBLE )) as GAS_INJECTION,\n sum(TRY_CAST(withdrawal as DOUBLE )) as GAS_WITHDRAWAL,\n sum(TRY_CAST(gasinstorage as DOUBLE )) as GAS_STORED,\n sum(TRY_CAST(workinggasvolume as DOUBLE )) as CAPACITY, \n GAS_STORED/CAPACITY as FILL_RATIO\nfrom stg_gie_storage \ngroup by gasdaystart, day(_sdc_batched_at)\norder by gasdaystart desc;", - "table_name": "STG_STORED", - "template_params": null - } - } - ] -} \ No newline at end of file diff --git a/superset/dashboards/20230320_120551.json b/superset/dashboards/20230320_120551.json deleted file mode 100644 index e426eba..0000000 --- a/superset/dashboards/20230320_120551.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "dashboards": [ - { - "__Dashboard__": { - "css": "", - "dashboard_title": "Stage - Gas Storage", - "description": null, - "json_metadata": "{\"show_native_filters\": true, \"shared_label_colors\": {}, \"color_scheme\": \"\", \"refresh_frequency\": 0, \"expanded_slices\": {}, \"label_colors\": {}, \"timed_refresh_immune_slices\": [], \"default_filters\": \"{}\", \"chart_configuration\": {}, \"remote_id\": 1}", - "position_json": "{\"CHART-QC3WsFVbOJ\":{\"children\":[],\"id\":\"CHART-QC3WsFVbOJ\",\"meta\":{\"chartId\":2,\"height\":50,\"sliceName\":\"Injection and Withdrawal\",\"uuid\":\"ff3cad73-fd29-4ad8-a610-3f6bb3a6168a\",\"width\":8},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-iIeeQGGSXo\"],\"type\":\"CHART\"},\"CHART-rYfX7seBa_\":{\"children\":[],\"id\":\"CHART-rYfX7seBa_\",\"meta\":{\"chartId\":1,\"height\":50,\"sliceName\":\"Fill Ratio\",\"uuid\":\"b26934ad-2ab6-4a14-ad8d-de6a8aa3ffa7\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-iIeeQGGSXo\"],\"type\":\"CHART\"},\"DASHBOARD_VERSION_KEY\":\"v2\",\"GRID_ID\":{\"children\":[\"ROW-iIeeQGGSXo\"],\"id\":\"GRID_ID\",\"parents\":[\"ROOT_ID\"],\"type\":\"GRID\"},\"HEADER_ID\":{\"id\":\"HEADER_ID\",\"meta\":{\"text\":\"Stage - Gas Storage\"},\"type\":\"HEADER\"},\"ROOT_ID\":{\"children\":[\"GRID_ID\"],\"id\":\"ROOT_ID\",\"type\":\"ROOT\"},\"ROW-iIeeQGGSXo\":{\"children\":[\"CHART-rYfX7seBa_\",\"CHART-QC3WsFVbOJ\"],\"id\":\"ROW-iIeeQGGSXo\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"ROW\"}}", - "slices": [ - { - "__Slice__": { - "cache_timeout": null, - "datasource_name": "main.STG_STORAGE", - "datasource_type": "table", - "id": 1, - "params": "{\"adhoc_filters\": [], \"color_picker\": {\"a\": 1, \"b\": 135, \"g\": 122, \"r\": 0}, \"compare_lag\": 7, \"compare_suffix\": \" compared to last week\", \"datasource\": \"1__table\", \"extra_form_data\": {}, \"force_timestamp_formatting\": false, \"granularity_sqla\": \"RECORD_DATE\", \"header_font_size\": 0.4, \"metric\": {\"aggregate\": \"MIN\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"FILL_RATIO\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 5, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"MIN(FILL_RATIO)\", \"optionName\": \"metric_2n3me2g8jw1_emmu08tdw65\", \"sqlExpression\": null}, \"rolling_type\": \"None\", \"show_timestamp\": true, \"show_trend_line\": true, \"start_y_axis_at_zero\": false, \"subheader_font_size\": 0.15, \"time_format\": \"smart_date\", \"time_grain_sqla\": \"P1D\", \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"big_number\", \"y_axis_format\": \".2%\", \"remote_id\": 1, \"datasource_name\": \"STG_STORAGE\", \"schema\": \"main\", \"database_name\": \"DuckDB\"}", - "query_context": "{\"datasource\":{\"id\":1,\"type\":\"table\"},\"force\":false,\"queries\":[{\"time_range\":\"No filter\",\"granularity\":\"RECORD_DATE\",\"filters\":[],\"extras\":{\"time_grain_sqla\":\"P1D\",\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"having\":\"\",\"having_druid\":[],\"where\":\"\"},\"applied_time_extras\":{},\"columns\":[],\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":5,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_2n3me2g8jw1_emmu08tdw65\"}],\"annotation_layers\":[],\"timeseries_limit\":0,\"order_desc\":true,\"url_params\":{},\"custom_params\":{},\"custom_form_data\":{},\"is_timeseries\":true,\"post_processing\":[{\"operation\":\"pivot\",\"options\":{\"index\":[\"__timestamp\"],\"columns\":[],\"aggregates\":{\"MIN(FILL_RATIO)\":{\"operator\":\"mean\"}},\"drop_missing_columns\":false,\"flatten_columns\":false,\"reset_index\":false}},null,null,{\"operation\":\"flatten\"}]}],\"form_data\":{\"viz_type\":\"big_number\",\"datasource\":\"1__table\",\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"granularity_sqla\":\"RECORD_DATE\",\"time_grain_sqla\":\"P1D\",\"time_range\":\"No filter\",\"metric\":{\"expressionType\":\"SIMPLE\",\"column\":{\"id\":5,\"column_name\":\"FILL_RATIO\",\"verbose_name\":null,\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"is_dttm\":false,\"type\":\"NUMBER\",\"type_generic\":null,\"python_date_format\":null,\"is_certified\":false,\"certified_by\":null,\"certification_details\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":false,\"label\":\"MIN(FILL_RATIO)\",\"optionName\":\"metric_2n3me2g8jw1_emmu08tdw65\"},\"adhoc_filters\":[],\"compare_lag\":7,\"compare_suffix\":\" compared to last week\",\"show_timestamp\":true,\"show_trend_line\":true,\"start_y_axis_at_zero\":false,\"color_picker\":{\"r\":0,\"g\":122,\"b\":135,\"a\":1},\"header_font_size\":0.4,\"subheader_font_size\":0.15,\"y_axis_format\":\".2%\",\"time_format\":\"smart_date\",\"force_timestamp_formatting\":false,\"rolling_type\":\"None\",\"extra_form_data\":{},\"force\":false,\"result_format\":\"json\",\"result_type\":\"full\"},\"result_format\":\"json\",\"result_type\":\"full\"}", - "slice_name": "Fill Ratio", - "viz_type": "big_number" - } - }, - { - "__Slice__": { - "cache_timeout": null, - "datasource_name": "main.STG_STORAGE", - "datasource_type": "table", - "id": 2, - "params": "{\"adhoc_filters\": [], \"annotation_layers\": [], \"color_scheme\": \"echarts4Colors\", \"comparison_type\": \"values\", \"datasource\": \"1__table\", \"extra_form_data\": {}, \"forecastInterval\": 0.8, \"forecastPeriods\": 10, \"granularity_sqla\": \"RECORD_DATE\", \"groupby\": [], \"legendOrientation\": \"top\", \"legendType\": \"scroll\", \"markerSize\": 6, \"metrics\": [{\"aggregate\": \"MIN\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"GAS_INJECTION\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 6, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": true, \"isNew\": false, \"label\": \"Injection\", \"optionName\": \"metric_zgzkbap4cgc_9g1ov62gdt5\", \"sqlExpression\": null}, {\"aggregate\": \"MAX\", \"column\": {\"certification_details\": null, \"certified_by\": null, \"column_name\": \"GAS_WITHDRAWAL\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 7, \"is_certified\": false, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"NUMBER\", \"type_generic\": null, \"verbose_name\": null, \"warning_markdown\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": true, \"isNew\": false, \"label\": \"Withdrawal\", \"optionName\": \"metric_jraiqofdn6_yrjg0joxl5d\", \"sqlExpression\": null}], \"only_total\": true, \"opacity\": 0.2, \"order_desc\": true, \"rich_tooltip\": true, \"row_limit\": 10000, \"seriesType\": \"line\", \"show_legend\": true, \"slice_id\": 2, \"time_grain_sqla\": \"P1D\", \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"tooltipTimeFormat\": \"smart_date\", \"viz_type\": \"echarts_area\", \"x_axis_time_format\": \"smart_date\", \"x_axis_title_margin\": 15, \"y_axis_bounds\": [null, null], \"y_axis_format\": \"SMART_NUMBER\", \"y_axis_title_margin\": 15, \"y_axis_title_position\": \"Left\", \"remote_id\": 2, \"datasource_name\": \"STG_STORAGE\", \"schema\": \"main\", \"database_name\": \"DuckDB\"}", - "query_context": "{\"datasource\":{\"id\":1,\"type\":\"table\"},\"force\":false,\"queries\":[{\"time_range\":\"No filter\",\"granularity\":\"RECORD_DATE\",\"filters\":[],\"extras\":{\"time_grain_sqla\":\"P1D\",\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"having\":\"\",\"having_druid\":[],\"where\":\"\"},\"applied_time_extras\":{},\"columns\":[],\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"id\":6,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":true,\"label\":\"Injection\",\"optionName\":\"metric_zgzkbap4cgc_9g1ov62gdt5\"},{\"expressionType\":\"SIMPLE\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_WITHDRAWAL\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"id\":7,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"aggregate\":\"MAX\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":true,\"label\":\"Withdrawal\",\"optionName\":\"metric_jraiqofdn6_yrjg0joxl5d\"}],\"orderby\":[[{\"expressionType\":\"SIMPLE\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"id\":6,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":true,\"label\":\"Injection\",\"optionName\":\"metric_zgzkbap4cgc_9g1ov62gdt5\"},false]],\"annotation_layers\":[],\"row_limit\":10000,\"series_columns\":[],\"timeseries_limit\":0,\"order_desc\":true,\"url_params\":{},\"custom_params\":{},\"custom_form_data\":{},\"is_timeseries\":true,\"time_offsets\":[],\"post_processing\":[{\"operation\":\"pivot\",\"options\":{\"index\":[\"__timestamp\"],\"columns\":[],\"aggregates\":{\"Injection\":{\"operator\":\"mean\"},\"Withdrawal\":{\"operator\":\"mean\"}},\"drop_missing_columns\":false,\"flatten_columns\":false,\"reset_index\":false}},null,null,null,null,{\"operation\":\"flatten\"},null,null]}],\"form_data\":{\"viz_type\":\"echarts_area\",\"datasource\":\"1__table\",\"slice_id\":2,\"time_range_endpoints\":[\"inclusive\",\"exclusive\"],\"granularity_sqla\":\"RECORD_DATE\",\"time_grain_sqla\":\"P1D\",\"time_range\":\"No filter\",\"metrics\":[{\"expressionType\":\"SIMPLE\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_INJECTION\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"id\":6,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"aggregate\":\"MIN\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":true,\"label\":\"Injection\",\"optionName\":\"metric_zgzkbap4cgc_9g1ov62gdt5\"},{\"expressionType\":\"SIMPLE\",\"column\":{\"certification_details\":null,\"certified_by\":null,\"column_name\":\"GAS_WITHDRAWAL\",\"description\":null,\"expression\":null,\"filterable\":true,\"groupby\":true,\"id\":7,\"is_certified\":false,\"is_dttm\":false,\"python_date_format\":null,\"type\":\"NUMBER\",\"type_generic\":null,\"verbose_name\":null,\"warning_markdown\":null},\"aggregate\":\"MAX\",\"sqlExpression\":null,\"isNew\":false,\"hasCustomLabel\":true,\"label\":\"Withdrawal\",\"optionName\":\"metric_jraiqofdn6_yrjg0joxl5d\"}],\"groupby\":[],\"adhoc_filters\":[],\"order_desc\":true,\"row_limit\":10000,\"comparison_type\":\"values\",\"annotation_layers\":[],\"forecastPeriods\":10,\"forecastInterval\":0.8,\"x_axis_title_margin\":15,\"y_axis_title_margin\":15,\"y_axis_title_position\":\"Left\",\"color_scheme\":\"echarts4Colors\",\"seriesType\":\"line\",\"opacity\":0.2,\"only_total\":true,\"markerSize\":6,\"show_legend\":true,\"legendType\":\"scroll\",\"legendOrientation\":\"top\",\"x_axis_time_format\":\"smart_date\",\"rich_tooltip\":true,\"tooltipTimeFormat\":\"smart_date\",\"y_axis_format\":\"SMART_NUMBER\",\"y_axis_bounds\":[null,null],\"extra_form_data\":{},\"force\":false,\"result_format\":\"json\",\"result_type\":\"full\"},\"result_format\":\"json\",\"result_type\":\"full\"}", - "slice_name": "Injection and Withdrawal", - "viz_type": "echarts_area" - } - } - ], - "slug": null - } - } - ], - "datasources": [ - { - "__SqlaTable__": { - "cache_timeout": null, - "columns": [ - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "day(_sdc_batched_at)", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 1, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "f2caded3-79cb-444a-8b02-509d2079fef9", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "RECORD_DATE", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 2, - "is_active": true, - "is_dttm": true, - "python_date_format": null, - "table_id": 1, - "type": "DATE", - "uuid": "b97fb7c5-8d4d-4df6-8126-8ed3268d16a2", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "GAS_IN_STORAGE", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 3, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "9c311544-1f1d-49f7-a111-7455529bba1f", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "GAS_STORAGE_CAPACITY", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 4, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "0b61b24d-f2c5-4644-8eb8-1c180a97fb04", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "FILL_RATIO", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 5, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "5ee19b4f-b3a7-41da-8e41-51ba330af442", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "GAS_INJECTION", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 6, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "4576296d-9e63-4d9f-8b6f-10c4c95cc018", - "verbose_name": null - } - }, - { - "__TableColumn__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "column_name": "GAS_WITHDRAWAL", - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "description": null, - "expression": null, - "extra": null, - "filterable": true, - "groupby": true, - "id": 7, - "is_active": true, - "is_dttm": false, - "python_date_format": null, - "table_id": 1, - "type": "NUMBER", - "uuid": "67cebf29-1984-4072-9af6-0c676f71ede9", - "verbose_name": null - } - } - ], - "database_id": 1, - "default_endpoint": null, - "description": null, - "extra": null, - "fetch_values_predicate": null, - "filter_select_enabled": false, - "main_dttm_col": null, - "metrics": [ - { - "__SqlMetric__": { - "changed_by_fk": 1, - "changed_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "created_by_fk": 1, - "created_on": { - "__datetime__": "2022-12-06T20:56:03" - }, - "d3format": null, - "description": null, - "expression": "count(*)", - "extra": null, - "id": 1, - "metric_name": "count", - "metric_type": null, - "table_id": 1, - "uuid": "0d2daff5-3676-480f-9295-94046ba48b56", - "verbose_name": null, - "warning_text": null - } - } - ], - "offset": 0, - "params": "{\"remote_id\": 1, \"database_name\": \"DuckDB-dev\"}", - "schema": "main", - "sql": "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\nSELECT \n DAY(_sdc_batched_at),\n gasdaystart::DATE RECORD_DATE,\n --sum(gasinstorage::DOUBLE ) as GAS_STORED,\n sum((case when gasinstorage='-' then 0 else gasinstorage end)::DOUBLE ) GAS_IN_STORAGE,\n sum((case when workinggasvolume ='-' then 0 else workinggasvolume end)::DOUBLE ) GAS_STORAGE_CAPACITY,\n GAS_IN_STORAGE/GAS_STORAGE_CAPACITY FILL_RATIO,\n sum((case when injection ='-' then 0 else injection end)::DOUBLE ) GAS_INJECTION,\n sum((case when withdrawal ='-' then 0 else withdrawal end)::DOUBLE ) GAS_WITHDRAWAL, \n --sum(injection::DOUBLE ) as GAS_INJECTED\nFROM \n stg_gie_storage \ngroup BY\n DAY(_sdc_batched_at), \n gasdaystart::DATE \norder by 2 desc", - "table_name": "STG_STORAGE", - "template_params": null - } - } - ] -} \ No newline at end of file diff --git a/superset/dashboards/dashboard_export_20230324T211710.zip b/superset/dashboards/dashboard_export_20230324T211710.zip deleted file mode 100644 index 54682f4..0000000 Binary files a/superset/dashboards/dashboard_export_20230324T211710.zip and /dev/null differ