MyWackoSite: Chilim/ФорматФайлаНастроек ...

Home Page | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация | Вход:  Пароль:  

Форматы файлов настроек

Описание зависимости объектов

Предлагаю предоставить полную свободу описаний зависимостей. По каждому объекту, используя загрузчик, можно получить его замыкание. Набросок схемы файла:

<one-sided name=string atSameTransaction=boolean onDelete=(“noOrder”| “reverseOrder”| “deleteAll”) [atWrongOrder=(“ignore”| “save”| “wait”)] > – описание односторонней зависимости объектов
<dependentEntity>string</dependentEntity> – описание класса зависимого объекта
<loaderAlias>string</loaderAlias>
<parameter name=string>string</parameter> – параметры метода
...
<parameter name=string>string</parameter>
</one-sided>

<many-sided name=string atSameTransaction=boolean> – описание неразделимого множества объектов
<entity>string</entity> – описания классов объектов группы
...
<entity>string</entity>
<loaderAlias>string</loaderAlias>
<parameter name=string>string</parameter> – параметры метода
...
<parameter name=string>string</parameter>
</many-sided>

<loader>
<loaderClassName>string</loaderClassName>
<methodName>string</methodName>
<alias>string</alias>
</loader>

Метод загрузчика должен иметь вид:
Map<_dependentClass_, Set<_closureClass_>> LoaderName.methodName( Set<_dependentClass_> obj, Properties parameters);

Пусть зависимость определена с аттрибутом atSameTransaction="true". Тогда информация о ней передается при репликации зависимого объекта. Если это множество(many-sided) – порядок не важен, если дерево из односторонних зависимостей – важен. (Если ОЗ образуют цикл – это ошибка).
Пусть теперь зависимость определена с аттрибутом atSameTransaction="false". Тогда дерево ОЗ влияет на очередь отправки объектов (получившееся дерево объектов является одной группой отправки), информация о зависимостях не передается. Множество в этом случае не имеет особого смысла, но его тоже можно обрабатывать как одну группу отправки.

Описание решений конфликтов


Можно описать правила выбора объекта при конфликте: например, что один узел «авторитетнее» другого, узел более или менее «авторитетный», чем остальные; то же самое для отдельных классов. Также можно позволить добавить имя класса с методами, выбирающими между двумя объектами фиксированного (или любого) класса.
Для каждого правила определить приоритет.
Тогда при конфликте обязанность выбора падет на администратора только если:
(Основано на слухах, что скоро конфликты можно будет разрешать «руками», через панель администрирования репликатора).
 
Один файл. [Показать файлы/форму]
Комментарии [Скрыть комментарии/форму]

Эти описания, как я понимаю, описывают связи между классами. Вроде бы, возражений нет.
Но я не вижу описания взаимосвязи между объектами. Т.е. между какими экземплярами dependentEntity и closureEntity будет устанавливаться связь.

-- FatBrother (2009-07-28 17:35:24)

Не совсем так. Для объекта по имени класса можем найти все его потенциальные зависимости. Для каждой зависимости объявлен класс-загрузчик с методом, который по зависимому объекту путем совершения над ним некоторого ритуала (например, просто сравнением полей или выполнением другого SQL-запроса) находит тот объект, от которого наш объект зависит.
Решение довольно универсально.
Думаем над возможностью передавать загрузчику параметры, чтобы не повторяться.

-- ReplicationProject (2009-07-28 18:37:10)

Это универсально, но вынуждает отбирать зависимости квадратичным алгоритмом (на каждый документ-замыкание делается по одному sql запросу).

-- FatBrother (2009-07-28 18:49:02)

В том смысле, что будет большая нагрузка на БД? Можно сделать так, чтобы для объектов одного класса замыкания загружались «оптом» (заранее анализировать множество измененных объектов и разделять их по классам). Тогда чтобы получить множество замыканий (по одному правилу), нужно составить хитрый SQL запрос и потом, на стороне репликатора, искать что чему соответствует.

-- ReplicationProject (2009-07-29 10:03:19)

Ну да, хотелось бы именно так. Во всяком случае, когда это возможно. Наверное, не sql, а hql, чтобы сразу получать множество объектов.

-- FatBrother (2009-07-29 19:28:49)