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]); }