powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ltree перемещение веток
9 сообщений из 9, страница 1 из 1
ltree перемещение веток
    #35211100
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте уважаемые слоноведы и слоноводы!

Подскажите пожалуста как в ltree перемещать ветки?
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35211373
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё понял... поторопился, извиняюсь :)
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35211434
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый слоновед laser,
ответьте пожалуйста на свой вопрос, мне тоже очень интересно.
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35211486
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую... пока готовлю :)
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35211749
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE TABLE test (id serial, path ltree);

id; path
1;"0.1"
2;"0.2"
3;"0.3"
4;"0.1.4"
5;"0.1.5"
6;"0.1.6"
7;"0.2.7"
8;"0.2.8"
9;"0.2.9"
10;"0.3.10"
11;"0.3.11"
12;"0.3.11.12"
13;"0.3.11.13"
14;"0.3.11.14"
15;"0.3.11.15"
16;"0.3.11.13.16"
17;"0.3.11.13.17"
18;"0.3.11.13.18"


ИМЕЕМ: id елемента, id нового родителя
ЗАДАЧА: переместить елемент с id=11 от родителя с id=3 к родителю с id=2


level = SELECT nlevel(path) FROM test WHERE id = 2; // level=2

oldPath = SELECT path FROM test WHERE id = 11; // oldPath= '0.3.11'

Ищем значение 2 елемента в oldPath

newPath = replace(oldPath, '.3.', '.2.'); // newPath='0.2.11'

UPDATE test SET path = text2ltree(replace(ltree2text(path), oldPath, newPath)) WHERE path ~ oldPath|'.*';

РЕЗУЛЬТАТ:

id; path
1;"0.1"
2;"0.2"
3;"0.3"
4;"0.1.4"
5;"0.1.5"
6;"0.1.6"
7;"0.2.7"
8;"0.2.8"
9;"0.2.9"
10;"0.3.10"
11;"0.2.11"
12;"0.2.11.12"
13;"0.2.11.13"
14;"0.2.11.14"
15;"0.2.11.15"
16;"0.2.11.13.16"
17;"0.2.11.13.17"
18;"0.2.11.13.18"

Пока делаю так... Это конечно не средствами ltree, буду читать дальше :)
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35213688
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё неправильно!!! :(

Буду думать дальше
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35213701
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так наверное:

SELECT path INTO new_parent_path FROM catalog.kinds WHERE id = new_parent_id;
SELECT path INTO old_path FROM catalog.kinds WHERE id = node_id;
new_path = new_parent_path||'.'||node_id;
UPDATE catalog.kinds SET path = text2ltree(replace(ltree2text(path), old_path, new_path)) WHERE path ~ text2ltree(old_path||'.*');
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35367743
intheair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я может чего не понимаю, но пример помоему показательный:

http://www.sai.msu.su/~megera/postgres/gist/ltree/

**update qq set l = 'TOP' || subpath(l, nlevel('TOP.Science.Astronomy')-1)
where l <@ 'TOP.Science.Astronomy'; **
...
Рейтинг: 0 / 0
ltree перемещение веток
    #35384652
laser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE OR REPLACE FUNCTION "transferThread"(text, bigint, bigint)
RETURNS boolean AS
$BODY$DECLARE

tb ALIAS FOR $1;
node_id ALIAS FOR $2;
new_parent_id ALIAS FOR $3;

old_path text;
new_path text;
new_parent_path text;
flag integer;
new_lquery text;
sql text;
error text;

BEGIN

-- Проверяем не совпадают ли идентификаторы элемента и предпологаемого родителя

IF node_id = new_parent_id THEN
error = 'ERROR --> nodeID == newParentID';
RAISE EXCEPTION '%', error;
END IF;

-- Проверяем не содержиться ли новый родитель в ветке елемента

sql = 'SELECT path FROM '||tb||' WHERE id = '||node_id;
EXECUTE sql INTO old_path;

sql = 'SELECT index(path,'''||old_path||''') FROM '||tb||' WHERE id = '||new_parent_id;
EXECUTE sql INTO flag;
IF flag = 0 THEN
error = 'ERROR --> newParentID is child nodeID';
RAISE EXCEPTION '%', error;
END IF;

-- Начинаем перемещение

sql = 'SELECT path FROM '||tb||' WHERE id = '||new_parent_id;
EXECUTE sql INTO new_parent_path;

new_path = new_parent_path||'.'||node_id;

new_lquery = old_path||'.*''';

sql = 'UPDATE '||tb||' SET path = text2ltree(replace(ltree2text(path), '''||old_path||''', '''||new_path||''')) WHERE path ~ '''||new_lquery;
RAISE NOTICE '%', sql;
EXECUTE sql;
RETURN TRUE;
/*
IF FOUND THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
*/
-- Проверяем не возникли ли исключительные ситуации

EXCEPTION
WHEN RAISE_EXCEPTION THEN
RAISE NOTICE '%', error;
RETURN FALSE;


END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ltree перемещение веток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]