Exemple #1
0
        public static bool IsNotSortable(IEdmProperty edmProperty, IEdmProperty pathEdmProperty,
                                         IEdmStructuredType pathEdmStructuredType, IEdmModel edmModel, bool enableOrderBy)
        {
            QueryableRestrictionsAnnotation annotation = GetPropertyRestrictions(edmProperty, edmModel);

            if (annotation != null && annotation.Restrictions.NotSortable)
            {
                return(true);
            }
            else
            {
                if (pathEdmStructuredType == null)
                {
                    pathEdmStructuredType = edmProperty.DeclaringType;
                }

                ModelBoundQuerySettings querySettings = GetModelBoundQuerySettings(pathEdmProperty,
                                                                                   pathEdmStructuredType, edmModel);
                if (!enableOrderBy)
                {
                    return(!querySettings.Sortable(edmProperty.Name));
                }

                bool enable;
                if (querySettings.OrderByConfigurations.TryGetValue(edmProperty.Name, out enable))
                {
                    return(!enable);
                }
                else
                {
                    return(querySettings.DefaultEnableOrderBy == false);
                }
            }
        }
        public override void Apply(PropertyConfiguration edmProperty,
                                   StructuralTypeConfiguration structuralTypeConfiguration,
                                   Attribute attribute,
                                   ODataConventionModelBuilder model)
        {
            if (edmProperty == null)
            {
                throw Error.ArgumentNull("edmProperty");
            }

            if (!edmProperty.AddedExplicitly)
            {
                PageAttribute           pageAttribute = attribute as PageAttribute;
                ModelBoundQuerySettings querySettings = edmProperty.QueryConfiguration.GetModelBoundQuerySettingsOrDefault();
                if (pageAttribute.MaxTop < 0)
                {
                    querySettings.MaxTop = null;
                }
                else
                {
                    querySettings.MaxTop = pageAttribute.MaxTop;
                }

                if (pageAttribute.PageSize > 0)
                {
                    querySettings.PageSize = pageAttribute.PageSize;
                }
            }
        }
Exemple #3
0
        public void Validate_Throws_IfMaxDepthLessThanLevels(int level)
        {
            // Arrange
            string expand = string.Format("Parent($levels={0})", level + 1);

            var validator = new SelectExpandQueryValidator(new DefaultQuerySettings {
                EnableExpand = true
            });
            var builder = new ODataConventionModelBuilder();

            builder.EntitySet <ODataLevelsTest.LevelsEntity>("Entities");
            IEdmModel model   = builder.GetEdmModel();
            var       context = new ODataQueryContext(model, typeof(ODataLevelsTest.LevelsEntity));

            context.RequestContainer = new MockContainer();
            var selectExpandQueryOption = new SelectExpandQueryOption(null, expand, context);

            IEdmStructuredType customerType =
                model.SchemaElements.First(e => e.Name.Equals("LevelsEntity")) as IEdmStructuredType;
            ModelBoundQuerySettings querySettings = new ModelBoundQuerySettings();

            querySettings.ExpandConfigurations.Add("Parent", new ExpandConfiguration
            {
                ExpandType = SelectExpandType.Allowed,
                MaxDepth   = level
            });
            model.SetAnnotationValue(customerType, querySettings);

            // Act & Assert
            ExceptionAssert.Throws <ODataException>(
                () => validator.Validate(selectExpandQueryOption, new ODataValidationSettings {
                MaxExpansionDepth = 0
            }),
                String.Format(CultureInfo.CurrentCulture, MaxExpandDepthExceededErrorString, level));
        }
Exemple #4
0
        public void ValidateDoesNotThrow_IfExpansionDepthIsZero_QuerySettings()
        {
            // Arrange
            string expand =
                "Orders($expand=Customer($expand=Orders($expand=Customer($expand=Orders($expand=Customer)))))";
            SelectExpandQueryValidator validator = new SelectExpandQueryValidator(new DefaultQuerySettings {
                EnableExpand = true
            });
            CustomersModelWithInheritance model = new CustomersModelWithInheritance();

            model.Model.SetAnnotationValue(model.Customer, new ClrTypeAnnotation(typeof(Customer)));
            ODataQueryContext queryContext = new ODataQueryContext(model.Model, typeof(Customer));

            queryContext.RequestContainer = new MockContainer();
            SelectExpandQueryOption selectExpandQueryOption = new SelectExpandQueryOption(null, expand, queryContext);
            IEdmStructuredType      customerType            =
                model.Model.SchemaElements.First(e => e.Name.Equals("Customer")) as IEdmStructuredType;
            ModelBoundQuerySettings querySettings = new ModelBoundQuerySettings();

            querySettings.ExpandConfigurations.Add("Orders", new ExpandConfiguration
            {
                ExpandType = SelectExpandType.Allowed,
                MaxDepth   = 0
            });
            model.Model.SetAnnotationValue(customerType, querySettings);

            // Act & Assert
            ExceptionAssert.DoesNotThrow(
                () => validator.Validate(selectExpandQueryOption, new ODataValidationSettings {
                MaxExpansionDepth = 0
            }));
        }
        /// <summary>
        /// Get the page size.
        /// </summary>
        /// <param name="responseValue">The response value.</param>
        /// <param name="singleResultCollection">The content as SingleResult.Queryable.</param>
        /// <param name="actionDescriptor">The action context, i.e. action and controller name.</param>
        /// <param name="modelFunction">A function to get the model.</param>
        /// <param name="path">The OData path.</param>
        /// <param name="createErrorAction">A function used to generate error response.</param>
        private void GetModelBoundPageSize(
            object responseValue,
            IQueryable singleResultCollection,
            IWebApiActionDescriptor actionDescriptor,
            Func <Type, IEdmModel> modelFunction,
            ODataPath path,
            Action <HttpStatusCode, string, Exception> createErrorAction)
        {
            ODataQueryContext queryContext = null;

            try
            {
                queryContext = GetODataQueryContext(responseValue, singleResultCollection, actionDescriptor, modelFunction, path);
            }
            catch (InvalidOperationException e)
            {
                createErrorAction(
                    HttpStatusCode.BadRequest,
                    Error.Format(SRResources.UriQueryStringInvalid, e.Message),
                    e);
                return;
            }

            ModelBoundQuerySettings querySettings = EdmLibHelpers.GetModelBoundQuerySettings(queryContext.TargetProperty,
                                                                                             queryContext.TargetStructuredType,
                                                                                             queryContext.Model);

            if (querySettings != null && querySettings.PageSize.HasValue)
            {
                _querySettings.ModelBoundPageSize = querySettings.PageSize;
            }
        }
Exemple #6
0
        private void GetModelBoundPageSize(ODataQueryContext queryContext, ObjectContent responseContent,
                                           HttpRequestMessage request, HttpActionDescriptor actionDescriptor,
                                           HttpActionExecutedContext actionExecutedContext)
        {
            try
            {
                queryContext = GetODataQueryContext(responseContent.Value, request, actionDescriptor);
            }
            catch (InvalidOperationException e)
            {
                actionExecutedContext.Response = request.CreateErrorResponse(
                    HttpStatusCode.BadRequest,
                    Error.Format(SRResources.UriQueryStringInvalid, e.Message),
                    e);
                return;
            }

            ModelBoundQuerySettings querySettings = EdmLibHelpers.GetModelBoundQuerySettings(queryContext.TargetProperty,
                                                                                             queryContext.TargetStructuredType,
                                                                                             queryContext.Model);

            if (querySettings != null && querySettings.PageSize.HasValue)
            {
                _querySettings.ModelBoundPageSize = querySettings.PageSize;
            }
        }
Exemple #7
0
        public static bool IsNotCountable(
            IEdmProperty property,
            IEdmStructuredType structuredType,
            IEdmModel edmModel,
            bool enableCount)
        {
            if (property != null)
            {
                QueryableRestrictionsAnnotation annotation = GetPropertyRestrictions(property, edmModel);
                if (annotation != null && annotation.Restrictions.NotCountable)
                {
                    return(true);
                }
            }

            ModelBoundQuerySettings querySettings = GetModelBoundQuerySettings(property, structuredType, edmModel);

            if (querySettings != null &&
                ((!querySettings.Countable.HasValue && !enableCount) || querySettings.Countable == false))
            {
                return(true);
            }

            return(false);
        }
Exemple #8
0
        public override void Apply(PropertyConfiguration edmProperty,
                                   StructuralTypeConfiguration structuralTypeConfiguration,
                                   Attribute attribute,
                                   ODataConventionModelBuilder model)
        {
            if (edmProperty == null)
            {
                throw Error.ArgumentNull("edmProperty");
            }

            if (!edmProperty.AddedExplicitly)
            {
                FilterAttribute         filterAttribute = attribute as FilterAttribute;
                ModelBoundQuerySettings querySettings   = edmProperty.QueryConfiguration.GetModelBoundQuerySettingsOrDefault();
                if (querySettings.FilterConfigurations.Count == 0)
                {
                    querySettings.CopyFilterConfigurations(filterAttribute.FilterConfigurations);
                }
                else
                {
                    foreach (var property in filterAttribute.FilterConfigurations.Keys)
                    {
                        querySettings.FilterConfigurations[property] =
                            filterAttribute.FilterConfigurations[property];
                    }
                }

                if (filterAttribute.FilterConfigurations.Count == 0)
                {
                    querySettings.DefaultEnableFilter = filterAttribute.DefaultEnableFilter;
                }
            }
        }
Exemple #9
0
        public void Validate_DepthChecks_QuerySettings(string expand, int maxExpansionDepth)
        {
            // Arrange
            SelectExpandQueryValidator validator = new SelectExpandQueryValidator(new DefaultQuerySettings {
                EnableExpand = true
            });
            CustomersModelWithInheritance model = new CustomersModelWithInheritance();

            model.Model.SetAnnotationValue(model.Customer, new ClrTypeAnnotation(typeof(Customer)));
            ODataQueryContext queryContext = new ODataQueryContext(model.Model, typeof(Customer));

            queryContext.RequestContainer = new MockContainer();
            SelectExpandQueryOption selectExpandQueryOption = new SelectExpandQueryOption(null, expand, queryContext);

            selectExpandQueryOption.LevelsMaxLiteralExpansionDepth = 1;
            IEdmStructuredType customerType =
                model.Model.SchemaElements.First(e => e.Name.Equals("Customer")) as IEdmStructuredType;
            ModelBoundQuerySettings querySettings = new ModelBoundQuerySettings();

            querySettings.ExpandConfigurations.Add("Orders", new ExpandConfiguration
            {
                ExpandType = SelectExpandType.Allowed,
                MaxDepth   = maxExpansionDepth
            });
            model.Model.SetAnnotationValue(customerType, querySettings);

            // Act & Assert
            ExceptionAssert.Throws <ODataException>(
                () => validator.Validate(selectExpandQueryOption, new ODataValidationSettings {
                MaxExpansionDepth = maxExpansionDepth + 1
            }),
                String.Format(CultureInfo.CurrentCulture, MaxExpandDepthExceededErrorString, maxExpansionDepth));
        }
Exemple #10
0
        public void ValidateThrowException_IfNotExpandable_QuerySettings()
        {
            // Arrange
            CustomersModelWithInheritance model = new CustomersModelWithInheritance();

            model.Model.SetAnnotationValue(model.Customer, new ClrTypeAnnotation(typeof(Customer)));
            ODataQueryContext queryContext = new ODataQueryContext(model.Model, typeof(Customer));

            queryContext.RequestContainer = new MockContainer();
            SelectExpandQueryValidator validator = SelectExpandQueryValidator.GetSelectExpandQueryValidator(queryContext);
            SelectExpandQueryOption    selectExpandQueryOption = new SelectExpandQueryOption(null, "Orders", queryContext);
            IEdmStructuredType         customerType            =
                model.Model.SchemaElements.First(e => e.Name.Equals("Customer")) as IEdmStructuredType;
            ModelBoundQuerySettings querySettings = new ModelBoundQuerySettings();

            querySettings.ExpandConfigurations.Add("Orders", new ExpandConfiguration
            {
                ExpandType = SelectExpandType.Disabled,
                MaxDepth   = 0
            });
            model.Model.SetAnnotationValue(customerType, querySettings);

            // Act & Assert
            ExceptionAssert.Throws <ODataException>(
                () => validator.Validate(selectExpandQueryOption, new ODataValidationSettings()),
                "The property 'Orders' cannot be used in the $expand query option.");
        }
Exemple #11
0
        public override void Apply(PropertyConfiguration edmProperty,
                                   StructuralTypeConfiguration structuralTypeConfiguration,
                                   Attribute attribute,
                                   ODataConventionModelBuilder model)
        {
            if (edmProperty == null)
            {
                throw Error.ArgumentNull("edmProperty");
            }

            if (!edmProperty.AddedExplicitly)
            {
                SelectAttribute         selectAttribute = attribute as SelectAttribute;
                ModelBoundQuerySettings querySettings   =
                    edmProperty.QueryConfiguration.GetModelBoundQuerySettingsOrDefault();
                if (querySettings.SelectConfigurations.Count == 0)
                {
                    querySettings.CopySelectConfigurations(selectAttribute.SelectConfigurations);
                }
                else
                {
                    foreach (var property in selectAttribute.SelectConfigurations.Keys)
                    {
                        querySettings.SelectConfigurations[property] =
                            selectAttribute.SelectConfigurations[property];
                    }
                }

                if (selectAttribute.SelectConfigurations.Count == 0)
                {
                    querySettings.DefaultSelectType = selectAttribute.DefaultSelectType;
                }
            }
        }
Exemple #12
0
        private static ModelBoundQuerySettings GetModelBoundQuerySettings <T>(T key, IEdmModel edmModel,
                                                                              DefaultQuerySettings defaultQuerySettings = null)
            where T : IEdmElement
        {
            Contract.Assert(edmModel != null);

            if (key == null)
            {
                return(null);
            }
            else
            {
                ModelBoundQuerySettings querySettings = edmModel.GetAnnotationValue <ModelBoundQuerySettings>(key);
                if (querySettings == null)
                {
                    querySettings = new ModelBoundQuerySettings();
                    if (defaultQuerySettings != null &&
                        (!defaultQuerySettings.MaxTop.HasValue || defaultQuerySettings.MaxTop > 0))
                    {
                        querySettings.MaxTop = defaultQuerySettings.MaxTop;
                    }
                }
                return(querySettings);
            }
        }
Exemple #13
0
 void VisitMaxTop(ModelBoundQuerySettings querySettings)
 {
     if (querySettings.MaxTop != null && querySettings.MaxTop.Value > 0)
     {
         context.MaxTop = querySettings.MaxTop;
     }
 }
Exemple #14
0
        public static bool IsNotSelectable(IEdmProperty edmProperty, IEdmProperty pathEdmProperty,
                                           IEdmStructuredType pathEdmStructuredType, IEdmModel edmModel, bool enableSelect)
        {
            if (pathEdmStructuredType == null)
            {
                pathEdmStructuredType = edmProperty.DeclaringType;
            }

            ModelBoundQuerySettings querySettings = GetModelBoundQuerySettings(pathEdmProperty,
                                                                               pathEdmStructuredType, edmModel);

            if (!enableSelect)
            {
                return(!querySettings.Selectable(edmProperty.Name));
            }

            SelectExpandType enable;

            if (querySettings.SelectConfigurations.TryGetValue(edmProperty.Name, out enable))
            {
                return(enable == SelectExpandType.Disabled);
            }
            else
            {
                return(querySettings.DefaultSelectType == SelectExpandType.Disabled);
            }
        }
        public override void Apply(PropertyConfiguration edmProperty,
                                   StructuralTypeConfiguration structuralTypeConfiguration,
                                   Attribute attribute,
                                   ODataConventionModelBuilder model)
        {
            if (edmProperty == null)
            {
                throw Error.ArgumentNull("edmProperty");
            }

            if (!edmProperty.AddedExplicitly)
            {
                ExpandAttribute         expandAttribute = attribute as ExpandAttribute;
                ModelBoundQuerySettings querySettings   = edmProperty.QueryConfiguration.GetModelBoundQuerySettingsOrDefault();
                if (querySettings.ExpandConfigurations.Count == 0)
                {
                    querySettings.CopyExpandConfigurations(expandAttribute.ExpandConfigurations);
                }
                else
                {
                    foreach (var property in expandAttribute.ExpandConfigurations.Keys)
                    {
                        querySettings.ExpandConfigurations[property] =
                            expandAttribute.ExpandConfigurations[property];
                    }
                }

                if (expandAttribute.ExpandConfigurations.Count == 0)
                {
                    querySettings.DefaultExpandType = expandAttribute.DefaultExpandType;
                    querySettings.DefaultMaxDepth   = expandAttribute.DefaultMaxDepth ?? ODataValidationSettings.DefaultMaxExpansionDepth;
                }
            }
        }
Exemple #16
0
        public static IEnumerable <IEdmNavigationProperty> GetAutoExpandNavigationProperties(
            IEdmProperty pathProperty, IEdmStructuredType pathStructuredType, IEdmModel edmModel,
            bool isSelectPresent = false, ModelBoundQuerySettings querySettings = null)
        {
            List <IEdmNavigationProperty> autoExpandNavigationProperties = new List <IEdmNavigationProperty>();
            IEdmEntityType baseEntityType = pathStructuredType as IEdmEntityType;

            if (baseEntityType != null)
            {
                List <IEdmEntityType> entityTypes = new List <IEdmEntityType>();
                entityTypes.Add(baseEntityType);
                entityTypes.AddRange(GetAllDerivedEntityTypes(baseEntityType, edmModel));
                foreach (var entityType in entityTypes)
                {
                    IEnumerable <IEdmNavigationProperty> navigationProperties = entityType == baseEntityType
                        ? entityType.NavigationProperties()
                        : entityType.DeclaredNavigationProperties();

                    if (navigationProperties != null)
                    {
                        autoExpandNavigationProperties.AddRange(
                            navigationProperties.Where(
                                navigationProperty =>
                                IsAutoExpand(navigationProperty, pathProperty, entityType, edmModel,
                                             isSelectPresent, querySettings)));
                    }
                }
            }

            return(autoExpandNavigationProperties);
        }
Exemple #17
0
        /// <summary>
        /// Gets the <see cref="ModelBoundQuerySettings"/> or create it depends on the default settings.
        /// </summary>
        internal ModelBoundQuerySettings GetModelBoundQuerySettingsOrDefault()
        {
            if (_querySettings == null)
            {
                _querySettings = new ModelBoundQuerySettings(ModelBoundQuerySettings.DefaultModelBoundQuerySettings);
            }

            return(_querySettings);
        }
        void VisitMaxTop(ModelBoundQuerySettings querySettings)
        {
            Contract.Requires(querySettings != null);

            if (querySettings.MaxTop != null && querySettings.MaxTop.Value > 0)
            {
                context.MaxTop = querySettings.MaxTop;
            }
        }
Exemple #19
0
        private static ModelBoundQuerySettings GetMergedPropertyQuerySettings(
            ModelBoundQuerySettings propertyQuerySettings, ModelBoundQuerySettings propertyTypeQuerySettings)
        {
            ModelBoundQuerySettings mergedQuerySettings = new ModelBoundQuerySettings(propertyQuerySettings);

            if (propertyTypeQuerySettings != null)
            {
                if (!mergedQuerySettings.PageSize.HasValue)
                {
                    mergedQuerySettings.PageSize =
                        propertyTypeQuerySettings.PageSize;
                }

                if (mergedQuerySettings.MaxTop == 0 && propertyTypeQuerySettings.MaxTop != 0)
                {
                    mergedQuerySettings.MaxTop =
                        propertyTypeQuerySettings.MaxTop;
                }

                if (!mergedQuerySettings.Countable.HasValue)
                {
                    mergedQuerySettings.Countable = propertyTypeQuerySettings.Countable;
                }

                if (mergedQuerySettings.OrderByConfigurations.Count == 0 &&
                    !mergedQuerySettings.DefaultEnableOrderBy.HasValue)
                {
                    mergedQuerySettings.CopyOrderByConfigurations(propertyTypeQuerySettings.OrderByConfigurations);
                    mergedQuerySettings.DefaultEnableOrderBy = propertyTypeQuerySettings.DefaultEnableOrderBy;
                }

                if (mergedQuerySettings.FilterConfigurations.Count == 0 &&
                    !mergedQuerySettings.DefaultEnableFilter.HasValue)
                {
                    mergedQuerySettings.CopyFilterConfigurations(propertyTypeQuerySettings.FilterConfigurations);
                    mergedQuerySettings.DefaultEnableFilter = propertyTypeQuerySettings.DefaultEnableFilter;
                }

                if (mergedQuerySettings.SelectConfigurations.Count == 0 &&
                    !mergedQuerySettings.DefaultSelectType.HasValue)
                {
                    mergedQuerySettings.CopySelectConfigurations(propertyTypeQuerySettings.SelectConfigurations);
                    mergedQuerySettings.DefaultSelectType = propertyTypeQuerySettings.DefaultSelectType;
                }

                if (mergedQuerySettings.ExpandConfigurations.Count == 0 &&
                    !mergedQuerySettings.DefaultExpandType.HasValue)
                {
                    mergedQuerySettings.CopyExpandConfigurations(
                        propertyTypeQuerySettings.ExpandConfigurations);
                    mergedQuerySettings.DefaultExpandType = propertyTypeQuerySettings.DefaultExpandType;
                    mergedQuerySettings.DefaultMaxDepth   = propertyTypeQuerySettings.DefaultMaxDepth;
                }
            }
            return(mergedQuerySettings);
        }
Exemple #20
0
        bool IsExpandEnabled(ModelBoundQuerySettings querySettings)
        {
            if (!querySettings.DefaultExpandType.HasValue)
            {
                return(AllowedQueryOptions.HasFlag(Expand) ||
                       querySettings.ExpandConfigurations.Any(p => p.Value.ExpandType != Disabled));
            }

            return(querySettings.DefaultExpandType.Value != Disabled ||
                   querySettings.ExpandConfigurations.Any(p => p.Value.ExpandType != Disabled));
        }
Exemple #21
0
        bool IsSelectEnabled(ModelBoundQuerySettings querySettings)
        {
            if (!querySettings.DefaultSelectType.HasValue)
            {
                return(AllowedQueryOptions.HasFlag(Select) ||
                       querySettings.SelectConfigurations.Any(p => p.Value != Disabled));
            }

            return(querySettings.DefaultSelectType.Value != Disabled ||
                   querySettings.SelectConfigurations.Any(p => p.Value != Disabled));
        }
Exemple #22
0
        bool IsFilterEnabled(ModelBoundQuerySettings querySettings)
        {
            if (!querySettings.DefaultEnableFilter.HasValue)
            {
                return(AllowedQueryOptions.HasFlag(Filter) ||
                       querySettings.FilterConfigurations.Any(p => p.Value));
            }

            return(querySettings.DefaultEnableFilter.Value ||
                   querySettings.FilterConfigurations.Any(p => p.Value));
        }
Exemple #23
0
        bool IsOrderByEnabled(ModelBoundQuerySettings querySettings)
        {
            if (!querySettings.DefaultEnableOrderBy.HasValue)
            {
                return(AllowedQueryOptions.HasFlag(OrderBy) ||
                       querySettings.OrderByConfigurations.Any(p => p.Value));
            }

            return(querySettings.DefaultEnableOrderBy.Value ||
                   querySettings.OrderByConfigurations.Any(p => p.Value));
        }
Exemple #24
0
 private static void AddPropertiesQuerySettings(this EdmModel model,
                                                Dictionary <IEdmProperty, ModelBoundQuerySettings> edmPropertiesQuerySettings)
 {
     foreach (KeyValuePair <IEdmProperty, ModelBoundQuerySettings> edmPropertiesQuerySetting in
              edmPropertiesQuerySettings)
     {
         IEdmProperty            edmProperty   = edmPropertiesQuerySetting.Key;
         ModelBoundQuerySettings querySettings = edmPropertiesQuerySetting.Value;
         model.SetAnnotationValue(edmProperty, querySettings);
     }
 }
Exemple #25
0
 private static void AddStructuredTypeQuerySettings(this EdmModel model,
                                                    Dictionary <IEdmStructuredType, ModelBoundQuerySettings> edmStructuredTypeQuerySettings)
 {
     foreach (
         KeyValuePair <IEdmStructuredType, ModelBoundQuerySettings> edmStructuredTypeQuerySetting in
         edmStructuredTypeQuerySettings)
     {
         IEdmStructuredType      structuredType = edmStructuredTypeQuerySetting.Key;
         ModelBoundQuerySettings querySettings  = edmStructuredTypeQuerySetting.Value;
         model.SetAnnotationValue(structuredType, querySettings);
     }
 }
        void VisitCount(ModelBoundQuerySettings querySettings)
        {
            Contract.Requires(querySettings != null);

            if (querySettings.Countable == true)
            {
                AllowedQueryOptions |= Count;
            }
            else
            {
                AllowedQueryOptions &= ~Count;
            }
        }
Exemple #27
0
        public static bool IsTopLimitExceeded(IEdmProperty property, IEdmStructuredType structuredType,
                                              IEdmModel edmModel, int top, DefaultQuerySettings defaultQuerySettings, out int maxTop)
        {
            maxTop = 0;
            ModelBoundQuerySettings querySettings = GetModelBoundQuerySettings(property, structuredType, edmModel,
                                                                               defaultQuerySettings);

            if (querySettings != null && top > querySettings.MaxTop)
            {
                maxTop = querySettings.MaxTop.Value;
                return(true);
            }
            return(false);
        }
Exemple #28
0
        void VisitCount(ModelBoundQuerySettings querySettings)
        {
            if (!querySettings.Countable.HasValue)
            {
                return;
            }

            if (querySettings.Countable.Value)
            {
                AllowedQueryOptions |= Count;
            }
            else
            {
                AllowedQueryOptions &= ~Count;
            }
        }
        public void ValidatePassWhenQuerySettingsLimitIsNotReached()
        {
            // Arrange
            ODataValidationSettings settings = new ODataValidationSettings()
            {
                MaxTop = 20
            };
            ModelBoundQuerySettings modelBoundQuerySettings = new ModelBoundQuerySettings();

            modelBoundQuerySettings.MaxTop = 20;
            ODataQueryContext context = ValidationTestHelper.CreateCustomerContext();

            context.Model.SetAnnotationValue(context.ElementType as IEdmStructuredType, modelBoundQuerySettings);

            // Act & Assert
            ExceptionAssert.DoesNotThrow(() => _validator.Validate(new TopQueryOption("20", context), settings));
        }
Exemple #30
0
        public static IEnumerable <IEdmStructuralProperty> GetAutoSelectProperties(
            IEdmProperty pathProperty,
            IEdmStructuredType pathStructuredType,
            IEdmModel edmModel,
            ModelBoundQuerySettings querySettings = null)
        {
            List <IEdmStructuralProperty> autoSelectProperties = new List <IEdmStructuralProperty>();
            IEdmEntityType baseEntityType = pathStructuredType as IEdmEntityType;

            if (baseEntityType != null)
            {
                List <IEdmEntityType> entityTypes = new List <IEdmEntityType>();
                entityTypes.Add(baseEntityType);
                entityTypes.AddRange(GetAllDerivedEntityTypes(baseEntityType, edmModel));
                foreach (var entityType in entityTypes)
                {
                    IEnumerable <IEdmStructuralProperty> properties = entityType == baseEntityType
                        ? entityType.StructuralProperties()
                        : entityType.DeclaredStructuralProperties();

                    if (properties != null)
                    {
                        autoSelectProperties.AddRange(
                            properties.Where(
                                property =>
                                IsAutoSelect(property, pathProperty, entityType, edmModel,
                                             querySettings)));
                    }
                }
            }
            else if (pathStructuredType != null)
            {
                IEnumerable <IEdmStructuralProperty> properties = pathStructuredType.StructuralProperties();
                if (properties != null)
                {
                    autoSelectProperties.AddRange(
                        properties.Where(
                            property =>
                            IsAutoSelect(property, pathProperty, pathStructuredType, edmModel,
                                         querySettings)));
                }
            }

            return(autoSelectProperties);
        }