Добавление правила поиска дублей
Glossary Item Box
Общие положения
Процесс дедупликации использует правила, которые оформлены в виде хранимых процедур. Каждое правило при выполнении наполняет таблицу ContactDuplicateSearchResult списком дублей. Результаты поиска группируются по правилам и отображаются на странице поиска дублей. Подробно эта функциональность описана в разделе документации "Поиск и объединение дублей".
Для добавления пользовательского правила поиска дублей необходимо:
1. Добавить в схему объекта колонку (при необходимости), по значению которой будет производится поиск дублей.
2. Добавить хранимую процедуру поиска в базу данных приложения.
3. Зарегистрировать хранимую процедуру как новое правило.
Описание примера
При запуске процесса дедупликации контакты, у которых совпадают значения в колонке [ИНН], должны считаться дублями и отображаться в результатах поиска.
Алгоритм реализации примера
1. Добавление поля, по значению которого будет производится поиск дублей
Так как в стандартной странице редактирования контакта поле [ИНН] отсутствует, добавьте его на страницу, например, с помощью мастера раздела. Процесс добавления поля на страницу подробно описан в статье "Как настроить поля страницы".
Свойства нового поля:
- [Заголовок] ([Title]) — "ИНН" ("Taxpayer ID");
- [Название в БД] ([Name in DB])— "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
К СВЕДЕНИЮ
Иногда возможно возникновение ошибки "Cannot resolve the collation conflict between "Cyrillic_General_CI_AS" and "Cyrillic_General_CI_AI" in the equal to operation". Чтобы ее исправить, укажите при создании колонки таблицы нужный COLLATE.
CREATE TABLE #searchContact ([Name] NVARCHAR(128) COLLATE Cyrillic_General_CI_AI, [BirthDate] DATETIME, [SortDate] DATETIME );
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. — Правило поиска дублей по полю [ИНН] ([Taxpayer ID])