90 lines
3.2 KiB
SQL
90 lines
3.2 KiB
SQL
-- Galaxy Object Hierarchy for OPC UA Server
|
|
-- Returns the parent-child hierarchy with both browse names (contained_name) and tag names.
|
|
-- Use browse_name for OPC UA browse tree display.
|
|
-- Use tag_name for runtime read/write tag references.
|
|
--
|
|
-- Derived from internal_automation_object_model_hierarchy_view2 logic:
|
|
-- - gobject: provides hierarchy (contained_by_gobject_id, area_gobject_id) and names
|
|
-- - template_definition: category_id filters to automation-relevant objects
|
|
--
|
|
-- Category IDs:
|
|
-- 1 = $WinPlatform (platform objects)
|
|
-- 3 = $AppEngine (application engines)
|
|
-- 4 = $InTouchViewApp (InTouch view apps)
|
|
-- 10 = $UserDefined (user-defined automation objects)
|
|
-- 11 = $FieldReference (field reference objects)
|
|
-- 13 = $Area (areas / folders)
|
|
-- 17 = $DIObject (DI objects)
|
|
-- 24 = $DDESuiteLinkClient
|
|
-- 26 = $OPCClient
|
|
--
|
|
-- template_chain (new): pipe-delimited list of template tag_names walking
|
|
-- gobject.derived_from_gobject_id from the instance upward. Index 0 is the
|
|
-- object's own immediate template, the last entry is the most ancestral
|
|
-- template before $Object. Mirrors the deployed_package_chain CTE pattern
|
|
-- in attributes.sql. Consumed by AlarmObjectFilter for template-based
|
|
-- alarm filtering with wildcard support.
|
|
|
|
;WITH template_chain AS (
|
|
-- Start from each non-template deployed instance's own template
|
|
SELECT
|
|
g.gobject_id AS instance_gobject_id,
|
|
t.gobject_id AS template_gobject_id,
|
|
t.tag_name AS template_tag_name,
|
|
t.derived_from_gobject_id,
|
|
0 AS depth
|
|
FROM gobject g
|
|
INNER JOIN gobject t
|
|
ON t.gobject_id = g.derived_from_gobject_id
|
|
WHERE g.is_template = 0
|
|
AND g.deployed_package_id <> 0
|
|
AND g.derived_from_gobject_id <> 0
|
|
UNION ALL
|
|
-- Walk up the template derivation chain
|
|
SELECT
|
|
tc.instance_gobject_id,
|
|
t.gobject_id,
|
|
t.tag_name,
|
|
t.derived_from_gobject_id,
|
|
tc.depth + 1
|
|
FROM template_chain tc
|
|
INNER JOIN gobject t
|
|
ON t.gobject_id = tc.derived_from_gobject_id
|
|
WHERE tc.derived_from_gobject_id <> 0 AND tc.depth < 10
|
|
)
|
|
SELECT DISTINCT
|
|
g.gobject_id,
|
|
g.tag_name,
|
|
g.contained_name,
|
|
CASE WHEN g.contained_name IS NULL OR g.contained_name = ''
|
|
THEN g.tag_name
|
|
ELSE g.contained_name
|
|
END AS browse_name,
|
|
CASE WHEN g.contained_by_gobject_id = 0
|
|
THEN g.area_gobject_id
|
|
ELSE g.contained_by_gobject_id
|
|
END AS parent_gobject_id,
|
|
CASE WHEN td.category_id = 13
|
|
THEN 1
|
|
ELSE 0
|
|
END AS is_area,
|
|
td.category_id AS category_id,
|
|
g.hosted_by_gobject_id AS hosted_by_gobject_id,
|
|
ISNULL(
|
|
STUFF((
|
|
SELECT '|' + tc.template_tag_name
|
|
FROM template_chain tc
|
|
WHERE tc.instance_gobject_id = g.gobject_id
|
|
ORDER BY tc.depth
|
|
FOR XML PATH('')
|
|
), 1, 1, ''),
|
|
''
|
|
) AS template_chain
|
|
FROM gobject g
|
|
INNER JOIN template_definition td
|
|
ON g.template_definition_id = td.template_definition_id
|
|
WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26)
|
|
AND g.is_template = 0
|
|
AND g.deployed_package_id <> 0
|
|
ORDER BY parent_gobject_id, g.tag_name;
|