СВОБОДНЫЙ ПОИСК |
В режиме ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК (то же самое и в Арме "Каталогизатор) для СВОБОДНОГО ПОИСКА в случае применения конструкции "|" (определяющей требование запроса к ОДНОМУ повторению поля) предлагается НОВАЯ структура запроса.
Прежняя структура запроса:
| <логическое выражение на языке форматирования ИРБИС>
Новая структура запроса: |
|МММ <логическое выражение на языке форматирования ИРБИС>
где МММ - метка поля, к повторениям которого предъявляются требования запроса.
Причина этого нововведения:
Механизм свободного последовательного поиска состоит в следующем. Введенное <логическое выражение на языке форматирования ИРБИС> (далее просто <логическое_выражение>) превращается в формат следующего вида:
if <логическое_выражение> then '1' else '0' fi
Все документы, участвующие в поиске, последовательно форматируются с помощью этого формата: если результат форматирования 1, документ соответствует запросу, если 0 - не соответствует.
Если запрос свободного поиска задается в виде:
| <логическое_выражение>
то он превращается в формат
(if <логическое_выражение> then '1' else '0' fi)
т.е. создается формат с ПОВТОРЯЮЩЕЙСЯ группой. И вот тут таится "бомба".
Внимание: |
Логическое выражение может быть составлено так, что это приведет к ЗАЦИКЛИВАНИЮ повторяющейся группы. Это в свою очередь приведет к тому, что последовательный поиск даст ВЕРНЫЙ результат, но будет продолжаться ЧРЕЗВЫЧАЙНО долго (в десятки или даже сотни раз медленнее положенного времени). |
Пример: |
В БД Читателей необходимо найти ДОЛЖНИКОВ на сегодняшний день (не ДЕРЖАТЕЛЕЙ, а ДОЛЖНИКОВ). Для этого выполняем свободный последовательный поиск ("забыв", что в АРМе Книговыдача есть соответствующий режим: СПИСОК ДОЛЖНИКОВ/ЗАДОЛЖЕННОЙ ЛИТЕРАТУРЫ): | (v40^F : '*') and (v40^E<&uf('3')) В результате создается формат: (if (v40^F : '*') and (v40^E<&uf('3')) then '1' else '0' fi) в котором конструкция, возвращающая текущую дату - &uf('3') - приводит к зацикливанию повторяющейся группы (почему - объяснять здесь не имеет смысла, это самый "тонкий" вопрос языка форматирования). Такой последовательный поиск (на большой БД RDR) будет продолжаться непомерно долго. |
Предлагаемая новая структура запроса
|MMM <логическое_выражение>
позволяет создавать формат, в котором исключается зацикливание:
(if p(vMMM) then if <логическое_выражение> then '1' else '0' fi fi)
В случае нашего примера новый запрос и соответствующий формат будут выглядеть следующим образом:
|40 (v40^F : '*') and (v40^E<&uf('3'))
(if p(v40) then if (v40^F : '*') and (v40^E<&uf('3')) then '1' else '0' fi fi)
Вернуться:Последовательный поиск Арма "Каталогизатор"
См. также: