public static void ValidateCompartmentSearchExpression(
            Expression expression,
            string compartmentType,
            string compartmentId)
        {
            CompartmentSearchExpression compartmentSearchExpression = Assert.IsType <CompartmentSearchExpression>(expression);

            Assert.Equal(compartmentType, compartmentSearchExpression.CompartmentType);
            Assert.Equal(compartmentId, compartmentSearchExpression.CompartmentId);
        }
        public override Expression VisitCompartment(CompartmentSearchExpression expression, object context)
        {
            SearchParameterInfo resourceTypeSearchParameter = _searchParameterDefinitionManager.Value.GetSearchParameter(KnownResourceTypes.Resource, SearchParameterNames.ResourceType);
            var compartmentType = expression.CompartmentType;
            var compartmentId   = expression.CompartmentId;

            if (Enum.TryParse(compartmentType, out ValueSets.CompartmentType parsedCompartmentType))
            {
                if (string.IsNullOrWhiteSpace(compartmentId))
                {
                    throw new InvalidSearchOperationException(Core.Resources.CompartmentIdIsInvalid);
                }

                var compartmentResourceTypesToSearch = new HashSet <string>();
                var compartmentSearchExpressions     = new Dictionary <string, (SearchParameterExpression Expression, HashSet <string> ResourceTypes)>();

                if (_compartmentDefinitionManager.Value.TryGetResourceTypes(parsedCompartmentType, out HashSet <string> resourceTypes))
                {
                    if (expression.FilteredResourceTypes.Any(resourceType => !string.Equals(resourceType, KnownResourceTypes.DomainResource, StringComparison.Ordinal)))
                    {
                        resourceTypes = resourceTypes.Where(x => expression.FilteredResourceTypes.Contains(x)).ToHashSet();
                    }

                    foreach (var resourceFilter in resourceTypes)
                    {
                        compartmentResourceTypesToSearch.Add(resourceFilter);
                    }
                }

                foreach (var compartmentResourceType in compartmentResourceTypesToSearch)
                {
                    var searchParamExpressionsForResourceType = new List <SearchParameterExpression>();
                    if (_compartmentDefinitionManager.Value.TryGetSearchParams(compartmentResourceType, parsedCompartmentType, out HashSet <string> compartmentSearchParameters))
                    {
                        foreach (var compartmentSearchParameter in compartmentSearchParameters)
                        {
                            if (_searchParameterDefinitionManager.Value.TryGetSearchParameter(compartmentResourceType, compartmentSearchParameter, out SearchParameterInfo sp))
                            {
                                searchParamExpressionsForResourceType.Add(
                                    Expression.SearchParameter(sp, Expression.And(Expression.StringEquals(FieldName.ReferenceResourceType, null, compartmentType, false), Expression.StringEquals(FieldName.ReferenceResourceId, null, compartmentId, false))));
                            }
                        }
                    }

                    foreach (var expr in searchParamExpressionsForResourceType)
                    {
                        if (compartmentSearchExpressions.TryGetValue(expr.ToString(), out var resourceTypeList))
                        {
                            resourceTypeList.ResourceTypes.Add(compartmentResourceType);
                        }
                        else
                        {
                            compartmentSearchExpressions[expr.ToString()] = (expr, new HashSet <string> {
                                compartmentResourceType
                            });
        public override SearchParameterQueryGeneratorContext VisitCompartment(CompartmentSearchExpression expression, SearchParameterQueryGeneratorContext context)
        {
            byte compartmentTypeId = context.Model.GetCompartmentTypeId(expression.CompartmentType);

            context.StringBuilder
            .Append(VLatest.CompartmentAssignment.CompartmentTypeId, context.TableAlias)
            .Append(" = ")
            .Append(context.Parameters.AddParameter(VLatest.CompartmentAssignment.CompartmentTypeId, compartmentTypeId, true))
            .AppendLine()
            .Append("AND ")
            .Append(VLatest.CompartmentAssignment.ReferenceResourceId, context.TableAlias)
            .Append(" = ")
            .Append(context.Parameters.AddParameter(VLatest.CompartmentAssignment.ReferenceResourceId, expression.CompartmentId, true));

            return(context);
        }
示例#4
0
 public object VisitCompartment(CompartmentSearchExpression expression, Context context)
 {
     AppendArrayContainsFilter(GetCompartmentIndicesParamName(expression.CompartmentType), expression.CompartmentId);
     return(null);
 }
 public NormalizedSearchParameterQueryGenerator VisitCompartment(CompartmentSearchExpression expression, object context)
 {
     return(CompartmentSearchParameterQueryGenerator.Instance);
 }
示例#6
0
 public void Visit(CompartmentSearchExpression expression)
 {
     AppendArrayContainsFilter(GetCompartmentIndicesParamName(expression.CompartmentType), expression.CompartmentId);
 }
 public SearchParamTableExpressionQueryGenerator VisitCompartment(CompartmentSearchExpression expression, object context)
 {
     return(CompartmentQueryGenerator.Instance);
 }