@@ -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