示例#1
0
        private IEnumerable <SearchIndexEntry> ProcessCompositeSearchParameter(SearchParameter searchParameter, Base resource, FhirEvaluationContext context)
        {
            Debug.Assert(searchParameter?.Type == SearchParamType.Composite, "The search parameter must be composite.");

            SearchParameterInfo compositeSearchParameterInfo = searchParameter.ToInfo();

            IEnumerable <Base> rootObjects = resource.Select(searchParameter.Expression, context);

            foreach (var rootObject in rootObjects)
            {
                int  numberOfComponents = searchParameter.Component.Count;
                bool skip = false;

                var componentValues = new IReadOnlyList <ISearchValue> [numberOfComponents];

                // For each object extracted from the expression, we will need to evaluate each component.
                for (int i = 0; i < numberOfComponents; i++)
                {
                    SearchParameter.ComponentComponent component = searchParameter.Component[i];

                    // First find the type of the component.
                    SearchParameter componentSearchParameterDefinition = _searchParameterDefinitionManager.GetSearchParameter(component.Definition.Url);

                    IReadOnlyList <ISearchValue> extractedComponentValues = ExtractSearchValues(
                        componentSearchParameterDefinition.Url,
                        componentSearchParameterDefinition.Type.Value,
                        componentSearchParameterDefinition.Target,
                        rootObject,
                        component.Expression,
                        context);

                    // Filter out any search value that's not valid as a composite component.
                    extractedComponentValues = extractedComponentValues
                                               .Where(sv => sv.IsValidAsCompositeComponent)
                                               .ToArray();

                    if (!extractedComponentValues.Any())
                    {
                        // One of the components didn't have any value and therefore it will not be indexed.
                        skip = true;
                        break;
                    }

                    componentValues[i] = extractedComponentValues;
                }

                if (skip)
                {
                    continue;
                }

                yield return(new SearchIndexEntry(compositeSearchParameterInfo, new CompositeSearchValue(componentValues)));
            }
        }
示例#2
0
 public static Uri GetComponentDefinitionUri(this SearchParameter.ComponentComponent component)
 {
     return(component?.Definition?.Url);
 }
 public static Uri GetComponentDefinitionUri(this SearchParameter.ComponentComponent component)
 {
     return(!string.IsNullOrEmpty(component.Definition) ? new Uri(component.Definition) : null);
 }