r25 - 22 Oct 2016 - 21:44:26 - Sergej ZnamenskijYou are here: TWiki >  IS4UGP Web > EduBotik > AlternatingKeys

Альтернирование ключей в дереве дел

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

Записанный в базе альтернирующий ключ описывает область применимости сохранённого с ним значения, которая оказывается зависима от узла и пользователя.

Альтернирующий ключ отличается префиксом, регламентирующим применимость значения.

Синтаксис ключей в узлах

Пространство имён атрибутов (узлов и пользователей)

Имя атрибута узла, не должно содержать управляющих символов «!()=/» и не должно начинаться на символ из «-+?&».

Имя атрибута не может начинаться парой символов «@@».

Имя атрибута не может совпадать с зарезервированным словом «user».

Если имя атрибута начинается на «@», то этот атрибут есть роль, то есть набор ID пользователей в данном узле (и, возможно, имён других ролей пользователей), например, «@student=[127,13,@cource2012,@cource2011,@cource2010,@cource2009,@cource2008. Пользователь может входить в несколько таких списков, то есть иметь несколько ролей.

Символ «@» в конце используется только для имён служебных атрибутов. Например, значением атрибута «restricted_to@», является список ролей, наличие хотя бы одной из которых в узле необходимо пользователю для получения доступа к узлам ветки, выходящей из этого узла.

Префиксы альтернирующих ключей

Префикс описывает область действия альтернирующего ключа.

Например,

+(class=discuss_paper)&(@author)+

означает, что указанное значение атрибута изменяется во всех таких ветках, корни которых являются потомками данного и имеют заданный класс а пользователь в этих корнях имеет роль @author.

Это сохранение динамично, а не статично: при изменении любых условий (например, изменении класса) значение может появляться и исчезать в соответствии с записью. Такая динамичность упрощает управление.

Префиксы как непрерывно вычисляемые алгоритмы

Префикс в наиболее общем случае представляет собой условную директиву, окружённую директивами направления.

Директивы направления

  • «+» — в начале префикса означает, что последующая условная директива будут применяться к каждому узлу ветки, выходящей из текущего узла; а в конце префикса что значение атрибута изменяется у всех потомков таких узлов;
  • «-» — то же, но за исключением самого узла;

Условная директива означает проверку записанной через конъюктивную связку «&» условий следующего вида:

  • «(имя атрибута=значение)» истинно если атрибут узла (или пользователя) имеет указанное значение;
  • «(имя атрибута!=значение)» отрицание предыдущего;
  • «(имя атрибута)» истинно при наличии в узле указанного атрибута, а если атрибут- роль, то наличие у текущего пользователя указанной роли;
  • «(!имя атрибута)» истинно при отсутствии указанного атрибута в узле (соответственно, роли у пользователя);
  • «()» — повышает приоритет директивы.
Атрибуты, включённые в условные директивы, назовём управляющими.

Только в конце префикса может стоять директива

  • «?» —, означающая, что в базе сохранено не само значение, а вычисляющий его программный код (на языке perl).

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

Поскольку может оказаться несколько записей, задающих атрибут в узле, то сразу условимся о приоритетах:

  • Запись в корне ветки имеет более низкий приоритет, чем запись в корне подветки;
  • Из двух записей в одном узле более высокий приоритет имеет запись с большим количеством одновременно проверяемых условий;
  • При равенстве приоритетов значение в узле устанавливает новейшая из конфликтующих за это для текущего пользователя записей.
Если записи случайно помечены одинаковым временем, то старейшей считается та из них, ключ которой больше при лексикографическом сравнении.

Списки регистрации

В каждом узле с альтернирующими ключами поддерживается
  • «+AltReadKeys» - хеш имён атрибутов, влияющих на наследование в ветке. Значениями являются списки ключей альтернирующих записей, на наследовании которых может повлиять атрибут.

Отслеживание ToDo

ToDo появляется при изменении альтернирующих ключей и проявляется в изменении приоритетности узлов, проявляющемся в раскрытии узла в браузере пользователя, либо в уведомлении по email если пользователь пассивен в течение указанного времени.

Это происходит в результате обновления в персональном узле пользователя записи со списком статусов активных ToDo, отражающей наличие ToDo пользователя в системном дереве.

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

  • Если узел содержит атрибут, который может влиять на наследство, то в нём размещается указатель на корень контекстной ветки, а в этом корне размещаются
    1. список всех таких потенциально модифицирующих наследство узлов и влияющих атрибутов в каждом из них,
    2. общее наследство ветки с датами изменений,
    3. список контекстных подветок,
    4. список альтернирующих ключей родительских узлов, которые влияют на наследство в ветке (или подветках).
    5. списки потенциально влияющих на ToDo альтернирующих ключей родительских узлов, потенциально модифицирующих наследство узлов ветки и их влияющих атрибутов, кторые обновляются реже, но эти обновления порой связаны с очень существенными затратами.
  • При чтении данных узла
    1. выявляются корень его контекстной ветки и модифицирующие узлы на пути к нему
    2. вычисляется наследство,
    3. формируется ассоциативный массив сиюминутных данных узла и
    4. помечается датой последнего изменения в случае удалённого чтения; при чтении в совместную (shared) память пометка датой помогает при запросах браузера на проверку обновлений.
  • При появлении любых изменений в наследстве --- в контекстном узле сохраняется дата изменений, чтение которой определяет нужду в обновлении данных исполняющей нити (или процесса).
  • При сохранении любого данного
    1. Сохраняется информация в Server Logs,
    2. Если система свободна (т.е. предыдущая часть лога полностью обработана), то
      1. анализируется контекстный корень,
      2. вносятся минимальные необходимые изменения в данных ветки,
      3. выявляются узлы, в которых изменились требуемые действия (ToDo) и вносятся изменения в пользовательских узлах; при этом могут создаваться новые контекстные ветки.
    3. Иначе проверется, жив ли обработчик и если нет или обработка слишком затянулась, то сообщает администратору.

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r25 < r24 < r23 < r22 < r21 | More topic actions
IS4UGP.AlternatingKeys moved from IS4UGP.AcceleratedSystem2013 on 01 Apr 2013 - 17:50 by Sergej Znamenskij - put it back
 
Powered by TWiki

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback