private async Task <MatchResultItem[]> FindMatches(
            Entity sourceEntity,
            DateTime pointInTime,
            MatchingProfileRuleset ruleset,
            MatchingProfile profile,
            CancellationToken cancellationToken)
        {
            var searchFilter = ruleset.Conditions
                               .Select(condition => ConvertRulesetConditionToSearchFilter(condition, sourceEntity))
                               .Where(filter => filter != null)
                               .ToArray();

            if (searchFilter.Length == 0)
            {
                _logger.Info($"No conditions could be fulfilled by source entity {sourceEntity} when finding candidates for profile {profile.Name} and ruleset {ruleset.Name}");
                return(new MatchResultItem[0]);
            }

            var searchRequest = new SearchRequest
            {
                Groups = new[]
                {
                    new SearchRequestGroup
                    {
                        Filter = searchFilter,
                        CombinationOperator = "and",
                    },
                },
                CombinationOperator = "and",
                Skip = 0,
                Take = 1000,
            };
            var searchResult = await _repository.SearchAsync(searchRequest, profile.CandidateType, pointInTime, cancellationToken);

            var candidates = searchResult.Results;

            bool CandidateHasMoreEntitiesThanSource(RegisteredEntity candidate)
            {
                var numberOfEntitiesThatAreSourceEntity =
                    candidate.Entities.Count(entity =>
                                             entity.EntityType.Equals(sourceEntity.EntityType, StringComparison.InvariantCultureIgnoreCase) &&
                                             entity.SourceSystemName.Equals(sourceEntity.SourceSystemName, StringComparison.InvariantCultureIgnoreCase) &&
                                             entity.SourceSystemId.Equals(sourceEntity.SourceSystemId, StringComparison.InvariantCultureIgnoreCase));

                return(candidate.Entities.Length - numberOfEntitiesThatAreSourceEntity > 0);
            }

            return(candidates
                   .Where(CandidateHasMoreEntitiesThanSource)
                   .Select(candidate =>
                           new MatchResultItem
            {
                RegisteredEntity = candidate,
                MatchReason = $"Matched using ruleset {ruleset.Name} in profile {profile.Name}",
            })
                   .ToArray());
        }
 private Entity GetMatchingEntity(Entity sourceEntity, RegisteredEntity matchedRegisteredEntity, MatchingProfileRuleset ruleset)
 {
     return(matchedRegisteredEntity.Entities[0]);
 }