Проект ACIS: содержание, old manual.
Пользователь зашёл в систему, что-то поделал и вышел. ACIS::Web или помогающий ей скрипт "чистильщик" закрыли сессию, сохранив user-data файл в нужное место и передали запрос РеПЕк-Индекс-демону на обработу этого файла. Что дальше?
Ed.Note: подумать!…
Модуль RePEc::Index::Collection::ACIS_UD должен
соответствовать интерфейсу
RI-Collection-класс. Интерфейс простой: если ты наследуешь от
RePEc::Index::Collection, то ты должен определить
два метода: open_data_file() и
get_next_record(). Ещё вызывается метод
check_id(), но в случае user-data, он должен просто
возвращать единицу.
Этот модуль будет в методе open_data_file()
открывать файл, читать его содержимое с помощью ACIS::Data::DumpXML::Parser. Метод get_next_record()
будет при первом вызове возвращать /data/user (тип:
"acis-user", id: login-name, т.е. email), а затем каждую из
/data/records/list-item (тип: "acis-record-person",
id: хэндл). Затем будет возвращать 0, чтобы R::I понял, что можно
переходить к следующему файлу. Потом всё повторяется.
Итак, в методе open_data_file() мы открываем файл и
загружаем (ACIS::Data::DumpXML::Parser) его содержимое в
память, в $self.
После этого $self->{userdata}->{user} это
/data/user, а
$self->{userdata}->{records} это массив записей
/data/records/list-items. Запоминаем, какой файл мы открыли и на
какой стадии его обработки мы находимся, первоначально
-1.
При вызове get_next_record() мы смотрим, где мы
находимся. Если текущая стадия == -1, готовим $self->{userdata}->{user} как запись. Для этого нам
нужно:
Ed.Note: Для вычисления контрольной суммы можно брать ветку, дампить её снова в строку (в XML или используя Data::Dumper), а потом брать ейный Digest::MD5::md_hex(). Неэффективно, но просто…
->{FILENAME})ARDB::Record. (то есть, в частности, метод
get_value().) Пусть это будет класс
ACIS::UserData::User::Record.Если текущая стадия больше чем -1, то готовим и аналогичным образом
возвращаем запись с соответствующим номером из массива
$self->{userdata}->{records}, превращая её в запись типа
"acis-record-person".
->{FILENAME}), login name
(->{LOGIN})ARDB::Record. Пусть это будет класс
ACIS::UserData::Data::Record.Всё.
ARDB plugin. Плагин ARDB::Plugin::Processing::ACIS_UD берет на обработку типы
"acis-user" и "acis-record-person".
Из записей типа "acis-user" извлекаем следующую информацию:
Из записей типа "acis-record-person" мы извлекаем следующую информацию:
affiliated-with для institutions,not-related-to для работ, от связи с которыми человек (пользователь) отказался,author-of, editor-of,
participant-of, contributor-to, … (?) для
документов, series и прочих объектов, составляющих Academic
Contributions Profileacis.names, с двумя полями (и значениями): person handle и список имён как единая строка, где элементы разделяются символом
"\n".acis.records/data/records/list-item/sci-fields) — пока никак, а со временем будем тоже где-то сохранять…Вам весело? Это ещё не всё. Надо не только обработать сами user-data файлы и содержащиеся в них записи, но и обрабатывать их удаление.
Пропал user-data файл? RePEc-Index это заметит и вызовет $ardb->delete_record( $id ). ARDB должен знать, что ему
делать. Но это просто: удалить соответствующие записи из таблиц
acis.users, acis.records,
acis.names.