feat: delete ps node #20

Open
ivan.dev wants to merge 6 commits from VORKOUT-29 into master
Member
No description provided.
ivan.dev added 1 commit 2025-10-22 16:01:48 +05:00
ivan.dev requested review from cyrussmeat 2025-10-22 16:02:00 +05:00
ivan.dev requested review from mikhail.dev 2025-10-22 16:02:00 +05:00
ivan.dev requested review from vlad.dev 2025-10-22 16:02:00 +05:00
cyrussmeat requested changes 2025-10-23 10:32:21 +05:00
Dismissed
@@ -89,0 +120,4 @@
return all_child_nodes
async def get_nodes_for_deletion_ordered(connection: AsyncConnection, node_id: int) -> List[int]:
Owner

Там FK у node_link на node_id (т.е. нужно удалять node_link раньше node_id, но позже next_node_id), есть у меня сомнение, что такое упорядочивание здесь реализовано.

Тут можно было после размышлений поступить проще - удалять Узлы прямым запросом через алхимию с JOIN'ами по связям, тогда можно не париться с упорядочиванием.

Второй вариант - сделать ON DELETE CASCADE в определении FK на node_link'е.

Там FK у node_link на node_id (т.е. нужно удалять node_link раньше node_id, но позже next_node_id), есть у меня сомнение, что такое упорядочивание здесь реализовано. Тут можно было после размышлений поступить проще - удалять Узлы прямым запросом через алхимию с JOIN'ами по связям, тогда можно не париться с упорядочиванием. Второй вариант - сделать ON DELETE CASCADE в определении FK на node_link'е.
Owner

Ещё момент. Циклы у нас могут быть, когда замыкающая цикл нода ссылается куда-то "наверх".

Это решается маркировкой уровня "иерархии" у нод и последующей проверкой перехода по уровням (вниз - норм, а если вверх - не трогаем ноду, на которую ссылаются), пока можно не реализовывать, т.к. до циклов надо реально ещё дожить, но момент нужно держать в уме.

Ещё момент. Циклы у нас могут быть, когда замыкающая цикл нода ссылается куда-то "наверх". Это решается маркировкой уровня "иерархии" у нод и последующей проверкой перехода по уровням (вниз - норм, а если вверх - не трогаем ноду, на которую ссылаются), пока можно не реализовывать, т.к. до циклов надо реально ещё дожить, но момент нужно держать в уме.
ivan.dev marked this conversation as resolved
mikhail.dev requested changes 2025-10-23 12:34:16 +05:00
@@ -89,0 +105,4 @@
query = (
select(ps_node_table)
.join(node_link_table, ps_node_table.c.id == node_link_table.c.next_node_id)
.where(node_link_table.c.node_id == current_node_id)
Member

У меня вопрос - а насколько много запросов тут может проходить?
Это я отсылаю к проблеме N + 1.

У меня вопрос - а насколько много запросов тут может проходить? Это я отсылаю к проблеме N + 1.
Owner

Особой нагрузки тут не предвидится, как минимум в разрезе редактирования тела схемы процесса. Речь про максимум пару десятков узлов, в исключительных случаях может быть побольше.

Особой нагрузки тут не предвидится, как минимум в разрезе редактирования тела схемы процесса. Речь про максимум пару десятков узлов, в исключительных случаях может быть побольше.
Member

Даже если речь идёт о паре десятков узлов, то это уже получается 20 похожих запросов подряд.

Даже если речь идёт о паре десятков узлов, то это уже получается 20 похожих запросов подряд.
Owner

С этим трудно спорить.
В целом, если учитывать латентность сетевую и парсинг SQL, оно уложится в 0.1-0.3сек на подобных данных.

Но согласен, что это антипаттерн с т.з. работы с БД.

С этим трудно спорить. В целом, если учитывать латентность сетевую и парсинг SQL, оно уложится в 0.1-0.3сек на подобных данных. Но согласен, что это антипаттерн с т.з. работы с БД.
ivan.dev marked this conversation as resolved
@@ -89,0 +183,4 @@
successfully_deleted = []
for node_id in node_ids:
success, error_message = await delete_ps_node_by_id_completely(connection, node_id)
Member

Ну и здесь на каждый id будет по несколько отдельных запросов. Неэффективно.

Ну и здесь на каждый id будет по несколько отдельных запросов. Неэффективно.
ivan.dev marked this conversation as resolved
@@ -32,0 +54,4 @@
)
try:
await db_user_role_validation_for_list_events_and_process_schema_by_list_event_id(
Member

Что за любовь к длиннейшим названиям?)

Что за любовь к длиннейшим названиям?)
Owner

Это LLM, мне кажется )

Это LLM, мне кажется )
Author
Member

В каком то из прошлых ПРов раз было замечание о неинформативности названий функций, мне переименовать?

В каком то из прошлых ПРов раз было замечание о неинформативности названий функций, мне переименовать?
Owner

Это предмет крупного рефакторинга. В основном наблюдение говорит об избыточности семантики в названиях функций, т.к. при корректном подходе к проектированию (инкапсюляция) нет необходимости повторять в методе контекстную часть как минимум (т.е. если метод сидит в классе ps_node, то повторять это в названии скорее тавтология).

Парадигма ООП и частично ФП за сохранение читаемости в условиях умолчаний.

В большинстве случаев для соблюдения уникальности семантики названия метода и переменной должно хватать схемы Императив + Объект (save_file), Предикат + Императив (can_edit, is_valid()), в исключительных случаях (если это общая библиотека функций и ресурсов) можно использовать Функция/Объект верхнего уровня + Императив + Целевой Объект.

Всё - три слова и контекст должны составлять уникальную семантику. Если не получается - значит есть проблемы в композиции и стоит сначала решить их.

Это предмет крупного рефакторинга. В основном наблюдение говорит об избыточности семантики в названиях функций, т.к. при корректном подходе к проектированию (инкапсюляция) нет необходимости повторять в методе контекстную часть как минимум (т.е. если метод сидит в классе ps_node, то повторять это в названии скорее тавтология). Парадигма ООП и частично ФП за сохранение читаемости в условиях умолчаний. В большинстве случаев для соблюдения уникальности семантики названия метода и переменной должно хватать схемы Императив + Объект (save_file), Предикат + Императив (can_edit, is_valid()), в исключительных случаях (если это общая библиотека функций и ресурсов) можно использовать Функция/Объект верхнего уровня + Императив + Целевой Объект. Всё - три слова и контекст должны составлять уникальную семантику. Если не получается - значит есть проблемы в композиции и стоит сначала решить их.
Author
Member

Понял

Понял
Member

Согласен. Семантика в названиях должна быть отображена, но это не значит, что для её выражения требуется по 10 слов, лишь главная суть для текущего контекста.

Согласен. Семантика в названиях должна быть отображена, но это не значит, что для её выражения требуется по 10 слов, лишь главная суть для текущего контекста.
ivan.dev marked this conversation as resolved
@@ -0,0 +49,4 @@
def create_validation_error(
message: str, status_code: int = 400, details: Optional[Dict[str, Any]] = None
Member

status_code: int = 422?

`status_code: int = 422`?
ivan.dev marked this conversation as resolved
ivan.dev added 1 commit 2025-10-28 14:30:28 +05:00
ivan.dev added 1 commit 2025-10-28 14:32:46 +05:00
ivan.dev added 1 commit 2025-10-28 15:07:29 +05:00
ivan.dev added 1 commit 2025-10-28 15:43:19 +05:00
mikhail.dev reviewed 2025-10-28 22:08:03 +05:00
mikhail.dev left a comment
Member

Как будто бы в эндпоинтах не должно быть так много кода. Что скажешь, если повыносить бизнес-логику в сервисы?

Как будто бы в эндпоинтах не должно быть так много кода. Что скажешь, если повыносить бизнес-логику в сервисы?
ivan.dev added 1 commit 2025-10-29 18:58:17 +05:00
cyrussmeat approved these changes 2025-10-30 08:14:28 +05:00
vlad.dev approved these changes 2025-11-01 14:43:51 +05:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin VORKOUT-29:VORKOUT-29
git checkout VORKOUT-29
Sign in to join this conversation.
No Label
4 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Vorkout/connect#20
No description provided.