Добавление правила поиска дублей
Glossary Item Box
Общие положения
Процесс дедупликации использует правила, которые оформлены в виде хранимых процедур. Каждое правило при выполнении наполняет таблицу ContactDuplicateSearchResult списком дублей. Результаты поиска группируются по правилам и отображаются на странице поиска дублей. Подробно эта функциональность описана в разделе документации "Поиск и объединение дублей".
Алгоритм добавления пользовательского правила поиска дублей
1. При необходимости следует добавить в схему объекта колонку, по значению которой будет производится поиск дублей.
2. Добавить хранимую процедуру поиска в базу данных приложения.
3. Зарегистрировать хранимую процедуру как новое правило.
Пример добавления пользовательского правила поиска дублей
Описание кейса
При запуске процесса дедупликации контакты, у которых совпадают значения в колонке [ИНН], должны считаться дублями и отображаться в результатах поиска.
Алгоритм реализации кейса
1. Добавление поля, по значению которого будет производится поиск дублей
Поскольку в стандартной странице редактирования контакта поле [ИНН] отсутствует, необходимо добавить его на страницу, например, с помощью мастера раздела. Для страницы раздела [Контакты] необходимо добавить поле со значением "ИНН" свойства [Заголовок] и значением "UsrInn" свойства [Название в БД]. Мастер автоматически добавит необходимую колонку в объект. Информация о том, как добавить поле на страницу, доступна в статье "Как настроить поля страницы".
2. Добавление хранимой процедуры поиска в базу данных приложения
Для того чтобы реализовать поиск дублей по какому-либо разделу, необходимо в базу данных добавить соответствующую хранимую процедуру. Для добавления хранимой процедуры поиска дублей по полю [ИНН] необходимо выполнить следующий SQL-запрос:
-- Проверка наличия хранимой процедуры с именем tsp_FindContactDuplicateByInn. IF NOT OBJECT_ID('[dbo].[tsp_FindContactDuplicateByInn]') IS NULL BEGIN -- Удаление хранимой процедуры. DROP PROCEDURE [dbo].[tsp_FindContactDuplicateByInn]; END; GO -- Создание хранимой процедуры. CREATE PROCEDURE [dbo].[tsp_FindContactDuplicateByInn] ( -- Этот табличный параметр передается только в случае сохранения нового контакта. -- Содержит данные нового контакта. -- В случае запуска процесса глобального поиска дублей переданный параметр не содержит данных. @parsedConfig CreatingObjectInfo READONLY, -- Уникальный идентификатор пользователя, который запустил поиск дублей. @sysAdminUnit UNIQUEIDENTIFIER, -- Идентификатор текущего правила из таблицы [ContactDuplicateSearchResult]. -- Этот идентификатор создается после регистрации правила в системе. @ruleId UNIQUEIDENTIFIER ) AS BEGIN -- Получение количества записей из принимаемой таблицы для определения запуска глобального поиска дублей. DECLARE @parsedConfigRowsCount INT = (SELECT COUNT(*) FROM @parsedConfig); -- Создание временной таблицы с данными контактов для поиска. CREATE TABLE #searchContact ( [UsrInn] INT, [SortDate] DATETIME ); -- В случае глобального поиска выполняется заполнение временной таблицы данными. IF @parsedConfigRowsCount = 0 BEGIN -- Добавление во временную таблицу данных для поиска дублей. INSERT INTO #searchContact ([UsrInn], [SortDate]) -- Запрос на выборку данных контактов. SELECT -- Выбираются колонки ИНН даты модификации контакта. [UsrInn], MAX([ModifiedOn]) FROM [Contact] -- Добавляется группировка по полям для возможности использовать проверку на количество. GROUP BY [UsrInn] -- Таблица заполняется только в случае наличия более одного контакта. HAVING COUNT(*) > 1; END; -- Заполнение таблицы результатов. INSERT INTO [ContactDuplicateSearchResult] ([ContactId], [GroupId], [RuleId], [SysAdminUnitId]) SELECT -- Идентификатор дубля контакта. [vr].[Id], -- Формирование номера группы. DENSE_RANK() OVER (ORDER BY [vr].[SortDate] DESC, [vr].[UsrInn]), -- Идентификатор правила. @ruleId RuleId, -- Идентификатор пользователя, под которым запущен процесс поиска дублей. @sysAdminUnit FROM ( -- Подзапрос, из которого заполняется таблица дублей. SELECT -- Идентификатор контакта. [v].[Id], --ИНН контакта. [v].[UsrInn], -- Дата сортировки. [r].[SortDate] -- Таблицы, из которых берутся данные. FROM [Contact] [v], #searchContact r -- Правило, по которому определяется, что контакты — дубли. WHERE [v].[UsrInn] = [r].[UsrInn] -- Группировка результата поиска. GROUP BY [v].[UsrInn], [r].[SortDate], [v].[Id] ) [vr]; END; GO
3.
Регистрация хранимой процедуры как нового правила
Для регистрации созданной хранимой процедуры как нового правила поиска дублей необходимо добавить соответствующую запись в таблицу DuplicatesRule. Для этого небходимо выполнить следующий SQL-запрос:
-- Переменная, хранящая значение колонки UId схемы Contact. DECLARE @ContactUId UNIQUEIDENTIFIER; -- Получает значение колонки UId схемы Contact. Set @ContactUId = (SELECT TOP 1 SysSchema.UId FROM SysSchema WHERE SysSchema.Name = 'Contact' AND SysSchema.ExtendParent = 0); -- Добавляет новое правило в систему. INSERT INTO DuplicatesRule ([IsActive], [ObjectId], [ProcedureName], [Name]) VALUES (1, @ContactUId, 'tsp_FindContactDuplicateByInn', 'Дубли контактов. ИНН');
Для применения изменений необходимо обновить страницу раздела с удалением кеша. После этого в списке правил поиска дублей появится новое правило (рис. 1).
Рис. 1. — Правило поиска дублей по полю [ИНН]