From 5573f2a2291d3ce4a54b778498c584e98471b640 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sun, 14 Jun 2026 02:33:14 -0400 Subject: [PATCH] galaxy(alarms): drop dead primitive branch from AlarmAttributesSql B5: the candidate CTE's src_pri=1 (primitive-instance) UNION ALL branch was always excluded by the final WHERE r.src_pri=0, so it added work with no output change. Remove the branch and the now-constant src_pri column/filter. An alarm anchor is always a user attribute, so output is identical. --- .../Galaxy/GalaxyRepository.cs | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/src/ZB.MOM.WW.MxGateway.Server/Galaxy/GalaxyRepository.cs b/src/ZB.MOM.WW.MxGateway.Server/Galaxy/GalaxyRepository.cs index a934466..d8922fd 100644 --- a/src/ZB.MOM.WW.MxGateway.Server/Galaxy/GalaxyRepository.cs +++ b/src/ZB.MOM.WW.MxGateway.Server/Galaxy/GalaxyRepository.cs @@ -308,11 +308,13 @@ LEFT JOIN data_type dt ON dt.mx_data_type = r.mx_data_type WHERE r.rn = 1 ORDER BY r.tag_name, r.attribute_name"; - // Alarm-only discovery for the subtag-fallback watch-list. This deliberately reuses the - // exact candidate/ranked CTE structure and the same `AlarmExtension`-based is_alarm - // detection as AttributesSql so the two queries cannot drift: a row qualifies only when - // its user attribute (src_pri 0) anchors an `AlarmExtension` primitive on the owning - // object. It projects just what the watch-list needs — full_tag_reference (tag_name + + // Alarm-only discovery for the subtag-fallback watch-list. This reuses the candidate/ranked + // CTE shape and the same `AlarmExtension`-based detection as AttributesSql. Unlike + // AttributesSql it keeps only the user-attribute (dynamic_attribute) candidate branch: an + // alarm anchor is always a user attribute, so the primitive-instance branch AttributesSql + // carries would be filtered out here anyway — a row qualifies only when its user attribute + // anchors an `AlarmExtension` primitive on the owning object. It projects just what the + // watch-list needs — full_tag_reference (tag_name + // '.' + attribute_name, matching AttributesSql) and the owning object's tag_name as // source_object_reference. The array `[]` suffix is intentionally omitted: an // alarm-bearing attribute is a scalar anchor, not an array body. It also projects the @@ -332,7 +334,7 @@ ORDER BY r.tag_name, r.attribute_name"; ), candidate AS ( SELECT - dpc.gobject_id, g.tag_name, da.attribute_name, dpc.depth, 0 AS src_pri + dpc.gobject_id, g.tag_name, da.attribute_name, dpc.depth FROM deployed_package_chain dpc INNER JOIN dynamic_attribute da ON da.package_id = dpc.package_id INNER JOIN gobject g ON g.gobject_id = dpc.gobject_id @@ -341,25 +343,10 @@ candidate AS ( AND da.attribute_name NOT LIKE '[_]%' AND da.attribute_name NOT LIKE '%.Description' AND da.mx_attribute_category IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 24) - UNION ALL - SELECT - dpc.gobject_id, g.tag_name, - CASE WHEN pi.primitive_name IS NULL OR pi.primitive_name = '' - THEN ad.attribute_name - ELSE pi.primitive_name + '.' + ad.attribute_name END AS attribute_name, - dpc.depth, 1 AS src_pri - FROM deployed_package_chain dpc - INNER JOIN primitive_instance pi ON pi.package_id = dpc.package_id - INNER JOIN attribute_definition ad ON ad.primitive_definition_id = pi.primitive_definition_id - INNER JOIN gobject g ON g.gobject_id = dpc.gobject_id - INNER JOIN template_definition td ON td.template_definition_id = g.template_definition_id - WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26) - AND ad.attribute_name NOT LIKE '[_]%' - AND ad.attribute_name NOT LIKE '%.Description' ), ranked AS ( SELECT c.*, ROW_NUMBER() OVER ( - PARTITION BY c.gobject_id, c.attribute_name ORDER BY c.src_pri, c.depth) AS rn + PARTITION BY c.gobject_id, c.attribute_name ORDER BY c.depth) AS rn FROM candidate c ) SELECT @@ -370,7 +357,6 @@ FROM ranked r INNER JOIN gobject g ON g.gobject_id = r.gobject_id LEFT JOIN gobject area ON area.gobject_id = g.area_gobject_id WHERE r.rn = 1 - AND r.src_pri = 0 AND EXISTS ( SELECT 1 FROM deployed_package_chain dpc2 INNER JOIN primitive_instance pi ON pi.package_id = dpc2.package_id AND pi.primitive_name = r.attribute_name