--- This change addresses the problem mentioned in --- https://cvs.openacs.org/changelog/OpenACS?cs=oacs-5-10%3Agustafn%3A20220729185340 --- https://github.com/openacs/openacs-core/commit/be44691f06627678122bd913bc3c95c80e93f403 --- --- which happens in some legacy applications (such as --- e.g. openacs.org) where the data types of the following two --- attributes are different. --- --- acs_object_types.object_type --- acs_objects.object_type --- --- On new installations (at least concerning the last 10 years) these --- data types are the same. So, probably an update script was missing --- ages ago. --- --- Since this change affects the basic object structure, MANY views --- depend on this datatype and have to be dropped and recreate to --- allow the correction of the datatype. --- --- Therefore, we do not want to run this script on all sites, but --- only on those where it is necessary. --- DO $$ DECLARE v_found boolean; BEGIN -- The following views exists on some (?) legacy installations -- (e.g. openacs.org), but are not created/used in recent versions -- of OpenACS. drop view if exists acs_grantee_party_map; -- legacy view drop view if exists party_element_map; -- legacy view SELECT exists( SELECT column_name, data_type, character_maximum_length, character_octet_length FROM information_schema.columns WHERE table_schema='public' AND table_name = 'acs_object_types' AND column_name='object_type' AND character_maximum_length != 1000 ) INTO v_found; IF v_found THEN drop view rel_seg_distinct_member_map; drop view rel_seg_approved_member_map; drop view rel_types_valid_obj_one_types; drop view rel_types_valid_obj_two_types; drop view acs_object_type_attributes; drop view acs_object_type_supertype_map; drop view rc_parties_in_required_segs; drop view rc_valid_rel_types; drop view group_rel_type_combos; drop view comp_or_member_rel_types; drop view rel_constraints_violated_one; drop view constrained_rels1; drop view rel_constraints_violated_two; drop view constrained_rels2; drop view parties_in_required_segs; drop view side_one_constraints; drop view rc_violations_by_removing_rel; drop view rel_segment_distinct_party_map; drop view rel_segment_member_map; drop view rel_segment_party_map; drop view total_num_required_segs; drop view rc_required_rel_segments; drop view rc_all_constraints_view; drop view rc_all_distinct_constraints; drop view total_side_one_constraints; drop view rc_all_constraints; drop view rel_segment_group_rel_type_map; alter table acs_object_types ALTER COLUMN object_type TYPE varchar(1000); create view acs_object_type_supertype_map as select ot1.object_type, ot2.object_type as ancestor_type from acs_object_types ot1, acs_object_types ot2 where ot1.object_type <> ot2.object_type and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey); create view acs_object_type_attributes as select all_types.object_type, all_types.ancestor_type, attr.attribute_id, attr.table_name, attr.attribute_name, attr.pretty_name, attr.pretty_plural, attr.sort_order, attr.datatype, attr.default_value, attr.min_n_values, attr.max_n_values, attr.storage, attr.static_p, attr.column_name from acs_attributes attr, (select map.object_type, map.ancestor_type from acs_object_type_supertype_map map, acs_object_types t where map.object_type=t.object_type UNION ALL select t.object_type, t.object_type as ancestor_type from acs_object_types t) all_types where attr.object_type = all_types.ancestor_type; create view rel_types_valid_obj_one_types as select rt.rel_type, th.object_type from acs_rel_types rt, (select object_type, ancestor_type from acs_object_type_supertype_map UNION ALL select object_type, object_type as ancestor_type from acs_object_types) th where rt.object_type_one = th.ancestor_type; create view rel_types_valid_obj_two_types as select rt.rel_type, th.object_type from acs_rel_types rt, (select object_type, ancestor_type from acs_object_type_supertype_map UNION ALL select object_type, object_type as ancestor_type from acs_object_types) th where rt.object_type_two = th.ancestor_type; create view rel_seg_approved_member_map as select rs.segment_id, gem.element_id as member_id, gem.rel_id, gem.rel_type, gem.group_id, gem.container_id from membership_rels mr, group_element_map gem, rel_segments rs, acs_object_types ot1, acs_object_types ot2 where rs.group_id = gem.group_id and rs.rel_type = ot2.object_type and ot1.object_type = gem.rel_type and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey) and mr.rel_id = gem.rel_id and mr.member_state = 'approved'; create view rel_seg_distinct_member_map as select distinct segment_id, member_id from rel_seg_approved_member_map; create view comp_or_member_rel_types as select o.object_type as rel_type from acs_object_types o, acs_object_types o1 where o1.object_type in ('composition_rel', 'membership_rel') and o.tree_sortkey between o1.tree_sortkey and tree_right(o1.tree_sortkey); create view group_rel_type_combos as select groups.group_id, comp_or_member_rel_types.rel_type from groups, comp_or_member_rel_types; create view rel_segment_group_rel_type_map as select s.segment_id, gcm.component_id as group_id, acs_rel_types.rel_type as rel_type from rel_segments s, (select group_id, component_id from group_component_map UNION ALL select group_id, group_id as component_id from groups) gcm, acs_rel_types, acs_object_types ot1, acs_object_types ot2 where s.group_id = gcm.group_id and s.rel_type = ot2.object_type and ot1.object_type = acs_rel_types.rel_type and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey); create view rc_all_constraints as select group_rel_types.group_id, group_rel_types.rel_type, rel_constraints.rel_segment, rel_constraints.rel_side, required_rel_segment from rel_constraints, rel_segment_group_rel_type_map group_rel_types, rel_segments req_seg where rel_constraints.rel_segment = group_rel_types.segment_id and rel_constraints.required_rel_segment = req_seg.segment_id and not (req_seg.group_id = group_rel_types.group_id and req_seg.rel_type = group_rel_types.rel_type); create view rc_required_rel_segments as select distinct group_id, rel_type, required_rel_segment from rc_all_constraints where rel_side = 'two'; create view rel_segment_party_map as select rs.segment_id, gem.element_id as party_id, gem.rel_id, gem.rel_type, gem.group_id, gem.container_id, gem.ancestor_rel_type from rel_segments rs, group_element_map gem, acs_object_types ot1, acs_object_types ot2 where gem.group_id = rs.group_id and ot1.object_type = gem.rel_type and ot2.object_type = rs.rel_type and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey); create view parties_in_required_segs as select required_segs.group_id, required_segs.rel_type, seg_parties.party_id, seg_parties.segment_id, count(*) as num_matching_segs from rc_required_rel_segments required_segs, rel_segment_party_map seg_parties where required_segs.required_rel_segment = seg_parties.segment_id group by required_segs.group_id, required_segs.rel_type, seg_parties.party_id, seg_parties.segment_id; create view total_num_required_segs as select group_id, rel_type, count(*) as total from rc_required_rel_segments group by group_id, rel_type; create view rc_parties_in_required_segs as select parties_in_required_segs.group_id, parties_in_required_segs.rel_type, parties_in_required_segs.party_id from parties_in_required_segs, total_num_required_segs where parties_in_required_segs.group_id = total_num_required_segs.group_id and parties_in_required_segs.rel_type = total_num_required_segs.rel_type and parties_in_required_segs.num_matching_segs = total_num_required_segs.total UNION ALL select group_rel_type_combos.group_id, group_rel_type_combos.rel_type, parties.party_id from (rc_required_rel_segments right outer join group_rel_type_combos on (rc_required_rel_segments.group_id = group_rel_type_combos.group_id and rc_required_rel_segments.rel_type = group_rel_type_combos.rel_type)), parties where rc_required_rel_segments.group_id is null; create view side_one_constraints as select required_segs.group_id, required_segs.rel_type, count(*) as num_satisfied from rc_all_constraints required_segs, rel_segment_party_map map where required_segs.rel_side = 'one' and required_segs.required_rel_segment = map.segment_id and required_segs.group_id = map.party_id group by required_segs.group_id, required_segs.rel_type; create view rc_all_constraints_view as select * from rc_all_constraints where rel_side='one'; create view total_side_one_constraints as select group_id, rel_type, count(*) as total from rc_all_constraints where rel_side = 'one' group by group_id, rel_type; create view rc_valid_rel_types as select side_one_constraints.group_id, side_one_constraints.rel_type from side_one_constraints, total_side_one_constraints where side_one_constraints.group_id = total_side_one_constraints.group_id and side_one_constraints.rel_type = total_side_one_constraints.rel_type and side_one_constraints.num_satisfied = total_side_one_constraints.total UNION ALL select group_rel_type_combos.group_id, group_rel_type_combos.rel_type from rc_all_constraints_view right outer join group_rel_type_combos on (rc_all_constraints_view.group_id = group_rel_type_combos.group_id and rc_all_constraints_view.rel_type = group_rel_type_combos.rel_type) where rc_all_constraints_view.group_id is null; create view constrained_rels1 as select rel.constraint_id, rel.constraint_name, r.rel_id, r.container_id, r.party_id, r.rel_type, rel.rel_segment, rel.rel_side, rel.required_rel_segment from rel_constraints rel, rel_segment_party_map r where rel.rel_side = 'one' and rel.rel_segment = r.segment_id; create view rel_constraints_violated_one as select c.* from constrained_rels1 c left outer join rel_segment_party_map rspm on (rspm.segment_id = c.required_rel_segment and rspm.party_id = c.container_id) where rspm.party_id is null; create view constrained_rels2 as select rel.constraint_id, rel.constraint_name, r.rel_id, r.container_id, r.party_id, r.rel_type, rel.rel_segment, rel.rel_side, rel.required_rel_segment from rel_constraints rel, rel_segment_party_map r where rel.rel_side = 'two' and rel.rel_segment = r.segment_id; create view rel_constraints_violated_two as select c.* from constrained_rels2 c left outer join rel_segment_party_map rspm on (rspm.segment_id = c.required_rel_segment and rspm.party_id = c.party_id) where rspm.party_id is null; create view rc_violations_by_removing_rel as select r.rel_type as viol_rel_type, r.rel_id as viol_rel_id, r.object_id_one as viol_object_id_one, r.object_id_two as viol_object_id_two, s.rel_id, cons.constraint_id, cons.constraint_name, map.segment_id, map.party_id, map.group_id, map.container_id, map.ancestor_rel_type from acs_rels r, rel_segment_party_map map, rel_constraints cons, (select s.segment_id, r.rel_id, r.object_id_two from rel_segments s, acs_rels r where r.object_id_one = s.group_id and r.rel_type = s.rel_type) s where map.party_id = r.object_id_two and map.rel_id = r.rel_id and r.object_id_two = s.object_id_two and cons.rel_segment = map.segment_id and cons.required_rel_segment = s.segment_id; create view rel_segment_distinct_party_map as select distinct segment_id, party_id, ancestor_rel_type from rel_segment_party_map; create view rel_segment_member_map as select segment_id, party_id as member_id, rel_id, rel_type, group_id, container_id from rel_segment_party_map where ancestor_rel_type = 'membership_rel'; create view rc_all_distinct_constraints as select distinct group_id, rel_type, rel_segment, rel_side, required_rel_segment from rc_all_constraints; END IF; END $$;