View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0003435SAS.Планета[All Projects] Багpublic16-04-2019 14:3314-06-2019 13:04
ReporterRedRat 
Assigned Tozed 
PriorityurgentSeveritymajorReproducibilityalways
StatusresolvedResolutionfixed 
PlatformWindowsOS8.1OS Versionx64
Product Version181221 
Target Version190707Fixed in Version190707 
Summary0003435: Удаление всех вложенных категорий при удалении одной из одноимённых родительских категорий
DescriptionСтруктура категорий основана исключительно на их именах, поэтому если у нас есть две родительские категории с одинаковыми именами, то при удалении любой из них будут удалены все дочерние категории независимо от того как они отображаются в деерве категорий. Программа об этом честно предупреждает, но все равно это опасное поведение.
Steps To Reproduce1. Создаем две категории с одинаковыми именами Cat1
2. Создаем метку с категорией с названием Cat1\Cat2 - такая категория будет созадана автоматически.
3. В дереве меток дочерняя категория отображается как дочерняя для одной из созданных категорий Cat1
4. Удаляем одну из категорий Cat1, у которой не отображаетсядочерних категорий.
5. Программа предупреждает, что будет удалена дочерняя категория и удаляет категорию Cat1\Cat2 вместе с вложенной меткой.
TagsNo tags attached.
Attached Files? file icon Test.db3 [^] (73,728 bytes) 16-04-2019 14:33
? file icon CategoryTest.sml [^] (751 bytes) 20-04-2019 13:47
? file icon Test.sml [^] (2,149 bytes) 20-04-2019 13:47

- Relationships
related to 0003454resolvedzed Невозможно изменить свойства категории меток 

-  Notes
(0018674)
RedRat (reporter)
20-04-2019 13:37
edited on: 20-04-2019 13:45

Пара уточнений:

1. При переносе любой категории на уровень с одноимённой, подкатегории из последней попадают в переносимую, а точки остаются на месте.

2. Данный баг стабильно повторяется как на SQLite, так и на SML базах данных.

По всей видимости, проблема заключается в том, что в БД все подкатегории связаны с родительскими категориями только параметром пути, а не ссылкой на индекс родителя, поэтому при наличии двух или более одноимённых категорий программа просто не знает, какие подкатегории куда совать. Ошибка дизайна БД?

(0018675)
RedRat (reporter)
20-04-2019 13:51

Для быстрой демонстрации бага сделал маленькую базу в SML и приложил её к этому репорту. Достаточно открыть её и переименовать категорию Cat3 в Cat1 - всё сами увидите.

До полноценного решения этой проблемы предлагаю в ночных сборках пока запретить создание одноимённых категорий, чтобы избежать непредвиденной потери данных.
(0018676)
zed (manager)
20-04-2019 14:10

В SML так было by design, а SQLite и прочие унаследовали поведение. Поэтому, запрет создания одноимённых категорий - по-моему единственный способ решения этого бага.
(0018684)
RedRat (reporter)
22-04-2019 11:18

Либо, как вариант, при появлении одноимённых категорий на одном уровне объединять их в одну с переносом всех точек и подкатегорий.
(0018716)
vdemidov (manager)
29-05-2019 08:33

Предлагаю фикс попроще. При удалении категории, проверять есть ли с еще категории с таким же именем. И если есть, то просто не запускать удаления дочерних категорий.
(0018726)
zed (manager)
04-06-2019 07:14

А может добавить в интерфейс поле NameInternal, сделать его уникальным (Name + ID) и использовать его, а для гуя оставить Name? Придётся залезть в реализацию SML и ORM (без изменения схемы), зато должно получиться надёжно.

Кроме того, в интерфейсе меток/категорий метод GetByName надо переделать так, чтобы он возвращал список. GetMarkByName по сути используется только в одном месте, при импорте меток, когда установлен флаг не импортировать, если метка с таким именем существует. И результат функции вообще не используется, а только проверяется на nil. А вот GetCategoryByName - сплошь и всюду.
(0018727)
zed (manager)
04-06-2019 07:25

А, нет. Надо менять схему и добавлять ParentID.
(0018730)
zed (manager)
04-06-2019 07:53

Значит, буду делать так:

Методы GetXXXByName переименую в GetFirstXXXByName, поскольку списки одноимённых меток/категорий нам пока нигде не нужны, но имя метода будет явно говорить, что могут быть и Next.

Добавлю методы GetXXXByNameCount - который будет возвращать число одноимённых меток, чтобы где надо, можно было просто проверить есть/нету или есть ли дубликаты.

В гуе сделаю запрет на создание (в том числе и методом переименования) одноимённых категорий и сделаю запрет удаления категории, если есть одноимённая. Для удаления такой категории, её надо будет сперва переименовать.
(0018731)
vdemidov (manager)
04-06-2019 08:16

> В гуе сделаю запрет на создание (в том числе и методом переименования) одноимённых категорий и сделаю запрет удаления категории, если есть одноимённая. Для удаления такой категории, её надо будет сперва переименовать.
Старые базы все еще будут жить с дублирующимися метками. Но хозяин - барин.
(0018732)
zed (manager)
04-06-2019 08:27

Одинаковые имена - не проблема БД, ведь если изменять схему, то имена так и останутся одинаковыми. По хорошему, да, схему надо менять, но это слишком калечащее изменение для поддержки не очень частого случая.
(0018733)
zed (manager)
04-06-2019 12:31

Сделал, тестируйте следующую ночную версию.

- Users who viewed this issue
User List Anonymous (492x), RedRat (18x), vdemidov (27x), zed (22x), ingener (4x), Tolik (2x), centron (1x), rass (3x)
Total Views 569
Last View 15-08-2020 13:18

- Issue History
Date Modified Username Field Change
16-04-2019 14:33 RedRat New Issue
16-04-2019 14:33 RedRat File Added: Test.db3
20-04-2019 13:37 RedRat Note Added: 0018674
20-04-2019 13:45 RedRat Note Edited: 0018674 View Revisions
20-04-2019 13:47 RedRat File Added: CategoryTest.sml
20-04-2019 13:47 RedRat File Added: Test.sml
20-04-2019 13:51 RedRat Note Added: 0018675
20-04-2019 14:10 zed Note Added: 0018676
22-04-2019 11:18 RedRat Note Added: 0018684
29-05-2019 08:30 vdemidov Severity crash => major
29-05-2019 08:30 vdemidov Status new => confirmed
29-05-2019 08:30 vdemidov Product Version .Nightly => 181221
29-05-2019 08:30 vdemidov Target Version => 190707
29-05-2019 08:30 vdemidov Summary Самопроизвольное удаление точек при удалении одноимённых категорий => Удаление всех вложенных категорий при удалении одной из одноимённых родительских категорий
29-05-2019 08:30 vdemidov Description Updated View Revisions
29-05-2019 08:30 vdemidov Steps to Reproduce Updated View Revisions
29-05-2019 08:33 vdemidov Note Added: 0018716
04-06-2019 07:14 zed Note Added: 0018726
04-06-2019 07:25 zed Note Added: 0018727
04-06-2019 07:53 zed Note Added: 0018730
04-06-2019 08:16 vdemidov Note Added: 0018731
04-06-2019 08:27 zed Note Added: 0018732
04-06-2019 09:52 zed Assigned To => zed
04-06-2019 09:52 zed Status confirmed => assigned
04-06-2019 12:31 zed Note Added: 0018733
04-06-2019 12:31 zed Status assigned => feedback
11-06-2019 11:38 zed Relationship added related to 0003454
14-06-2019 13:03 zed Status feedback => resolved
14-06-2019 13:03 zed Fixed in Version => 190707
14-06-2019 13:03 zed Resolution open => fixed



Copyright © 2007 - 2020 SAS.Planet Team