Files
wwtools/grdb/queries/hierarchy.sql
Joseph Doherty 32f26272ae Initial commit: Wonderware / System Platform tools and reference
Five tools under one repo, all docs organized per DOCS-GUIDE.md:

- aalogcli: .NET 4.8 / x86 CliFx CLI for reading System Platform binary
  logs (*.aaLGX) for LLM debugging, built on aaOpenSource/aaLog. Commands:
  last, tail, range, unread, fields. Stable JSON envelope under --llm-json.
  Build template under lib/build/ for rebuilding aaLogReader.dll.

- aot: ArchestrA Object Toolkit 2014 v4.0 reference material. Dev guide
  (Markdown converted from CHM), API reference for the ArchestrA.Toolkit
  namespace, and the Monitor / Watchdog VS sample solutions.

- graccesscli: .NET 4.8 / x86 CliFx CLI that automates Galaxy
  configuration via the ArchestrA GRAccess COM interop. Includes session
  daemon, IPC protocol, and llm-json envelope contract.

- grdb: SQL/DDL exploration of the Galaxy Repository database. DDL
  captures, reusable queries, hierarchy / contained-name <-> tag-name
  translation notes.

- histdb: LLM-oriented reference for AVEVA Historian retrieval. INSQL
  linked-server, extension tables, every wwXxx time-domain extension,
  every retrieval mode, alarm/event SQL recipes, REST API. Distilled
  from the 243-page Historian Retrieval Guide.

Root contains:
- CLAUDE.md: thin index pointing into each tool's README.
- DOCS-GUIDE.md: doctrine for organizing docs for LLM consumption.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 18:22:20 -04:00

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;