Esempio n. 1
0
        /// <summary>
        /// Invokes merge process
        /// </summary>
        /// <param name="schemaName">Schema name.</param>
        /// <param name="groupId">Identifier of the group of search results</param>
        /// <param name="deduplicateRecordIds">Unique identifiers.</param>
        /// <param name="resolvedConflicts">Config for resolving conflicts.</param>
        /// <returns>Instance <see cref="DuplicatesMergeResponse"/> results for merge process execution.</returns>
        public virtual DuplicatesMergeResponse MergeEntityDuplicatesAsync(string schemaName, int groupId,
                                                                          List <Guid> duplicateRecordIds, Dictionary <string, string> resolvedConflicts = null)
        {
            DuplicatesMergeResponse result = new DuplicatesMergeResponse();

            if (!Locker.CanExecute(DeduplicationConsts.SearchOperationId, schemaName))
            {
                return(result);
            }
            ValidateDuplicatesResponse response = MergeHandler.ValidateDuplicates(schemaName, duplicateRecordIds, resolvedConflicts);

            if (response.ConflictsExists)
            {
                result.Conflicts = response.Conflicts;
                return(result);
            }
            MergeHandler.ExcludeSearchResultGroup(schemaName, groupId);
            string jobName    = string.Format(MergeDuplicatesJobNamePattern, schemaName, Guid.NewGuid());
            var    parameters = new Dictionary <string, object>()
            {
                { "SchemaName", schemaName },
                { "OperationId", DeduplicationConsts.MergeOperationId },
                { "DuplicateGroupId", groupId },
                { "DuplicateRecordIds", duplicateRecordIds },
                { "ResolvedConflicts", resolvedConflicts }
            };

            AppScheduler.ScheduleImmediateProcessJob(jobName, "Dedublication", MergeDuplicatesProcessName,
                                                     _userConnection.Workspace.Name, _userConnection.CurrentUser.Name, parameters);
            result.Success = true;
            return(result);
        }
        /// <summary>
        /// Begin search process.
        /// </summary>
        public void BeginSearch()
        {
            Guid   operationId          = DeduplicationConsts.SearchOperationId;
            bool   isFeatureEnable      = _userConnection.GetIsFeatureEnabled("FindDuplicatesOnSave");
            string tspFindDuplicateName = string.Format(FindDuplicateProcedurePattern, _schemaName);

            if (isFeatureEnable)
            {
                tspFindDuplicateName = string.Format(FindDuplicateProcedurePattern, String.Empty);
            }
            if (!Locker.CanExecute(operationId, _schemaName))
            {
                return;
            }
            Guid conversationId = ConversationProvider.BeginConversation(tspFindDuplicateName);

            try {
                Locker.SetLockState(conversationId, _schemaName, operationId, true);
                var storedProcedure = new StoredProcedure(_userConnection, tspFindDuplicateName);
                if (isFeatureEnable)
                {
                    storedProcedure.WithParameter("schemaName", _schemaName);
                    storedProcedure.WithParameter("xmlRows", String.Empty);
                    storedProcedure.WithParameter("sysAdminUnit", _userConnection.CurrentUser.Id);
                }
                storedProcedure.Execute();
                ConversationProvider.EndConversation(conversationId);
                CreateSuccessReminding();
            } catch (Exception e) {
                ConversationProvider.EndConversationWithError(conversationId, CommonSqlExceptionCode, e.Message);
                CreateReminding(_userConnection.GetLocalizableString("DeduplicationActionHelper", "FaildDuplicatesSearchMessage"));
            } finally {
                Locker.SetLockState(conversationId, _schemaName, operationId, false);
            }
        }
        /// <summary>
        /// Begin merge process.
        /// </summary>
        /// <param name="groupId">Identifier of the group of search results.</param>
        /// <param name="duplicateRecordIds">Collection of duplicate entity id.</param>
        /// <param name="resolvedConflicts">Config for resolving conflicts.</param>
        public void BeginMerge(int groupId, List <Guid> duplicateRecordIds, Dictionary <string, string> resolvedConflicts)
        {
            string mergeProcedure = string.Format(MergeProcedurePattern, _schemaName);

            if (!Locker.CanExecute(DeduplicationConsts.SearchOperationId, _schemaName))
            {
                return;
            }
            var handler = ClassFactory.Get <DeduplicationMergeHandler>(
                new ConstructorArgument("userConnection", _userConnection));

            handler.MergeEntityDublicates(_schemaName, groupId, duplicateRecordIds, resolvedConflicts);
        }