-- Alerting projections — additive and idempotent (IF NOT EXISTS).
-- Safe to run on every startup alongside init.sql.
--
-- NOTE: executions uses ReplacingMergeTree which requires deduplicate_merge_projection_mode='rebuild'
-- to support projections (ClickHouse 24.x). The ADD PROJECTION and MATERIALIZE statements for
-- executions are treated as best-effort by the schema initializer (non-fatal on failure).
-- logs and agent_metrics use plain MergeTree and always succeed.
--
-- MATERIALIZE statements are also wrapped as non-fatal to handle empty tables in fresh deployments.

-- Plain MergeTree tables: always succeed
ALTER TABLE logs
    ADD PROJECTION IF NOT EXISTS alerting_app_level
    (SELECT * ORDER BY (tenant_id, environment, application, level, timestamp));

ALTER TABLE agent_metrics
    ADD PROJECTION IF NOT EXISTS alerting_instance_metric
    (SELECT * ORDER BY (tenant_id, environment, instance_id, metric_name, collected_at));

-- ReplacingMergeTree tables: best-effort (requires deduplicate_merge_projection_mode='rebuild')
ALTER TABLE executions
    ADD PROJECTION IF NOT EXISTS alerting_app_status
    (SELECT * ORDER BY (tenant_id, environment, application_id, status, start_time));

ALTER TABLE executions
    ADD PROJECTION IF NOT EXISTS alerting_route_status
    (SELECT * ORDER BY (tenant_id, environment, route_id, status, start_time));

-- MATERIALIZE: best-effort on all tables (non-fatal if table is empty or already running)
ALTER TABLE logs          MATERIALIZE PROJECTION alerting_app_level;
ALTER TABLE agent_metrics MATERIALIZE PROJECTION alerting_instance_metric;
ALTER TABLE executions    MATERIALIZE PROJECTION alerting_app_status;
ALTER TABLE executions    MATERIALIZE PROJECTION alerting_route_status;
