Skip to content

Commit b4af680

Browse files
committed
CQ: Update Query 27 mapping for replaced-layer anatomical nodes (#42)
1 parent 2fe6781 commit b4af680

1 file changed

Lines changed: 114 additions & 102 deletions

File tree

mapserver/competency/queries.d/query_27.yaml

Lines changed: 114 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -2,122 +2,134 @@ queries:
22
- id: 27
33
label: Node mapping from sckan to map
44
sql: >
5-
WITH node_mappings AS (
6-
SELECT DISTINCT
7-
sckan.sckan_id,
8-
sckan.path_id,
9-
sckan.sckan_node_id,
10-
map.source_id,
11-
map.node_id
12-
FROM (
13-
SELECT
14-
source_id AS sckan_id,
15-
path_id,
16-
node_id AS sckan_node_id
17-
FROM path_nodes
18-
WHERE source_id IN (
19-
SELECT sckan_id
20-
FROM path_node_mappings
21-
WHERE %CONDITION_1%
22-
)
23-
AND %CONDITION_0%
24-
) AS sckan
25-
LEFT JOIN (
26-
SELECT
27-
source_id,
28-
path_id,
29-
node_id,
30-
sckan_id,
31-
sckan_node_id
32-
FROM path_node_mappings
33-
WHERE %CONDITION_1%
34-
AND %CONDITION_0%
35-
) AS map
36-
ON sckan.path_id = map.path_id
37-
AND sckan.sckan_node_id = map.sckan_node_id
5+
WITH node_sckan AS (
6+
SELECT
7+
pn.source_id,
8+
pn.path_id,
9+
pn.node_id,
10+
jsonb_build_array(pn.node_id::jsonb ->> 0)
11+
|| (pn.node_id::jsonb -> 1) AS node_array,
12+
pn.node_id::jsonb -> 1 AS path_array,
13+
jsonb_array_length(jsonb_build_array(pn.node_id::jsonb ->> 0)
14+
|| (pn.node_id::jsonb -> 1)) AS node_len,
15+
jsonb_array_length(pn.node_id::jsonb -> 1) AS path_len
16+
FROM path_nodes pn
17+
WHERE source_id IN
18+
(SELECT sckan_id FROM knowledge_sources
19+
WHERE %CONDITION_1% )
20+
AND %CONDITION_0%
21+
),
22+
node_map AS (
23+
SELECT
24+
pn.source_id,
25+
pn.path_id,
26+
pn.node_id,
27+
jsonb_build_array(pn.node_id::jsonb ->> 0)
28+
|| (pn.node_id::jsonb -> 1) AS node_array,
29+
pn.node_id::jsonb -> 1 AS path_array,
30+
jsonb_array_length(jsonb_build_array(pn.node_id::jsonb ->> 0)
31+
|| (pn.node_id::jsonb -> 1)) AS node_len,
32+
jsonb_array_length(pn.node_id::jsonb -> 1) AS path_len
33+
FROM path_nodes pn
34+
WHERE %CONDITION_1%
35+
AND %CONDITION_0%
36+
),
37+
node_contained AS (
38+
SELECT DISTINCT
39+
s2.source_id AS source_id,
40+
s1.path_id AS path_id,
41+
s1.node_id AS node_id,
42+
s1.source_id AS sckan_id,
43+
s1.node_id AS sckan_node_id
44+
FROM node_sckan s1
45+
JOIN node_map s2
46+
ON s1.path_id = s2.path_id
47+
WHERE
48+
s1.node_id != s2.node_id
49+
AND s1.node_len <= s2.path_len
50+
AND s1.node_array <@ s2.path_array
51+
),
52+
combined_node_mappings AS (
53+
SELECT * FROM path_node_mappings
54+
WHERE %CONDITION_1%
55+
AND %CONDITION_0%
56+
UNION
57+
SELECT * FROM node_contained
58+
),
59+
node_mappings AS (
60+
SELECT DISTINCT
61+
pn.source_id AS sckan_id,
62+
pn.path_id,
63+
pn.node_id AS sckan_node_id,
64+
map.source_id,
65+
map.node_id
66+
FROM path_nodes pn
67+
LEFT JOIN combined_node_mappings map
68+
ON pn.node_id = map.sckan_node_id
69+
AND pn.source_id = map.sckan_id
70+
AND pn.path_id = map.path_id
71+
WHERE (pn.source_id, pn.path_id) IN ( SELECT sckan_id, path_id FROM combined_node_mappings)
3872
),
3973
4074
sckan_labels AS (
4175
SELECT
42-
sckan_id,
43-
sckan_node_id,
44-
string_agg(label, ', ' ORDER BY pos) AS sckan_node_label
45-
FROM (
46-
SELECT DISTINCT
47-
nm.sckan_id,
48-
nm.sckan_node_id,
49-
pt.label,
50-
seq.pos
51-
FROM node_mappings nm
52-
JOIN path_node_features pnf
53-
ON nm.sckan_id = pnf.source_id
54-
AND nm.path_id = pnf.path_id
55-
AND nm.sckan_node_id = pnf.node_id
56-
JOIN feature_terms pt
57-
ON pnf.source_id = pt.source_id
58-
AND pnf.feature_id = pt.term_id
59-
CROSS JOIN LATERAL (
60-
SELECT pos
61-
FROM (
62-
SELECT pnf.node_id::jsonb->>0 AS value, 1 AS pos
63-
UNION ALL
64-
SELECT value, ordinality + 1 AS pos
65-
FROM jsonb_array_elements_text(pnf.node_id::jsonb->1) WITH ORDINALITY
66-
) s
67-
WHERE s.value = pt.term_id
68-
) seq
69-
) AS dedup
70-
GROUP BY sckan_id, sckan_node_id
76+
nm.sckan_id,
77+
nm.path_id,
78+
nm.sckan_node_id,
79+
string_agg(ft.label, ', ' ORDER BY ft.label) AS sckan_node_label
80+
FROM node_mappings nm
81+
CROSS JOIN LATERAL (
82+
SELECT jsonb_array_elements_text(
83+
jsonb_build_array(nm.sckan_node_id::jsonb ->> 0)
84+
|| (nm.sckan_node_id::jsonb -> 1)
85+
) AS term_id
86+
) terms
87+
JOIN feature_terms ft
88+
ON ft.term_id = terms.term_id
89+
AND ft.source_id = nm.sckan_id
90+
GROUP BY
91+
nm.sckan_id,
92+
nm.path_id,
93+
nm.sckan_node_id
7194
),
7295
7396
map_labels AS (
7497
SELECT
75-
source_id,
76-
node_id,
77-
string_agg(label, ', ' ORDER BY pos) AS node_label
78-
FROM (
79-
SELECT DISTINCT
80-
nm.source_id,
81-
nm.node_id,
82-
pt.label,
83-
seq.pos
84-
FROM node_mappings nm
85-
JOIN path_node_features pnf
86-
ON nm.source_id = pnf.source_id
87-
AND nm.path_id = pnf.path_id
88-
AND nm.node_id = pnf.node_id
89-
JOIN feature_terms pt
90-
ON pnf.source_id = pt.source_id
91-
AND pnf.feature_id = pt.term_id
92-
CROSS JOIN LATERAL (
93-
SELECT pos
94-
FROM (
95-
SELECT pnf.node_id::jsonb->>0 AS value, 1 AS pos
96-
UNION ALL
97-
SELECT value, ordinality + 1 AS pos
98-
FROM jsonb_array_elements_text(pnf.node_id::jsonb->1) WITH ORDINALITY
99-
) s
100-
WHERE s.value = pt.term_id
101-
) seq
102-
) AS dedup
103-
GROUP BY source_id, node_id
98+
nm.source_id,
99+
nm.path_id,
100+
nm.node_id,
101+
string_agg(ft.label, ', ' ORDER BY ft.label) AS node_label
102+
FROM node_mappings nm
103+
CROSS JOIN LATERAL (
104+
SELECT jsonb_array_elements_text(
105+
jsonb_build_array(nm.node_id::jsonb ->> 0)
106+
|| (nm.node_id::jsonb -> 1)
107+
) AS term_id
108+
) terms
109+
JOIN feature_terms ft
110+
ON ft.term_id = terms.term_id
111+
AND ft.source_id = nm.source_id
112+
GROUP BY
113+
nm.source_id,
114+
nm.path_id,
115+
nm.node_id
104116
)
105117
106118
SELECT
107-
nm.sckan_id,
108-
nm.path_id,
109-
nm.sckan_node_id,
110-
UPPER(SUBSTRING(sl.sckan_node_label, 1, 1)) ||
111-
SUBSTRING(sl.sckan_node_label, 2) AS sckan_node_label,
112-
COALESCE(nm.source_id, '') AS source_id,
113-
COALESCE(nm.node_id, '') AS node_id,
114-
COALESCE(UPPER(SUBSTRING(ml.node_label, 1, 1)) ||
115-
SUBSTRING(ml.node_label, 2), '') AS node_label
119+
nm.sckan_id,
120+
nm.path_id,
121+
nm.sckan_node_id,
122+
UPPER(SUBSTRING(sl.sckan_node_label, 1, 1)) ||
123+
SUBSTRING(sl.sckan_node_label, 2) AS sckan_node_label,
124+
COALESCE(nm.source_id, '') AS source_id,
125+
COALESCE(nm.node_id, '') AS node_id,
126+
COALESCE(UPPER(SUBSTRING(ml.node_label, 1, 1)) ||
127+
SUBSTRING(ml.node_label, 2), '') AS node_label
116128
FROM node_mappings nm
117129
NATURAL JOIN sckan_labels sl
118130
LEFT JOIN map_labels ml
119-
ON nm.source_id = ml.source_id
120-
AND nm.node_id = ml.node_id;
131+
ON nm.source_id = ml.source_id
132+
AND nm.node_id = ml.node_id;
121133
parameters:
122134
- id: path_id
123135
column: path_id

0 commit comments

Comments
 (0)