content-keyword.sql
OpenACS Home : ACS API Browser : ACS Content Repository 5.5.1 : content-keyword.sql
-- 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');
create or replace function content_keyword__get_heading (integer)
returns text as '
declare
get_heading__keyword_id alias for $1;
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');
create or replace function content_keyword__get_description (integer)
returns text as '
declare
get_description__keyword_id alias for $1;
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');
create or replace function content_keyword__set_heading (integer,varchar)
returns integer as '
declare
set_heading__keyword_id alias for $1;
set_heading__heading alias for $2;
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');
create or replace function content_keyword__set_description (integer,varchar)
returns integer as '
declare
set_description__keyword_id alias for $1;
set_description__description alias for $2;
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');
create or replace function content_keyword__is_leaf (integer)
returns boolean as '
declare
is_leaf__keyword_id alias for $1;
begin
return
count(*) = 0
from
cr_keywords k
where
k.parent_id = is_leaf__keyword_id;
end;' language 'plpgsql' stable;
-- function new
select define_function_args('content_keyword__new','heading,description,parent_id,keyword_id,creation_date;now,creation_user,creation_ip,object_type;content_keyword,package_id');
create or replace function content_keyword__new (varchar,varchar,integer,integer,timestamptz,integer,varchar,varchar,integer)
returns integer as '
declare
new__heading alias for $1;
new__description alias for $2; -- default null
new__parent_id alias for $3; -- default null
new__keyword_id alias for $4; -- default null
new__creation_date alias for $5; -- default now()
new__creation_user alias for $6; -- default null
new__creation_ip alias for $7; -- default null
new__object_type alias for $8; -- default ''content_keyword''
new__package_id alias for $9; -- default null
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';
create or replace function content_keyword__new (varchar,varchar,integer,integer,timestamptz,integer,varchar,varchar)
returns integer as '
declare
new__heading alias for $1;
new__description alias for $2; -- default null
new__parent_id alias for $3; -- default null
new__keyword_id alias for $4; -- default null
new__creation_date alias for $5; -- default now()
new__creation_user alias for $6; -- default null
new__creation_ip alias for $7; -- default null
new__object_type alias for $8; -- default ''content_keyword''
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');
create or replace function content_keyword__del (integer)
returns integer as '
declare
delete__keyword_id alias for $1;
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';
create or replace function content_keyword__delete (integer)
returns integer as '
declare
delete__keyword_id alias for $1;
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');
create or replace function content_keyword__item_assign (integer,integer,integer,integer,varchar)
returns integer as '
declare
item_assign__item_id alias for $1;
item_assign__keyword_id alias for $2;
item_assign__context_id alias for $3; -- default null
item_assign__creation_user alias for $4; -- default null
item_assign__creation_ip alias for $5; -- default null
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');
create or replace function content_keyword__item_unassign (integer,integer)
returns integer as '
declare
item_unassign__item_id alias for $1;
item_unassign__keyword_id alias for $2;
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');
create or replace function content_keyword__is_assigned (integer,integer,varchar)
returns boolean as '
declare
is_assigned__item_id alias for $1;
is_assigned__keyword_id alias for $2;
is_assigned__recurse alias for $3; -- default ''none''
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');
create or replace function content_keyword__get_path (integer)
returns text as '
declare
get_path__keyword_id alias for $1;
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 function cr_keywords_update_tr () returns opaque 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