From 8072812b4b90c406c84e19ecbbdc4c98d1bb98c6 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:30:18 +0300 Subject: [PATCH 01/11] added params --- .../fact_hourly_energy_consumed.sql | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql index 9674d74..5b992de 100644 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -1,7 +1,9 @@ WITH params AS ( SELECT NULL::uuid AS device_id, -- filter: specific device (or NULL for all) - NULL::date AS input_date, -- filter: start date (or NULL for open range) -- filter: end date (or NULL for open range) + NULL::date AS input_date, -- filter: start date (or NULL for open range) + NULL::text AS event_month, -- filter: MM-YYYY (or NULL for all) + NULL::int AS event_year, -- filter: YYYY (or NULL for all) NULL::int AS hour, -- filter: hour of day (or NULL for all hours) NULL::int AS min_kw -- filter: min kW consumed (or NULL for no filter) ), @@ -11,6 +13,8 @@ total_energy AS ( log.device_id, log.event_time::date AS date, EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value FROM "device-status-log" log, params @@ -19,7 +23,7 @@ total_energy AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time) + GROUP BY 1,2,3,4,5 ), energy_phase_A AS ( @@ -35,7 +39,7 @@ energy_phase_A AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time) + GROUP BY 1,2,3 ), energy_phase_B AS ( @@ -51,7 +55,7 @@ energy_phase_B AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time) + GROUP BY 1,2,3 ), energy_phase_C AS ( @@ -67,12 +71,14 @@ energy_phase_C AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time) + GROUP BY 1,2,3 ) SELECT t.device_id, t.date, + t.event_year, + t.event_month, t.hour, (t.max_value - t.min_value) AS energy_consumed_kW, (a.max_value - a.min_value) AS energy_consumed_A, @@ -84,4 +90,4 @@ JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hou JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour JOIN params p ON TRUE WHERE (p.min_kw IS NULL OR (t.max_value - t.min_value) >= p.min_kw) -ORDER BY t.device_id, t.date, t.hour; \ No newline at end of file +ORDER BY 1,2; \ No newline at end of file From fea5d4d82889c78f13b542ddb25dead5e4026555 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:38:02 +0300 Subject: [PATCH 02/11] added more steps --- .../fact_hourly_energy_consumed.sql | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql index 5b992de..c6dcf1d 100644 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -23,6 +23,8 @@ total_energy AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) + AND (params.event_month IS NULL OR log.event_month = params.event_month) + AND (params.event_year IS NULL OR log.event_year = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -31,6 +33,8 @@ energy_phase_A AS ( log.device_id, log.event_time::date AS date, EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value FROM "device-status-log" log, params @@ -39,7 +43,9 @@ energy_phase_A AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY 1,2,3 + AND (params.event_month IS NULL OR log.event_month = params.event_month) + AND (params.event_year IS NULL OR log.event_year = params.event_year) + GROUP BY 1,2,3,4,5 ), energy_phase_B AS ( @@ -47,6 +53,8 @@ energy_phase_B AS ( log.device_id, log.event_time::date AS date, EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value FROM "device-status-log" log, params @@ -55,7 +63,9 @@ energy_phase_B AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY 1,2,3 + AND (params.event_month IS NULL OR log.event_month = params.event_month) + AND (params.event_year IS NULL OR log.event_year = params.event_year) + GROUP BY 1,2,3,4,5 ), energy_phase_C AS ( @@ -63,6 +73,8 @@ energy_phase_C AS ( log.device_id, log.event_time::date AS date, EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value FROM "device-status-log" log, params @@ -71,7 +83,9 @@ energy_phase_C AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - GROUP BY 1,2,3 + AND (params.event_month IS NULL OR log.event_month = params.event_month) + AND (params.event_year IS NULL OR log.event_year = params.event_year) + GROUP BY 1,2,3,4,5 ) SELECT From 6330f7823b9070d5beb16e2a417876f9cfd77f8a Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:48:30 +0300 Subject: [PATCH 03/11] adjusted param --- .../fact_hourly_energy_consumed.sql | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql index c6dcf1d..c783a14 100644 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -23,8 +23,8 @@ total_energy AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR log.event_month = params.event_month) - AND (params.event_year IS NULL OR log.event_year = params.event_year) + AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) + AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -43,8 +43,8 @@ energy_phase_A AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR log.event_month = params.event_month) - AND (params.event_year IS NULL OR log.event_year = params.event_year) + AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) + AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -63,8 +63,8 @@ energy_phase_B AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR log.event_month = params.event_month) - AND (params.event_year IS NULL OR log.event_year = params.event_year) + AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) + AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -83,8 +83,8 @@ energy_phase_C AS ( AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR log.event_month = params.event_month) - AND (params.event_year IS NULL OR log.event_year = params.event_year) + AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) + AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) GROUP BY 1,2,3,4,5 ) From e019774f5848c84754519497d978afd878c5c3e3 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:55:07 +0300 Subject: [PATCH 04/11] type fixing --- .../fact_hourly_energy_consumed.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql index c783a14..4d5cbc1 100644 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -3,7 +3,7 @@ WITH params AS ( NULL::uuid AS device_id, -- filter: specific device (or NULL for all) NULL::date AS input_date, -- filter: start date (or NULL for open range) NULL::text AS event_month, -- filter: MM-YYYY (or NULL for all) - NULL::int AS event_year, -- filter: YYYY (or NULL for all) + NULL::text AS event_year, -- filter: YYYY (or NULL for all) NULL::int AS hour, -- filter: hour of day (or NULL for all hours) NULL::int AS min_kw -- filter: min kW consumed (or NULL for no filter) ), @@ -24,7 +24,7 @@ total_energy AS ( AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) + AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -44,7 +44,7 @@ energy_phase_A AS ( AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) + AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -64,7 +64,7 @@ energy_phase_B AS ( AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) + AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -84,14 +84,14 @@ energy_phase_C AS ( AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR EXTRACT(YEAR FROM log.event_time)::int = params.event_year) + AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ) SELECT t.device_id, t.date, - t.event_year, + t.event_year::text, t.event_month, t.hour, (t.max_value - t.min_value) AS energy_consumed_kW, From d1bc7238347516439eed3c66241cceef52c41d82 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 23 Apr 2025 12:51:24 +0300 Subject: [PATCH 05/11] fix: include productName in device details response --- src/device/services/device.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/device/services/device.service.ts b/src/device/services/device.service.ts index b356acd..e00858c 100644 --- a/src/device/services/device.service.ts +++ b/src/device/services/device.service.ts @@ -679,12 +679,14 @@ export class DeviceService { }, }); // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { productId, id, uuid, name, ...rest } = camelCaseResponse.result; + const { productId, id, productName, uuid, name, ...rest } = + camelCaseResponse.result; return { ...rest, productUuid: product.uuid, name: deviceDetails.name, + productName: product.name, } as GetDeviceDetailsInterface; } catch (error) { console.log('error', error); From 6bc068c5e64e23e546be55dd5d2bd6a3b6cb4931 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 23 Apr 2025 13:06:42 +0300 Subject: [PATCH 06/11] add SQL query for hourly energy consumption analysis --- .../fact_hourly_energy_consumed_api.sql | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql new file mode 100644 index 0000000..31ad996 --- /dev/null +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql @@ -0,0 +1,62 @@ +WITH params AS ( + SELECT + 'd72f3d5d-02e5-4a9e-a1f7-7ab8c3534910'::uuid AS device_id, + NULL::date AS input_date, -- e.g., '2025-03-07' + NULL::text AS event_month, -- e.g., '03-2025' + '2025'::text AS event_year, -- e.g., '2025' + NULL::int AS hour, + NULL::int AS min_kw +), + +log_data AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time)::int AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS month, + TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') AS year, + log.code, + log.value::numeric AS value + FROM "device-status-log" log, params + WHERE (params.device_id IS NULL OR log.device_id = params.device_id) + AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) + AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) + AND (params.input_date IS NULL OR log.event_time::date = params.input_date) +), + +base_data AS ( + SELECT + device_id, + CASE + WHEN (SELECT input_date FROM params) IS NOT NULL THEN date::text + WHEN (SELECT event_month FROM params) IS NOT NULL THEN date::text + ELSE month + END AS group_by_field, + CASE + WHEN (SELECT input_date FROM params) IS NOT NULL THEN hour + ELSE NULL + END AS hour, + code, + MIN(value)::int AS min_value, + MAX(value)::int AS max_value + FROM log_data + GROUP BY 1,2,3,4 +), + +pivoted AS ( + SELECT + device_id, + group_by_field, + hour, + MAX(CASE WHEN code = 'EnergyConsumed' THEN max_value - min_value END) AS energy_consumed_kw, + MAX(CASE WHEN code = 'EnergyConsumedA' THEN max_value - min_value END) AS energy_consumed_a, + MAX(CASE WHEN code = 'EnergyConsumedB' THEN max_value - min_value END) AS energy_consumed_b, + MAX(CASE WHEN code = 'EnergyConsumedC' THEN max_value - min_value END) AS energy_consumed_c + FROM base_data + GROUP BY 1,2,3 +) + +SELECT * +FROM pivoted, params +WHERE (params.min_kw IS NULL OR energy_consumed_kw >= params.min_kw) +ORDER BY pivoted.group_by_field, pivoted.hour; From 516a8852510c857cd4f3f164765a30a3c14d86d4 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:54:09 +0300 Subject: [PATCH 07/11] removed all params --- .../fact_hourly_energy_consumed.sql | 46 ++------------ .../fact_hourly_energy_consumed_api.sql | 62 ------------------- 2 files changed, 5 insertions(+), 103 deletions(-) delete mode 100644 libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql index 4d5cbc1..0564743 100644 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed.sql @@ -1,14 +1,4 @@ -WITH params AS ( - SELECT - NULL::uuid AS device_id, -- filter: specific device (or NULL for all) - NULL::date AS input_date, -- filter: start date (or NULL for open range) - NULL::text AS event_month, -- filter: MM-YYYY (or NULL for all) - NULL::text AS event_year, -- filter: YYYY (or NULL for all) - NULL::int AS hour, -- filter: hour of day (or NULL for all hours) - NULL::int AS min_kw -- filter: min kW consumed (or NULL for no filter) -), - -total_energy AS ( +WITH total_energy AS ( SELECT log.device_id, log.event_time::date AS date, @@ -17,14 +7,8 @@ total_energy AS ( EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value - FROM "device-status-log" log, params + FROM "device-status-log" log WHERE log.code = 'EnergyConsumed' - AND (params.device_id IS NULL OR log.device_id = params.device_id) - AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) - AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) - AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -37,14 +21,8 @@ energy_phase_A AS ( EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value - FROM "device-status-log" log, params + FROM "device-status-log" log WHERE log.code = 'EnergyConsumedA' - AND (params.device_id IS NULL OR log.device_id = params.device_id) - AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) - AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) - AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -57,14 +35,8 @@ energy_phase_B AS ( EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value - FROM "device-status-log" log, params + FROM "device-status-log" log WHERE log.code = 'EnergyConsumedB' - AND (params.device_id IS NULL OR log.device_id = params.device_id) - AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) - AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) - AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ), @@ -77,14 +49,8 @@ energy_phase_C AS ( EXTRACT(YEAR FROM log.event_time)::int AS event_year, MIN(log.value)::integer AS min_value, MAX(log.value)::integer AS max_value - FROM "device-status-log" log, params + FROM "device-status-log" log WHERE log.code = 'EnergyConsumedC' - AND (params.device_id IS NULL OR log.device_id = params.device_id) - AND (params.input_date IS NULL OR log.event_time::date >= params.input_date) - AND (params.input_date IS NULL OR log.event_time::date <= params.input_date) - AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour) - AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) GROUP BY 1,2,3,4,5 ) @@ -102,6 +68,4 @@ FROM total_energy t JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour -JOIN params p ON TRUE -WHERE (p.min_kw IS NULL OR (t.max_value - t.min_value) >= p.min_kw) ORDER BY 1,2; \ No newline at end of file diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql deleted file mode 100644 index 31ad996..0000000 --- a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_api.sql +++ /dev/null @@ -1,62 +0,0 @@ -WITH params AS ( - SELECT - 'd72f3d5d-02e5-4a9e-a1f7-7ab8c3534910'::uuid AS device_id, - NULL::date AS input_date, -- e.g., '2025-03-07' - NULL::text AS event_month, -- e.g., '03-2025' - '2025'::text AS event_year, -- e.g., '2025' - NULL::int AS hour, - NULL::int AS min_kw -), - -log_data AS ( - SELECT - log.device_id, - log.event_time::date AS date, - EXTRACT(HOUR FROM log.event_time)::int AS hour, - TO_CHAR(log.event_time, 'MM-YYYY') AS month, - TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') AS year, - log.code, - log.value::numeric AS value - FROM "device-status-log" log, params - WHERE (params.device_id IS NULL OR log.device_id = params.device_id) - AND (params.event_year IS NULL OR TO_CHAR(EXTRACT(YEAR FROM log.event_time), 'FM9999') = params.event_year) - AND (params.event_month IS NULL OR TO_CHAR(log.event_time, 'MM-YYYY') = params.event_month) - AND (params.input_date IS NULL OR log.event_time::date = params.input_date) -), - -base_data AS ( - SELECT - device_id, - CASE - WHEN (SELECT input_date FROM params) IS NOT NULL THEN date::text - WHEN (SELECT event_month FROM params) IS NOT NULL THEN date::text - ELSE month - END AS group_by_field, - CASE - WHEN (SELECT input_date FROM params) IS NOT NULL THEN hour - ELSE NULL - END AS hour, - code, - MIN(value)::int AS min_value, - MAX(value)::int AS max_value - FROM log_data - GROUP BY 1,2,3,4 -), - -pivoted AS ( - SELECT - device_id, - group_by_field, - hour, - MAX(CASE WHEN code = 'EnergyConsumed' THEN max_value - min_value END) AS energy_consumed_kw, - MAX(CASE WHEN code = 'EnergyConsumedA' THEN max_value - min_value END) AS energy_consumed_a, - MAX(CASE WHEN code = 'EnergyConsumedB' THEN max_value - min_value END) AS energy_consumed_b, - MAX(CASE WHEN code = 'EnergyConsumedC' THEN max_value - min_value END) AS energy_consumed_c - FROM base_data - GROUP BY 1,2,3 -) - -SELECT * -FROM pivoted, params -WHERE (params.min_kw IS NULL OR energy_consumed_kw >= params.min_kw) -ORDER BY pivoted.group_by_field, pivoted.hour; From 59d526103c743e05b3d2ae80175398d1a14ec6cd Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:58:40 +0300 Subject: [PATCH 08/11] rebase from dev --- .../client/client.repository.module 2.ts | 9 +++++++++ .../src/modules/client/dtos/client.dto 2.ts | 20 +++++++++++++++++++ libs/common/src/type/express/index.d 2.ts | 9 +++++++++ src/space/dtos/space.parents.dto 2.ts | 7 +++++++ 4 files changed, 45 insertions(+) create mode 100644 libs/common/src/modules/client/client.repository.module 2.ts create mode 100644 libs/common/src/modules/client/dtos/client.dto 2.ts create mode 100644 libs/common/src/type/express/index.d 2.ts create mode 100644 src/space/dtos/space.parents.dto 2.ts diff --git a/libs/common/src/modules/client/client.repository.module 2.ts b/libs/common/src/modules/client/client.repository.module 2.ts new file mode 100644 index 0000000..af1f3b0 --- /dev/null +++ b/libs/common/src/modules/client/client.repository.module 2.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ClientEntity } from './entities'; + +@Module({ + imports: [TypeOrmModule.forFeature([ClientEntity])], + exports: [TypeOrmModule], +}) +export class ClientRepositoryModule {} diff --git a/libs/common/src/modules/client/dtos/client.dto 2.ts b/libs/common/src/modules/client/dtos/client.dto 2.ts new file mode 100644 index 0000000..fd12bc9 --- /dev/null +++ b/libs/common/src/modules/client/dtos/client.dto 2.ts @@ -0,0 +1,20 @@ +import { IsArray, IsNotEmpty, IsString } from 'class-validator'; + +export class ClientDto { + @IsString() + @IsNotEmpty() + public uuid: string; + + @IsString() + @IsNotEmpty() + public clientId: string; + @IsString() + @IsNotEmpty() + public clientSecret: string; + @IsString() + @IsNotEmpty() + public redirectUri: string; + @IsArray() + @IsNotEmpty() + public scopes: string[]; +} diff --git a/libs/common/src/type/express/index.d 2.ts b/libs/common/src/type/express/index.d 2.ts new file mode 100644 index 0000000..93008c2 --- /dev/null +++ b/libs/common/src/type/express/index.d 2.ts @@ -0,0 +1,9 @@ +import { File } from 'multer'; + +declare global { + namespace Express { + interface Request { + file?: File; + } + } +} \ No newline at end of file diff --git a/src/space/dtos/space.parents.dto 2.ts b/src/space/dtos/space.parents.dto 2.ts new file mode 100644 index 0000000..6858f55 --- /dev/null +++ b/src/space/dtos/space.parents.dto 2.ts @@ -0,0 +1,7 @@ +import { SpaceEntity } from '@app/common/modules/space/entities/space.entity'; +import { Expose } from 'class-transformer'; + +export class SpaceWithParentsDto extends SpaceEntity { + @Expose() + lastThreeParents: string; +} From ea1201307cabaf394bebe742b13d4399dbd81271 Mon Sep 17 00:00:00 2001 From: Dona Maria Absi <49731027+DonaAbsi@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:18:14 +0300 Subject: [PATCH 09/11] insert historical data --- ...urly_energy_consumed_insert_statements.sql | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_insert_statements.sql diff --git a/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_insert_statements.sql b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_insert_statements.sql new file mode 100644 index 0000000..fd0d955 --- /dev/null +++ b/libs/common/src/sql/queries/fact_hourly_energy_consumed/fact_hourly_energy_consumed_insert_statements.sql @@ -0,0 +1,135 @@ +WITH total_energy AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log + WHERE log.code = 'EnergyConsumed' + GROUP BY 1,2,3,4,5 +), + +energy_phase_A AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log + WHERE log.code = 'EnergyConsumedA' + GROUP BY 1,2,3,4,5 +), + +energy_phase_B AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log + WHERE log.code = 'EnergyConsumedB' + GROUP BY 1,2,3,4,5 +), + +energy_phase_C AS ( + SELECT + log.device_id, + log.event_time::date AS date, + EXTRACT(HOUR FROM log.event_time) AS hour, + TO_CHAR(log.event_time, 'MM-YYYY') AS event_month, + EXTRACT(YEAR FROM log.event_time)::int AS event_year, + MIN(log.value)::integer AS min_value, + MAX(log.value)::integer AS max_value + FROM "device-status-log" log + WHERE log.code = 'EnergyConsumedC' + GROUP BY 1,2,3,4,5 +) +, final_data as ( +SELECT + t.device_id, + t.date, + t.event_year::text, + t.event_month, + t.hour, + (t.max_value - t.min_value) AS energy_consumed_kW, + (a.max_value - a.min_value) AS energy_consumed_A, + (b.max_value - b.min_value) AS energy_consumed_B, + (c.max_value - c.min_value) AS energy_consumed_C +FROM total_energy t +JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour +JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour +JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour +ORDER BY 1,2) + + +INSERT INTO public."power-clamp-energy-consumed-daily"( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + date +) + +SELECT + device_id, + SUM(CAST(energy_consumed_kw AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_a AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_b AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_c AS NUMERIC))::VARCHAR, + date +FROM final_data +GROUP BY device_id, date; + + + +INSERT INTO public."power-clamp-energy-consumed-hourly"( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + date, + hour +) + +SELECT + device_id, + SUM(CAST(energy_consumed_kw AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_a AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_b AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_c AS NUMERIC))::VARCHAR, + date, + hour +FROM final_data +GROUP BY 1,6,7 + + +INSERT INTO public."power-clamp-energy-consumed-monthly"( + device_uuid, + energy_consumed_kw, + energy_consumed_a, + energy_consumed_b, + energy_consumed_c, + month +) + +SELECT + device_id, + SUM(CAST(energy_consumed_kw AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_a AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_b AS NUMERIC))::VARCHAR, + SUM(CAST(energy_consumed_c AS NUMERIC))::VARCHAR, + TO_CHAR(date, 'MM-YYYY') + FROM final_data +GROUP BY 1,6; + From 5490b5781db3534f3cfff48a72bcfcb4008c748f Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:55:57 +0300 Subject: [PATCH 10/11] fix deployment error --- libs/common/src/type/express/index.d 2.ts | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 libs/common/src/type/express/index.d 2.ts diff --git a/libs/common/src/type/express/index.d 2.ts b/libs/common/src/type/express/index.d 2.ts deleted file mode 100644 index 93008c2..0000000 --- a/libs/common/src/type/express/index.d 2.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { File } from 'multer'; - -declare global { - namespace Express { - interface Request { - file?: File; - } - } -} \ No newline at end of file From 61a7e1c742bdb6807be7cbf641425b9614d0a59b Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:58:42 +0300 Subject: [PATCH 11/11] remove unused client and space DTOs and repository module --- .../client/client.repository.module 2.ts | 9 --------- .../src/modules/client/dtos/client.dto 2.ts | 20 ------------------- src/space/dtos/space.parents.dto 2.ts | 7 ------- 3 files changed, 36 deletions(-) delete mode 100644 libs/common/src/modules/client/client.repository.module 2.ts delete mode 100644 libs/common/src/modules/client/dtos/client.dto 2.ts delete mode 100644 src/space/dtos/space.parents.dto 2.ts diff --git a/libs/common/src/modules/client/client.repository.module 2.ts b/libs/common/src/modules/client/client.repository.module 2.ts deleted file mode 100644 index af1f3b0..0000000 --- a/libs/common/src/modules/client/client.repository.module 2.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { ClientEntity } from './entities'; - -@Module({ - imports: [TypeOrmModule.forFeature([ClientEntity])], - exports: [TypeOrmModule], -}) -export class ClientRepositoryModule {} diff --git a/libs/common/src/modules/client/dtos/client.dto 2.ts b/libs/common/src/modules/client/dtos/client.dto 2.ts deleted file mode 100644 index fd12bc9..0000000 --- a/libs/common/src/modules/client/dtos/client.dto 2.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IsArray, IsNotEmpty, IsString } from 'class-validator'; - -export class ClientDto { - @IsString() - @IsNotEmpty() - public uuid: string; - - @IsString() - @IsNotEmpty() - public clientId: string; - @IsString() - @IsNotEmpty() - public clientSecret: string; - @IsString() - @IsNotEmpty() - public redirectUri: string; - @IsArray() - @IsNotEmpty() - public scopes: string[]; -} diff --git a/src/space/dtos/space.parents.dto 2.ts b/src/space/dtos/space.parents.dto 2.ts deleted file mode 100644 index 6858f55..0000000 --- a/src/space/dtos/space.parents.dto 2.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SpaceEntity } from '@app/common/modules/space/entities/space.entity'; -import { Expose } from 'class-transformer'; - -export class SpaceWithParentsDto extends SpaceEntity { - @Expose() - lastThreeParents: string; -}