Rodegast
PS. Сейчас попробовал её отправить в ChatGPT, он вообще ничего не понял.
Закинул твой же пост с картинкой в GPT
такой ответ предложил
Отлично! Учитывая твой исходный вопрос, ты работаешь с тремя таблицами:
elements
shema_scope
nexus
Все они используют составной ключ (branch, id) — значит, ветка (branch) — это твоя “коробка”, в которой живёт определённая версия схемы.
📦 Хранимая процедура: create_branch
Ниже — процедура, которая:
Принимает source_branch (откуда копировать) и new_branch (куда)
Копирует:
elements
shema_scope
nexus
Заменяет branch на новую
Не трогает оригинальные id, element, element_1, element_2 и т.п. — ты сам этим управляешь
🧠 Условие:
Ты хранишь все версии в этих таблицах — новые branch просто добавляют копии, не затирая оригинал.
✅ Хранимая процедура:
sql
Копировать
Редактировать
CREATE OR REPLACE FUNCTION create_branch(source_branch UUID, new_branch UUID)
RETURNS void AS $$
BEGIN
-- Копируем elements
INSERT INTO elements (branch, id, func, type, text, idx, csv_status)
SELECT new_branch, id, func, type, text, idx, csv_status
FROM elements
WHERE branch = source_branch;
-- Копируем shema_scope
INSERT INTO shema_scope (
branch, element, return_type, func, argument, patern_id,
data_cast, data_cast_brainc, call, call_branch, constant,
constant_branch, call_operator, operator_branch, construct,
construct_branch, shema_scop, name, expression, csv_status
)
SELECT new_branch, element, return_type, func, argument, patern_id,
data_cast, data_cast_brainc, call, call_branch, constant,
constant_branch, call_operator, operator_branch, construct,
construct_branch, shema_scop, name, expression, csv_status
FROM shema_scope
WHERE branch = source_branch;
-- Копируем nexus
INSERT INTO nexus (branch, element_1, element_2, point_1, point_2, csv_status)
SELECT new_branch, element_1, element_2, point_1, point_2, csv_status
FROM nexus
WHERE branch = source_branch;
END;
$$ LANGUAGE plpgsql;
📦 Пример использования
sql
Копировать
Редактировать
-- Генерируем UUID новой ветки (можно сделать в коде)
SELECT gen_random_uuid(); -- допустим: '11111111-2222-3333-4444-555555555555'
-- Создаём ветку
SELECT create_branch(
'00000000-0000-0000-0000-000000000000', -- исходная ветка main
'11111111-2222-3333-4444-555555555555' -- новая ветка
);
📌 Примечания
id, element, element_1, element_2 остаются теми же — потому что они уникальны только в рамках branch.
Все внешние связи (func, call, element, …) продолжают работать, потому что они тоже указывают на (branch, id).
Никаких DELETE и UPDATE — всё аккуратно, как в Git.
Если хочешь — могу помочь добавить:
авто-лог в таблицу branches
авто-проверку на существование ветки
merge или diff-логику
Хочешь продолжить в эту сторону?
Интересны твои замечания, чем этот вариант плох. Тут даже не про работоспособность кода пока, а про саму идею. Правильно ли нейросеть тебя поняла, что тебе нужно