привет,
может мне кто помочь в [Nested Set] структурах разобраться? в принзипе там новый Кнотен зделать или удалить всё понятьно а вот чтобы ети Ветви двигать туда сюда не могу врубиться?
может кто так бы расказал что почём или же вот етот код в яву [Programmiersprache Java] перевести?
очень нужно...
Einen Teilbaum kann man natьrlich auch innerhalb desselben Baums verschieben:
create or replace function MoveTree(int4, int4) RETURNS treenode as
'
declare
leftbound int4;
rightbound int4;
treeshift int4;
cwidth int4;
leftrange int4;
rightrange int4;
qn tree%rowtype;
zn tree%rowtype;
retval treenode%rowtype;
begin
-- Knoten bestimmen
select id, subtree_id, parent_id, level, l, r into qn from tree where id = $1;
select id, subtree_id, parent_id, level, l, r into zn from tree where id = $2;
if qn.l = zn.l then
raise exception ''Cannot move: entries are identical'';
end if;
if qn.id is null then
raise exception ''Source Node not found'';
end if;
if zn.id is null then
raise exception ''Destination Node not found'';
end if;
if zn.l between qn.l and qn.r then
raise exception ''Cannot move: first entry contains second'';
end if;
if qn.l = zn.l + 1 then
raise notice ''No changes need to be made'';
end if;
if qn.subtree_id zn.subtree_id then
raise exception ''Cannot move between different trees'';
end if;
if qn.l > zn.l then
treeshift := zn.l - qn.l + 1;
leftbound := zn.l + 1;
rightbound := qn.l - 1;
cwidth := qn.r - qn.l + 1;
leftrange := qn.r;
rightrange := zn.l;
else
treeshift := zn.l - qn.r;
leftbound := qn.r + 1;
rightbound := zn.l;
cwidth := qn.l - qn.r - 1;
leftrange := zn.l + 1;
rightrange := qn.l;
end if;
-- parent korrigieren
update tree set parent_id = $2 where id = $1;
-- Level korrigieren
update tree set level = level - (qn.level -zn.level - 1) where l >= qn.l and l <= qn.r;
-- l und r korrigieren
update tree
set l = case
when l between leftbound and rightbound then l + cwidth
when l between qn.l and qn.r then l + treeshift
else l end,
r = case
when r between leftbound and rightbound then r + cwidth
when r between qn.l and qn.r then r + treeshift
else r end
where subtree_id = zn.subtree_id and (l < leftrange or r > rightrange);
select id, subtree_id, parent_id, level, payload into retval from tree where id = $1;
return retval;
end;
'
LANGUAGE 'plpgsql';