Проект 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
.