From de42c120893a97088e8a79cf2cf5c41d219ecffe Mon Sep 17 00:00:00 2001 From: devsjc <47188100+devsjc@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:10:39 +0100 Subject: [PATCH 1/2] fix(sql): Partition pruning in deltas sql --- internal/server/postgres/sql/queries/predictions.sql | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/server/postgres/sql/queries/predictions.sql b/internal/server/postgres/sql/queries/predictions.sql index 0a9347e..aa26b7e 100644 --- a/internal/server/postgres/sql/queries/predictions.sql +++ b/internal/server/postgres/sql/queries/predictions.sql @@ -400,16 +400,18 @@ relevant_predicted_values AS ( deltas AS ( SELECT rv.geometry_uuid, - rv.source_type_id, - rv.forecast_uuid, - rv.target_time_utc, rv.horizon_mins, rv.p50_sip - og.value_sip AS delta_sip FROM relevant_predicted_values AS rv - LEFT OUTER JOIN obs.observed_generation_values AS og USING (geometry_uuid, source_type_id) + INNER JOIN obs.observed_generation_values AS og + ON og.geometry_uuid = rv.geometry_uuid + AND og.source_type_id = rv.source_type_id + AND og.observation_timestamp_utc = rv.target_time_utc WHERE og.observer_uuid = $3 - AND og.observation_timestamp_utc = rv.target_time_utc + AND og.geometry_uuid = ANY(sqlc.arg(geometry_uuids)::UUID []) + AND og.observation_timestamp_utc >= sqlc.arg(pivot_timestamp)::TIMESTAMP - INTERVAL '8 days' + AND og.observation_timestamp_utc < sqlc.arg(pivot_timestamp)::TIMESTAMP + INTERVAL '1 millisecond' ) SELECT d.geometry_uuid, From 5ec31959afb94b5e6e87e23f49abc4f12fb294b1 Mon Sep 17 00:00:00 2001 From: devsjc <47188100+devsjc@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:12:49 +0100 Subject: [PATCH 2/2] chore(repo): Linting --- internal/server/postgres/dataserverimpl_test.go | 8 ++++---- internal/server/postgres/sql/queries/predictions.sql | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/server/postgres/dataserverimpl_test.go b/internal/server/postgres/dataserverimpl_test.go index d52b5ea..6a4a946 100644 --- a/internal/server/postgres/dataserverimpl_test.go +++ b/internal/server/postgres/dataserverimpl_test.go @@ -921,10 +921,10 @@ func TestGetForecastAsTimeseries(t *testing.T) { } resp, err := dc.GetForecastAsTimeseries(t.Context(), &pb.GetForecastAsTimeseriesRequest{ - LocationUuid: siteResp.LocationUuid, - HorizonMins: uint32(tc.horizonMins), - Forecaster: forecasterResp.Forecaster, - EnergySource: pb.EnergySource_ENERGY_SOURCE_SOLAR, + LocationUuid: siteResp.LocationUuid, + HorizonMins: uint32(tc.horizonMins), + Forecaster: forecasterResp.Forecaster, + EnergySource: pb.EnergySource_ENERGY_SOURCE_SOLAR, TimeWindow: &pb.TimeWindow{ StartTimestampUtc: timestamppb.New(pivotTime.Add(-time.Hour * 48)), EndTimestampUtc: timestamppb.New(pivotTime.Add(time.Hour * 36)), diff --git a/internal/server/postgres/sql/queries/predictions.sql b/internal/server/postgres/sql/queries/predictions.sql index aa26b7e..73219fb 100644 --- a/internal/server/postgres/sql/queries/predictions.sql +++ b/internal/server/postgres/sql/queries/predictions.sql @@ -404,9 +404,9 @@ deltas AS ( rv.p50_sip - og.value_sip AS delta_sip FROM relevant_predicted_values AS rv INNER JOIN obs.observed_generation_values AS og - ON og.geometry_uuid = rv.geometry_uuid - AND og.source_type_id = rv.source_type_id - AND og.observation_timestamp_utc = rv.target_time_utc + ON rv.geometry_uuid = og.geometry_uuid + AND rv.source_type_id = og.source_type_id + AND rv.target_time_utc = og.observation_timestamp_utc WHERE og.observer_uuid = $3 AND og.geometry_uuid = ANY(sqlc.arg(geometry_uuids)::UUID [])