Неожиданно я столкнулся с проблемой при выводе книгообеспеченности для изданий по английскому языку. Выяснилось, что в связи с очень большим количеством студентов, которые изучают эту дисциплину(больше 5 тыс) следующая часть формата boko.pft даёт сбой:
&unifor('+7W555#',(if p(v691) then
if p(v691^9) then
if p(v691^l) then else
&unifor('7RDR,!UPS='v691^9,'!,mfn/')/
&unifor('7RDR,!?',v691^9,'!,mfn/')/
&unifor('7RDR,!',&unifor('G2*'v691^9),'!,mfn/')/
fi fi fi/)),&uf('+7G555'),
&uf('+7W5#'f(rsum((if p(g555) then '1;'fi/)),0,0))
Смысл этой конструкции прост – в ней собираются MFN записей, которые удаётся найти в базе RDR по термину v691^9 и подсчитываются. Тем не менее, поскольку существует ограничение на количество проходов в повторяющейся группе, код (if p(g555) then '1;'fi/) выполняется некорректно.
Я смог решить эту проблему конкретно для нашей библиотеки, поэтому хотел бы узнать мнение Светланы Михайловны и других библиотек относительно возможности универсального применения этого решения. Суть его проста – считать студентов не по записям, а по количеству постингов – т.е. ссылок в словаре(эта цифра отображается слева от термина в Каталогизаторе). Основанием для этого стало простое правило: если в поле нет повторяющихся значений и оно безусловно индексируется, количество постингов будет точно соответствовать количеству записей. У меня получился следующий код:
&uf('+1W3#',f(rsum(
(if p(v691) then
if p(v691^0) and a(v691^l) then
&uf('JRDR,?',v691^0),';'
fi fi/)
),0,0
),
),
Несложно заметить, что я исключил обращение к словарю UPS= и безпрефиксному словарю. Первое просто не нужно при работе по технологии уникальной дисциплины, второе в нашем случае бессмысленно, так как изучаемый язык у нас не учитывается при расчетах. Если же требуется учитывать язык, то эту конструкцию нужно модифицировать в зависимости от правил создания безпрефиксного словаря. Поскольку я не смог найти соответствующий фрагмент RDR.FST, и времени на поиски у меня, к сожалению, нет, вынесу вопрос об исключении двойного счёта при подсчёте записей на обсуждение.
Двойной счёт может быть исключён если мы точно знаем об отношениях словаря А(назовём так словарь с префиксом «?») и словаря Б(безпрефиксный словарь) между собой. Т. е. может ли быть одна запись быть связана одновременно и со словарём А и со словарём Б или, или записи этих словарей не пересекаются.
Таким образом, мои предложения сводятся к следующему:
1. Подготовить для работы по технологии индивидуального плана отдельные форматы: это повысит скорость расформатирования и упростит алгоритм;
2. Подсчитывать количество записей по количеству постингов;
3. Исходя из того, пересекаются ли словари А и Б использовать два запроса к постингам [&uf('JRDR,?',v691^0)';' &uf('JRDR,',&uf(‘G2*’, v691^0))';'] или только один. [&uf('JRDR,?',&uf(‘G2*’, v691^0)),';']
PS
Параллельно хотел бы выяснить в каком случае могут быть полезны «архивные повторения» поля v90.
Редактировано 4 раз. Последний раз 28.04.2008 00:24 пользователем Кирилл Соколинский (СЗТУ).