DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Определение потенциальных повторов

Теперь займемся немного более сложной задачей - поиском повторных нарядов. Используем для этого две отдельные операции. Первая операция на основании сравнения типа и даты наряда с первым типом наряда в критерии определит, может ли наряд потенциально иметь повтор. Вторая операция просмотрит остальные наряды по тому же адресу и выберет действительно повторные, сравнив их тип с типом повторного наряда в критерии.
Объясним подробнее на конкретном примере. Рассмотрим такую запись в таблице критериев:

Эта запись говорит о том, что если начиная с 19 апреля 2005 года в течение 30 дней за нарядом типа 801 последует по тому же адресу наряд типа 87, то это будет повторный наряд.
Теперь рассмотрим следующие три наряда.

При обработке нашей функцией наряд номер 1016 по адресу 343, имеющий тип 801, сначала будет отмечен, как кандидат на наличие повтора. Все последующие наряды типа 87 по адресу 343 в течение 30 дней будут считаться фактическими повторными нарядами. То есть в качестве действительных повторных нарядов наша функция выберет наряды с номерами 1863 и 2228.
Для нахождения фактических повторных нарядов надо сначала отобрать кандидатов на повтор. Для большей стройности кода выделим логику поиска «потенциальных повторов» в отдельную функцию с именем load_potential_repeat. Сначала приведем код, а затем разберемся, как он работает.


Это может показаться немного запутанным, но на самом деле это очень простой алгоритм. Для каждого критерия в данном регионе надо задать такие вопросы:
Совпадает ли первый тип наряда в критерии с типом обрабатываемого наряда? Если да, то продолжить.
Предшествует ли дата ввода критерия дате обрабатываемого наряда? Если да, то продолжить.
Рассчитать хеш-значение на основе адреса наряда и пары типов нарядов, входящих в критерий.
Присутствует ли в ассоциативном массиве элемент с рассчитанным хеш-значением? Если нет, то продолжить.
Добавить в ассоциативный массив элемент, содержащий адрес и пару типов нарядов критерия, использовав в качестве индекса полученное хеш-значение.
Если, например, найдены три отдельных потенциальных повтора, то наш ассоциативный массив может выглядеть так:


В этом случае любые последующие наряды с типом 202 и адресом 874 будут признаны повторными, равно как и наряды типов 18 и 88 по адресам 1098 и 18 соответственно.
Ну а теперь приступим к поиску фактических повторов.
Определение фактических повторов
Найти фактические повторы несложно. Если тип наряда совпадает с типом повтора в какой-либо записи критерия и если имеется соответствующий элемент в ассоциативном массиве потенциальных повторов, то значит, найден фактический повторный наряд. Эту часть также выделим в отдельную функцию.

Приведем описание алгоритма. Для каждой записи таблицы критериев данного региона:
Совпадает ли тип обрабатываемого наряда с типом повторного наряда критерия? Если да, продолжить.
Рассчитать хеш-значение на основе адреса наряда и пары типов нарядов, входящих в критерий.
Если в ассоциативном массиве потенциальных повторов присутствует элемент с индексом, равным рассчитанному хеш-значению, то найден фактический повторный наряд.
Вернуть полученное хеш-значение, чтобы соответствующая строка могла быть найдена и сразу отправлена в конвейер.
 









jAntivirus