@@ -38,55 +38,69 @@ queries:
3838 ),
3939
4040 sckan_labels AS (
41- SELECT
42- nm.sckan_id,
43- nm.sckan_node_id,
44- string_agg(pt.label, ', ' ORDER BY seq.pos) AS sckan_node_label
45- FROM node_mappings nm
46- JOIN path_node_features pnf
47- ON nm.sckan_id = pnf.source_id
48- AND nm.path_id = pnf.path_id
49- AND nm.sckan_node_id = pnf.node_id
50- JOIN feature_terms pt
51- ON pnf.source_id = pt.source_id
52- AND pnf.feature_id = pt.term_id
53- CROSS JOIN LATERAL (
54- SELECT pos
55- FROM (
56- SELECT pnf.node_id::jsonb->>0 AS value, 1 AS pos
57- UNION ALL
58- SELECT value, ordinality + 1 AS pos
59- FROM jsonb_array_elements_text(pnf.node_id::jsonb->1) WITH ORDINALITY
60- ) s
61- WHERE s.value = pt.term_id
62- ) AS seq
63- GROUP BY nm.sckan_id, nm.sckan_node_id
41+ 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
6471 ),
6572
6673 map_labels AS (
67- SELECT
68- nm.source_id,
69- nm.node_id,
70- string_agg(pt.label, ', ' ORDER BY seq.pos) AS node_label
71- FROM node_mappings nm
72- JOIN path_node_features pnf
73- ON nm.source_id = pnf.source_id
74- AND nm.path_id = pnf.path_id
75- AND nm.node_id = pnf.node_id
76- JOIN feature_terms pt
77- ON pnf.source_id = pt.source_id
78- AND pnf.feature_id = pt.term_id
79- CROSS JOIN LATERAL (
80- SELECT pos
81- FROM (
82- SELECT pnf.node_id::jsonb->>0 AS value, 1 AS pos
83- UNION ALL
84- SELECT value, ordinality + 1 AS pos
85- FROM jsonb_array_elements_text(pnf.node_id::jsonb->1) WITH ORDINALITY
86- ) s
87- WHERE s.value = pt.term_id
88- ) AS seq
89- GROUP BY nm.source_id, nm.node_id
74+ 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
90104 )
91105
92106 SELECT
0 commit comments