-- Data model to support content repository of the ArsDigita
-- Community System
-- Copyright (C) 1999-2000 ArsDigita Corporation
-- Author: Stanislav Freidin (sfreidin@arsdigita.com)
-- This is free software distributed under the terms of the GNU Public
-- License. Full text of the license is available from the GNU Project:
-- http://www.fsf.org/copyleft/gpl.html
select define_function_args ('content_keyword__get_heading','keyword_id');
--
-- procedure content_keyword__get_heading/1
--
CREATE OR REPLACE FUNCTION content_keyword__get_heading(
get_heading__keyword_id integer
) RETURNS text AS $$
DECLARE
v_heading text;
BEGIN
select heading into v_heading from cr_keywords
where keyword_id = get_heading__keyword_id;
return v_heading;
END;
$$ LANGUAGE plpgsql stable strict;
-- function get_description
select define_function_args ('content_keyword__get_description','keyword_id');
--
-- procedure content_keyword__get_description/1
--
CREATE OR REPLACE FUNCTION content_keyword__get_description(
get_description__keyword_id integer
) RETURNS text AS $$
DECLARE
v_description text;
BEGIN
select description into v_description from cr_keywords
where keyword_id = get_description__keyword_id;
return v_description;
END;
$$ LANGUAGE plpgsql stable strict;
-- procedure set_heading
select define_function_args ('content_keyword__set_heading','keyword_id,heading');
--
-- procedure content_keyword__set_heading/2
--
CREATE OR REPLACE FUNCTION content_keyword__set_heading(
set_heading__keyword_id integer,
set_heading__heading varchar
) RETURNS integer AS $$
DECLARE
BEGIN
update cr_keywords set
heading = set_heading__heading
where
keyword_id = set_heading__keyword_id;
update acs_objects
set title = set_heading__heading
where object_id = set_heading__keyword_id;
return 0;
END;
$$ LANGUAGE plpgsql;
-- procedure set_description
select define_function_args ('content_keyword__set_description','keyword_id,description');
--
-- procedure content_keyword__set_description/2
--
CREATE OR REPLACE FUNCTION content_keyword__set_description(
set_description__keyword_id integer,
set_description__description varchar
) RETURNS integer AS $$
DECLARE
BEGIN
update cr_keywords set
description = set_description__description
where
keyword_id = set_description__keyword_id;
return 0;
END;
$$ LANGUAGE plpgsql;
-- function is_leaf
select define_function_args ('content_keyword__is_leaf','keyword_id');
--
-- procedure content_keyword__is_leaf/1
--
CREATE OR REPLACE FUNCTION content_keyword__is_leaf(
is_leaf__keyword_id integer
) RETURNS boolean AS $$
DECLARE
BEGIN
return
count(*) = 0
from
cr_keywords k
where
k.parent_id = is_leaf__keyword_id;
END;
$$ LANGUAGE plpgsql stable;
--
-- procedure content_keyword__new/9
--
select define_function_args('content_keyword__new','heading,description;null,parent_id;null,keyword_id;null,creation_date;now,creation_user;null,creation_ip;null,object_type;content_keyword,package_id;null');
CREATE OR REPLACE FUNCTION content_keyword__new(
new__heading varchar,
new__description varchar, -- default null
new__parent_id integer, -- default null
new__keyword_id integer, -- default null
new__creation_date timestamptz, -- default now() -- default 'now'
new__creation_user integer, -- default null
new__creation_ip varchar, -- default null
new__object_type varchar, -- default 'content_keyword'
new__package_id integer -- default null
) RETURNS integer AS $$
DECLARE
v_id integer;
v_package_id acs_objects.package_id%TYPE;
BEGIN
if new__package_id is null then
v_package_id := acs_object__package_id(new__parent_id);
else
v_package_id := new__package_id;
end if;
v_id := acs_object__new (new__keyword_id,
new__object_type,
new__creation_date,
new__creation_user,
new__creation_ip,
new__parent_id,
't',
new__heading,
v_package_id
);
insert into cr_keywords
(heading, description, keyword_id, parent_id)
values
(new__heading, new__description, v_id, new__parent_id);
return v_id;
END;
$$ LANGUAGE plpgsql;
--
-- procedure content_keyword__new/8
--
CREATE OR REPLACE FUNCTION content_keyword__new(
new__heading varchar,
new__description varchar, -- default null
new__parent_id integer, -- default null
new__keyword_id integer, -- default null
new__creation_date timestamptz, -- default now() -- default 'now'
new__creation_user integer, -- default null
new__creation_ip varchar, -- default null
new__object_type varchar -- default 'content_keyword'
) RETURNS integer AS $$
DECLARE
BEGIN
return content_keyword__new(new__heading,
new__description,
new__parent_id,
new__keyword_id,
new__creation_date,
new__creation_user,
new__creation_ip,
new__object_type,
null
);
END;
$$ LANGUAGE plpgsql;
-- procedure delete
select define_function_args ('content_keyword__del','keyword_id');
--
-- procedure content_keyword__del/1
--
CREATE OR REPLACE FUNCTION content_keyword__del(
delete__keyword_id integer
) RETURNS integer AS $$
DECLARE
v_rec record;
BEGIN
for v_rec in select item_id from cr_item_keyword_map
where keyword_id = delete__keyword_id LOOP
PERFORM content_keyword__item_unassign(v_rec.item_id, delete__keyword_id);
end LOOP;
PERFORM acs_object__delete(delete__keyword_id);
return 0;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('content_keyword__delete','keyword_id');
--
-- procedure content_keyword__delete/1
--
CREATE OR REPLACE FUNCTION content_keyword__delete(
delete__keyword_id integer
) RETURNS integer AS $$
DECLARE
v_rec record;
BEGIN
perform content_keyword__del(delete__keyword_id);
return 0;
END;
$$ LANGUAGE plpgsql;
-- procedure item_assign
select define_function_args ('content_keyword__item_assign','item_id,keyword_id,context_id;null,creation_user;null,creation_ip;null');
--
-- procedure content_keyword__item_assign/5
--
CREATE OR REPLACE FUNCTION content_keyword__item_assign(
item_assign__item_id integer,
item_assign__keyword_id integer,
item_assign__context_id integer, -- default null
item_assign__creation_user integer, -- default null
item_assign__creation_ip varchar -- default null
) RETURNS integer AS $$
DECLARE
exists_p boolean;
BEGIN
-- Do nothing if the keyword is assigned already
select count(*) > 0 into exists_p from dual
where exists (select 1 from cr_item_keyword_map
where item_id = item_assign__item_id
and keyword_id = item_assign__keyword_id);
if NOT exists_p then
insert into cr_item_keyword_map (
item_id, keyword_id
) values (
item_assign__item_id, item_assign__keyword_id
);
end if;
return 0;
END;
$$ LANGUAGE plpgsql;
-- procedure item_unassign
select define_function_args ('content_keyword__item_unassign','item_id,keyword_id');
--
-- procedure content_keyword__item_unassign/2
--
CREATE OR REPLACE FUNCTION content_keyword__item_unassign(
item_unassign__item_id integer,
item_unassign__keyword_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
delete from cr_item_keyword_map
where item_id = item_unassign__item_id
and keyword_id = item_unassign__keyword_id;
return 0;
END;
$$ LANGUAGE plpgsql;
-- function is_assigned
select define_function_args ('content_keyword__is_assigned','item_id,keyword_id,recurse;none');
--
-- procedure content_keyword__is_assigned/3
--
CREATE OR REPLACE FUNCTION content_keyword__is_assigned(
is_assigned__item_id integer,
is_assigned__keyword_id integer,
is_assigned__recurse varchar -- default 'none'
) RETURNS boolean AS $$
DECLARE
v_ret boolean;
v_is_assigned__recurse varchar;
BEGIN
if is_assigned__recurse is null then
v_is_assigned__recurse := 'none';
else
v_is_assigned__recurse := is_assigned__recurse;
end if;
-- Look for an exact match
if v_is_assigned__recurse = 'none' then
return count(*) > 0 from cr_item_keyword_map
where item_id = is_assigned__item_id
and keyword_id = is_assigned__keyword_id;
end if;
-- Look from specific to general
if v_is_assigned__recurse = 'up' then
return count(*) > 0
where exists (select 1
from (select keyword_id from cr_keywords c, cr_keywords c2
where c2.keyword_id = is_assigned__keyword_id
and c.tree_sortkey between c2.tree_sortkey and tree_right(c2.tree_sortkey)) t,
cr_item_keyword_map m
where t.keyword_id = m.keyword_id
and m.item_id = is_assigned__item_id);
end if;
if v_is_assigned__recurse = 'down' then
return count(*) > 0
where exists (select 1
from (select k2.keyword_id
from cr_keywords k1, cr_keywords k2
where k1.keyword_id = is_assigned__keyword_id
and k1.tree_sortkey between k2.tree_sortkey and tree_right(k2.tree_sortkey)) t,
cr_item_keyword_map m
where t.keyword_id = m.keyword_id
and m.item_id = is_assigned__item_id);
end if;
-- Tried none, up and down - must be an invalid parameter
raise EXCEPTION '-20000: The recurse parameter to content_keyword.is_assigned should be ''none'', ''up'' or ''down''';
return null;
END;
$$ LANGUAGE plpgsql stable;
-- function get_path
select define_function_args ('content_keyword__get_path','keyword_id');
--
-- procedure content_keyword__get_path/1
--
CREATE OR REPLACE FUNCTION content_keyword__get_path(
get_path__keyword_id integer
) RETURNS text AS $$
DECLARE
v_path text default '';
v_is_found boolean default 'f';
v_heading cr_keywords.heading%TYPE;
v_rec record;
BEGIN
-- select
-- heading
-- from (
-- select
-- heading, level as tree_level
-- from cr_keywords
-- connect by prior parent_id = keyword_id
-- start with keyword_id = get_path.keyword_id) k
-- order by
-- tree_level desc
for v_rec in select heading
from (select k2.heading, tree_level(k2.tree_sortkey) as tree_level
from cr_keywords k1, cr_keywords k2
where k1.keyword_id = get_path__keyword_id
and k1.tree_sortkey between k2.tree_sortkey and tree_right(k2.tree_sortkey)) k
order by tree_level desc
LOOP
v_heading := v_rec.heading;
v_is_found := 't';
v_path := v_path || '/' || v_heading;
end LOOP;
if v_is_found = 'f' then
return null;
else
return v_path;
end if;
END;
$$ LANGUAGE plpgsql stable strict;
-- Ensure that the context_id in acs_objects is always set to the
-- parent_id in cr_keywords
CREATE OR REPLACE FUNCTION cr_keywords_update_tr () RETURNS trigger AS $$
BEGIN
if old.parent_id <> new.parent_id then
update acs_objects set context_id = new.parent_id
where object_id = new.keyword_id;
end if;
return new;
END;
$$ LANGUAGE plpgsql;
create trigger cr_keywords_update_tr after update on cr_keywords
for each row execute procedure cr_keywords_update_tr ();
-- show errors