1+ --
2+ -- Copyright (c) UChicago Argonne, LLC. All rights reserved.
3+ -- See LICENSE file.
4+ --
5+
6+ -- Execute by running `mysql CDB_DB_NAME --host=127.0.0.1 --user=cdb -p < updateTo3.15.4.sql`
7+
8+
9+ delimiter //
10+
11+ DROP PROCEDURE IF EXISTS is_item_relationship_have_circular_reference;//
12+ CREATE PROCEDURE ` is_item_relationship_have_circular_reference` (IN relationship_type_id int , IN parent_item_id int , IN proposed_child_item_id int )
13+ BEGIN
14+ -- Get all parents for the existing parent item.
15+ SELECT * FROM item WHERE ID IN (
16+ WITH RECURSIVE parent_relationship_hierarchy AS (
17+ SELECT *
18+ FROM v_relationship_hierarchy vrh
19+ WHERE vrh .child_item_id = parent_item_id
20+ AND vrh .relationship_type_id = relationship_type_id
21+ UNION
22+ SELECT vrh2.*
23+ FROM v_relationship_hierarchy vrh2, parent_relationship_hierarchy a
24+ WHERE vrh2 .child_item_id = a .parent_item_id
25+ AND vrh2 .relationship_type_id = relationship_type_id
26+ )
27+ SELECT prh .parent_item_id
28+ FROM parent_relationship_hierarchy prh
29+ ) and ID IN (
30+ -- Compare if any children match the parent in proposed children items.
31+ SELECT id FROM item WHERE
32+ -- Ensure single level circular reference doesn't occur.
33+ ID = proposed_child_item_id
34+ OR ID IN (
35+ WITH RECURSIVE child_relationship_hierarchy AS (
36+ SELECT *
37+ FROM v_relationship_hierarchy vrh
38+ WHERE vrh .parent_item_id = proposed_child_item_id
39+ AND vrh .relationship_type_id = relationship_type_id
40+ UNION
41+ SELECT vrh2.*
42+ FROM v_relationship_hierarchy vrh2, child_relationship_hierarchy a
43+ WHERE vrh2 .parent_item_id = a .child_item_id
44+ AND vrh2 .relationship_type_id = relationship_type_id
45+ )
46+ SELECT crh .child_item_id
47+ FROM child_relationship_hierarchy crh)
48+ );
49+ END //
0 commit comments