| version 1.7, 2008/09/11 05:39:24 |
version 1.8, 2008/09/11 15:46:50 |
| Line 48 CREATE OR REPLACE FUNCTION %%_util.add_ |
|
| Line 48 CREATE OR REPLACE FUNCTION %%_util.add_ |
|
| r.node_sn := p_node_sn; |
r.node_sn := p_node_sn; |
| r.node_name := arg_node_name; |
r.node_name := arg_node_name; |
| |
|
| insert into %%_util.tree_node ( id , node_sn, node_data_id , weight , internal_weight, tree_id, node_name,lft,rgt, level) |
insert into %%_util.tree_node ( id , node_sn, node_data_id , weight , internal_weight, tree_id, node_name,lft,rgt, level,ntype) |
| values (r.id, r.node_sn, r.node_data_id, r.weight, r.internal_weight, r.tree_id ,r.node_name,1,2,0 ); |
values (r.id, r.node_sn, r.node_data_id, r.weight, r.internal_weight, r.tree_id ,r.node_name,1,2,0,0 ); |
| |
|
| rep := %%_util.unode_to_node(r); |
rep := %%_util.unode_to_node(r); |
| return rep; |
return rep; |
| Line 92 CREATE OR REPLACE FUNCTION %%.add_orpha |
|
| Line 92 CREATE OR REPLACE FUNCTION %%.add_orpha |
|
| END |
END |
| $$ VOLATILE LANGUAGE plpgsql; |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| --------------------------------------------------------------------------- |
|
| -- |
|
| --------------------------------------------------------------------------- |
|
| |
|
| CREATE OR REPLACE FUNCTION %%.add_named_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$ |
|
| DECLARE |
|
| r %%.tree_node; |
|
| tmp boolean; |
|
| BEGIN |
|
| r := %%.add_orphan_node(arg_tree_name ,arg_node_data , arg_node_weight); |
|
| if (r.id is null) then |
|
| return r; |
|
| end if; |
|
| |
|
| tmp := %%.set_node_name(r.id , arg_node_name); |
|
| if (tmp = false) then |
|
| RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE'; |
|
| end if; |
|
| |
|
| r.node_name := arg_node_name; |
|
| return r; |
|
| END |
|
| $$ VOLATILE LANGUAGE plpgsql; |
|
| |
|
| |
|
| --------------------------------------------------------------------------- |
--------------------------------------------------------------------------- |
|
|
| END |
END |
| $$ VOLATILE LANGUAGE plpgsql; |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| |
|
| --------------------------------------------------------------------------- |
--------------------------------------------------------------------------- |
| -- |
-- |
| --------------------------------------------------------------------------- |
--------------------------------------------------------------------------- |
| |
|
| |
CREATE OR REPLACE FUNCTION %%.add_named_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$ |
| |
DECLARE |
| |
r %%.tree_node; |
| |
tmp boolean; |
| |
BEGIN |
| |
r := %%.add_orphan_node(arg_tree_name ,arg_node_data , arg_node_weight); |
| |
if (r.id is null) then |
| |
return r; |
| |
end if; |
| |
|
| |
tmp := %%.set_node_name(r.id , arg_node_name); |
| |
if (tmp = false) then |
| |
RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE'; |
| |
end if; |
| |
|
| |
r.node_name := arg_node_name; |
| |
return r; |
| |
END |
| |
$$ VOLATILE LANGUAGE plpgsql; |
| |
--------------------------------------------------------------------------- |
| |
-- |
| |
--------------------------------------------------------------------------- |
| |
|
| |
CREATE OR REPLACE FUNCTION %%.add_named_sn_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_sn bigint, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$ |
| |
DECLARE |
| |
r %%.tree_node; |
| |
tmp boolean; |
| |
BEGIN |
| |
r := %%.add_orphan_sn_node(arg_tree_name, arg_node_sn,arg_node_data , arg_node_weight); |
| |
if (r.id is null) then |
| |
return r; |
| |
end if; |
| |
|
| |
tmp := %%.set_node_name(r.id , arg_node_name); |
| |
if (tmp = false) then |
| |
RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE'; |
| |
end if; |
| |
|
| |
r.node_name := arg_node_name; |
| |
return r; |
| |
END |
| |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| |
--------------------------------------------------------------------------- |
| |
-- |
| |
--------------------------------------------------------------------------- |
| CREATE OR REPLACE FUNCTION %%.set_root_node(arg_node bigint) RETURNS boolean AS $$ |
CREATE OR REPLACE FUNCTION %%.set_root_node(arg_node bigint) RETURNS boolean AS $$ |
| DECLARE |
DECLARE |
| rec1 RECORD; |
rec1 RECORD; |
|
|
| end if; |
end if; |
| |
|
| if %%_util.get_root_id(rec1.tree_id) is not null then |
if %%_util.get_root_id(rec1.tree_id) is not null then |
| RAISE NOTICE 'TREE HAS ALLREDY ROOT NODE %' , %%_util.get_root_id(rec1.tree_id); |
--RAISE NOTICE 'TREE HAS ALLREDY ROOT NODE %' , %%_util.get_root_id(rec1.tree_id); |
| |
--update %%_util.tree_node SET root = 0 WHERE id = rec1.tree_id; |
| return false; |
return false; |
| end if; |
end if; |
| |
|
| if rec1.parent_id is not null then |
--if rec1.parent_id is not null then |
| RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ; |
-- RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ; |
| return false; |
-- return false; |
| end if; |
--end if; |
| |
|
| if rec1.level !=0 then |
--if rec1.level !=0 then |
| RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ; |
-- RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ; |
| return false; |
-- return false; |
| end if; |
-- end if; |
| |
|
| --update %%_util.tree_node SET level = 0 WHERE id = arg_node; |
--update %%_util.tree_node SET level = 0 WHERE id = arg_node; |
| update %%_util.tree_node SET ntype = 1 WHERE id = arg_node; |
update %%_util.tree_node SET root = 1 WHERE id = arg_node; |
| |
|
| return true; |
return true; |
| END |
END |
|
|
| rec1 RECORD; |
rec1 RECORD; |
| BEGIN |
BEGIN |
| if (arg_node is null) then |
if (arg_node is null) then |
| RAISE NOTICE 'arg_node IS MANTATORY'; |
RAISE EXCEPTION 'arg_node IS MANTATORY'; |
| end if; |
end if; |
| |
|
| update %%_util.tree_node set node_data_id = arg_node_data_id WHERE id = arg_node; |
update %%_util.tree_node set node_data_id = arg_node_data_id WHERE id = arg_node; |
|
|
| rec1 RECORD; |
rec1 RECORD; |
| BEGIN |
BEGIN |
| if (arg_node is null) then |
if (arg_node is null) then |
| RAISE NOTICE 'arg_node IS MANTATORY'; |
RAISE EXCEPTION 'arg_node IS MANTATORY'; |
| end if; |
end if; |
| |
|
| SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id , tn.ntype |
SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id , tn.ntype |
|
|
| return false; |
return false; |
| end if; |
end if; |
| |
|
| if rec1.parent_id is not null then |
--if rec1.parent_id is not null then |
| RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
-- RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
| return false; |
-- return false; |
| end if; |
--end if; |
| |
|
| if rec1.ntype !=1 then |
if rec1.root !=1 then |
| RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
| return false; |
return false; |
| end if; |
end if; |
| |
|
| |
|
| if rec1.level != 0 then |
--if rec1.level != 0 then |
| RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
-- RAISE NOTICE 'NODE % IS NOT ROOT',arg_node; |
| return false; |
-- return false; |
| end if; |
--end if; |
| |
|
| --update %%_util.tree_node SET level = null WHERE id = arg_node; |
--update %%_util.tree_node SET level = null WHERE id = arg_node; |
| |
|
| update %%_util.tree_node SET ntype = 0 WHERE id = arg_node; |
update %%_util.tree_node SET root = 0 WHERE id = arg_node; |
| |
|
| return true; |
return true; |
| END |
END |
| $$ VOLATILE LANGUAGE plpgsql; |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| |
|
| |
CREATE OR REPLACE FUNCTION %%.unset_root_node(arg_tree_name varchar) RETURNS boolean AS $$ |
| |
DECLARE |
| |
rec1 RECORD; |
| |
p_n_id bigint; |
| |
BEGIN |
| |
if (arg_tree_name is null) then |
| |
RAISE EXCEPTION 'arg_tree_name IS MANTATORY'; |
| |
--return false; |
| |
end if; |
| |
|
| |
p_n_id := %%_util.get_tree_id(arg_tree_name); |
| |
if (p_n_id is null) then |
| |
return false; |
| |
end if; |
| |
|
| |
|
| |
update %%_util.tree_node SET root = 0 WHERE id = p_n_id; |
| |
|
| |
return true; |
| |
END |
| |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| --------------------------------------------------------------------------- |
--------------------------------------------------------------------------- |
| -- |
-- |
| Line 403 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 449 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| p_a2 bigint; |
p_a2 bigint; |
| p_si_p bigint; |
p_si_p bigint; |
| p_n bigint; |
p_n bigint; |
| |
p_parent_id_p bigint; |
| rec record; |
rec record; |
| |
p_ntype integer; |
| |
|
| BEGIN |
BEGIN |
| --RAISE NOTICE 'set_parentship % %',arg_parent_node, arg_child_node; |
--RAISE NOTICE 'set_parentship % %',arg_parent_node, arg_child_node; |
| Line 415 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 463 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| end if; |
end if; |
| |
|
| --stixia parent_node kai tis ikogenias pou ine parent |
--stixia parent_node kai tis ikogenias pou ine parent |
| SELECT INTO rec1 tn.level, tn.tree_id, tn.node_sn, tn.rgt, tn.lft,tn.set_id FROM %%_util.tree_node tn WHERE tn.id = arg_parent_node; |
SELECT INTO rec1 tn.level, tn.tree_id, tn.node_sn, tn.rgt, tn.lft,tn.set_id, tn.parent_id FROM %%_util.tree_node tn WHERE tn.id = arg_parent_node; |
| if not found then |
if not found then |
| RAISE NOTICE 'CANOT FOUND PARENT NODE %',arg_parent_node ; |
RAISE NOTICE 'CANOT FOUND PARENT NODE %',arg_parent_node ; |
| return false; |
return false; |
| Line 426 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 474 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| p_rgt_p := rec1.rgt; |
p_rgt_p := rec1.rgt; |
| p_lft_p := rec1.lft; |
p_lft_p := rec1.lft; |
| p_si_p := rec1.set_id; |
p_si_p := rec1.set_id; |
| |
p_parent_id_p := rec1.parent_id; |
| |
|
| --if p_level is null then |
--if p_level is null then |
| -- return false; |
-- return false; |
| --end if; |
--end if; |
| |
|
| --stixia child_node |
--stixia child_node |
| SELECT INTO rec1 tn.level, tn.tree_id, tn.internal_weight, tn.weight, tn.lft, tn.rgt, tn.set_id, tn.parent_id FROM %%_util.tree_node tn WHERE tn.id = arg_child_node; |
SELECT INTO rec1 tn.level, tn.tree_id, tn.internal_weight, tn.weight, tn.lft, tn.rgt, tn.set_id, tn.parent_id, tn.ntype FROM %%_util.tree_node tn WHERE tn.id = arg_child_node; |
| if not found then |
if not found then |
| RAISE NOTICE 'CANOT FOUND CHILD NODE %',arg_child_node ; |
RAISE NOTICE 'CANOT FOUND CHILD NODE %',arg_child_node ; |
| return false; |
return false; |
| Line 452 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 501 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| |
|
| p_internal_weight := rec1.internal_weight; |
p_internal_weight := rec1.internal_weight; |
| p_weight := rec1.weight; |
p_weight := rec1.weight; |
| |
p_ntype := rec1.ntype; |
| |
|
| -- ipologismos sta8eras gia ta update ton rgt lft |
-- ipologismos sta8eras gia ta update ton rgt lft |
| p_a1 := p_lft_p; |
p_a1 := p_lft_p; |
| Line 470 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 520 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| --------------- |
--------------- |
| --------------- |
--------------- |
| |
|
| |
|
| -- update (lft,rgt) nodes releted to parent |
-- update (lft,rgt) nodes releted to parent |
| p_n := rec1.rgt; |
p_n := rec1.rgt; |
| |
|
| --RAISE NOTICE 'PARENT RELATED UPDATES %',p_n; |
--RAISE NOTICE 'PARENT RELATED UPDATES %',p_n; |
| |
--update %%_util.tree_node |
| |
--set |
| |
--rgt = rgt + p_n, |
| |
--lft = CASE WHEN lft > p_lft_p THEN lft + p_n ELSE lft END, |
| |
--ntype = CASE WHEN id = arg_parent_node THEN CASE WHEN p_parent_id_p is null THEN 1 ELSE 2 END ELSE ntype END --alagi type parent node |
| |
--WHERE set_id = p_si_p and rgt > p_a1; |
| |
|
| |
--update parent node |
| |
update %%_util.tree_node |
| |
set |
| |
rgt = rgt + p_n, |
| |
ntype = CASE WHEN p_parent_id_p is null THEN 1 ELSE 2 END |
| |
WHERE id = arg_parent_node; |
| |
|
| |
--update rest parent related nodes |
| update %%_util.tree_node |
update %%_util.tree_node |
| set |
set |
| rgt = rgt + p_n, |
rgt = rgt + p_n, |
| lft = CASE WHEN lft > p_lft_p THEN lft + p_n ELSE lft END |
lft = CASE WHEN lft > p_lft_p THEN lft + p_n ELSE lft END |
| WHERE set_id = p_si_p and rgt > p_a1; |
WHERE set_id = p_si_p and rgt > p_a1 and id != arg_parent_node; |
| |
|
| --if p_level is not null then |
|
| p_level = p_level + 1; |
p_level = p_level + 1; |
| --end if; |
|
| |
|
| -- update (lft,rgt) nodes related to child |
-- update (lft,rgt) nodes related to child |
| p_n := p_a1; |
p_n := p_a1; |
| Line 491 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 557 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| set_id = p_si_p, |
set_id = p_si_p, |
| lft = lft + p_n, |
lft = lft + p_n, |
| rgt = rgt + p_n, |
rgt = rgt + p_n, |
| level = p_level |
level = level + p_level |
| where |
where |
| set_id = rec1.set_id and lft > rec1.lft; |
set_id = rec1.set_id and lft > rec1.lft; |
| |
|
| Line 503 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| Line 569 CREATE OR REPLACE FUNCTION %%.set_paren |
|
| |
|
| --update arg_child_node |
--update arg_child_node |
| update %%_util.tree_node |
update %%_util.tree_node |
| SET level = p_level, parent_id = arg_parent_node , parent_sn = p_node_sn_p, lft = p_lft, rgt = p_rgt, set_id = p_si_p |
SET level = p_level, parent_id = arg_parent_node , parent_sn = p_node_sn_p, lft = p_lft, rgt = p_rgt, set_id = p_si_p, |
| |
ntype= CASE WHEN p_ntype = 0 THEN 3 ELSE 2 END |
| WHERE id = arg_child_node; |
WHERE id = arg_child_node; |
| |
|
| --level |
--level |
|
|
| |
|
| CREATE OR REPLACE FUNCTION %%.make_orphan_node(arg_node bigint) RETURNS boolean AS $$ |
CREATE OR REPLACE FUNCTION %%.make_orphan_node(arg_node bigint) RETURNS boolean AS $$ |
| DECLARE |
DECLARE |
| rec1 RECORD; |
rec_c RECORD; |
| |
rec_p RECORD; |
| |
p_lr_diff_c bigint; |
| |
p_lr_diff_p bigint; |
| |
p_level_diff_c integer; |
| |
p_set_id_c bigint; |
| |
rec record; |
| |
p_child_cound_p integer; |
| BEGIN |
BEGIN |
| |
|
| if (arg_node is null) then |
if (arg_node is null) then |
| RAISE NOTICE 'arg_node IS MANTATORY'; |
RAISE NOTICE 'arg_node IS MANTATORY'; |
| end if; |
end if; |
| |
|
| SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id |
-- CHILD NODE |
| |
SELECT INTO rec_c tn.level, tn.tree_id, tn.parent_id, tn.lft, tn.rgt, tn.set_id |
| FROM %%_util.tree_node tn WHERE tn.id = arg_node; |
FROM %%_util.tree_node tn WHERE tn.id = arg_node; |
| if not found then |
if not found then |
| RAISE NOTICE 'arg_node % NOT FOUND',arg_node ; |
RAISE NOTICE 'arg_node % NOT FOUND',arg_node ; |
| return false; |
return false; |
| end if; |
end if; |
| |
|
| |
--PARENT NODE |
| |
--SELECT INTO rec_c tn.level, tn.tree_id, tn.parent_id, tn.lft, tn.rgt, tn.set_id |
| |
--FROM %%_util.tree_node tn WHERE tn.id = parent_id; |
| |
--if not found then |
| |
-- RAISE NOTICE 'UNEXPECTED ERROR: parent node % NOT FOUND',parent_id ; |
| |
-- return false; |
| |
--end if; |
| |
select into rec count(*) FROM %%_util.tree_node WHERE parent_id = rec_c.parent_id; |
| |
p_child_cound_p := rec.count; |
| |
|
| |
|
| |
--constants for update detached tree |
| |
p_lr_diff_c := rec_c.lft -1; |
| |
p_level_diff_c := rec_c.level; |
| |
p_set_id_c := nextval('%%_util.tree_node_set_id_seq'); |
| |
|
| |
--constants for update main tree |
| |
p_lr_diff_p := rec_c.rgt - rec_c.lft + 1; |
| |
|
| |
--update detached tree |
| |
update %%_util.tree_node |
| |
set |
| |
lft = lft - p_lr_diff_c, |
| |
rgt = rgt - p_lr_diff_c, |
| |
level = level - p_level_diff_c, |
| |
set_id = p_set_id_c |
| |
WHERE set_id = rec_c.set_id and lft > rec_c.lft and rgt < rec_c.rgt; |
| |
|
| |
-- update detached node |
| |
update %%_util.tree_node SET |
| |
ntype = CASE WHEN lft = rgt -1 THEN 0 ELSE 1 END, |
| |
set_id = p_set_id_c, level = 0, parent_id = null, parent_sn = null, |
| |
lft = 1, rgt = rgt - p_lr_diff_c WHERE id = arg_node; |
| |
|
| |
--update main tree (without parent_node |
| |
update %%_util.tree_node |
| |
set |
| |
rgt = rgt - p_lr_diff_p, |
| |
lft = CASE WHEN lft > rec_c.rgt THEN lft - p_lr_diff_p ELSE lft END |
| |
WHERE set_id = rec_c.set_id and rgt > rec_c.rgt and id != rec_c.parent_id ; |
| |
|
| |
|
| |
|
| |
--update parent_node |
| |
--p_child_cound_p ari8mos pedion prin tin aferesi.. torinos ari8mos = p_child_cound_p - 1 |
| |
update %%_util.tree_node |
| |
set |
| |
rgt = rgt - p_lr_diff_p, |
| |
ntype = CASE WHEN ntype = 1 THEN (CASE WHEN p_child_cound_p = 1 THEN 0 ELSE 1 END) ELSE (CASE WHEN p_child_cound_p = 1 THEN 3 ELSE 2 END) END |
| |
WHERE id = rec_c.parent_id ; |
| |
|
| update %%_util.tree_node SET level = null, parent_id = null, parent_sn = null WHERE id = arg_node; |
|
| |
|
| return true; |
return true; |
| |
|
| |
END |
| |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|
| |
|
| |
CREATE OR REPLACE FUNCTION %%.make_orphan_node_sn(arg_tree_name varchar, arg_node_sn bigint) RETURNS boolean AS $$ |
| |
DECLARE |
| |
p_id bigint; |
| |
rep boolean; |
| |
BEGIN |
| |
p_id := %%_util.get_tree_node_id(arg_tree_name,arg_node_sn); |
| |
rep := %%.make_orphan_node(p_id); |
| |
return rep; |
| END |
END |
| $$ VOLATILE LANGUAGE plpgsql; |
$$ VOLATILE LANGUAGE plpgsql; |
| |
|