Beispiel #1
0
        public void EmptyValueQueryOptionShouldWork()
        {
            var uriParser = new ODataUriParser(HardCodedTestModel.TestModel, ServiceRoot, new Uri(FullUri, "?$filter=&$select=&$expand=&$orderby=&$top=&$skip=&$count=&$search=&$unknow=&$unknowvalue&$skiptoken=&$deltatoken="));
            var path      = uriParser.ParsePath();

            path.Should().HaveCount(1);
            path.LastSegment.ShouldBeEntitySetSegment(HardCodedTestModel.GetPeopleSet());
            uriParser.ParseFilter().Should().BeNull();
            var results = uriParser.ParseSelectAndExpand();

            results.AllSelected.Should().BeTrue();
            results.SelectedItems.Should().HaveCount(0);
            uriParser.ParseOrderBy().Should().BeNull();
            Action action = () => uriParser.ParseTop();

            action.ShouldThrow <ODataException>().WithMessage(Strings.SyntacticTree_InvalidTopQueryOptionValue(""));
            action = () => uriParser.ParseSkip();
            action.ShouldThrow <ODataException>().WithMessage(Strings.SyntacticTree_InvalidSkipQueryOptionValue(""));
            action = () => uriParser.ParseCount();
            action.ShouldThrow <ODataException>().WithMessage(Strings.ODataUriParser_InvalidCount(""));
            action = () => uriParser.ParseSearch();
            action.ShouldThrow <ODataException>().WithMessage(Strings.UriQueryExpressionParser_ExpressionExpected(0, ""));
            uriParser.ParseSkipToken().Should().BeEmpty();
            uriParser.ParseDeltaToken().Should().BeEmpty();
        }
Beispiel #2
0
        public void ParseNoDollarQueryOptionsShouldReturnNullIfNoDollarQueryOptionsIsNotEnabled()
        {
            var parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("People?filter=MyDog/Color eq 'Brown'&select=ID&expand=MyDog&orderby=ID&top=1&skip=2&count=true&search=FA&$unknown=&$unknownvalue&skiptoken=abc&deltatoken=def", UriKind.Relative));

            bool originalValue = parser.EnableNoDollarQueryOptions;

            try
            {
                // Ensure $-sign is required.
                parser.EnableNoDollarQueryOptions = false;

                parser.ParseFilter().Should().BeNull();
                parser.ParseSelectAndExpand().Should().BeNull();
                parser.ParseOrderBy().Should().BeNull();
                parser.ParseTop().Should().Be(null);
                parser.ParseSkip().Should().Be(null);
                parser.ParseCount().Should().Be(null);
                parser.ParseSearch().Should().BeNull();
                parser.ParseSkipToken().Should().BeNull();
                parser.ParseDeltaToken().Should().BeNull();
            }
            finally
            {
                // Restore original value
                parser.EnableNoDollarQueryOptions = originalValue;
            }
        }
        public void EmptyValueQueryOptionShouldWork(string relativeUriString, bool enableNoDollarQueryOptions)
        {
            var uriParser = new ODataUriParser(HardCodedTestModel.TestModel, ServiceRoot, new Uri(FullUri, relativeUriString));

            uriParser.EnableNoDollarQueryOptions = enableNoDollarQueryOptions;
            var path = uriParser.ParsePath();

            path.Should().HaveCount(1);
            path.LastSegment.ShouldBeEntitySetSegment(HardCodedTestModel.GetPeopleSet());
            uriParser.ParseFilter().Should().BeNull();
            var results = uriParser.ParseSelectAndExpand();

            results.AllSelected.Should().BeTrue();
            results.SelectedItems.Should().HaveCount(0);
            uriParser.ParseOrderBy().Should().BeNull();
            Action action = () => uriParser.ParseTop();

            action.ShouldThrow <ODataException>().WithMessage(Strings.SyntacticTree_InvalidTopQueryOptionValue(""));
            action = () => uriParser.ParseSkip();
            action.ShouldThrow <ODataException>().WithMessage(Strings.SyntacticTree_InvalidSkipQueryOptionValue(""));
            action = () => uriParser.ParseCount();
            action.ShouldThrow <ODataException>().WithMessage(Strings.ODataUriParser_InvalidCount(""));
            action = () => uriParser.ParseSearch();
            action.ShouldThrow <ODataException>().WithMessage(Strings.UriQueryExpressionParser_ExpressionExpected(0, ""));
            uriParser.ParseSkipToken().Should().BeEmpty();
            uriParser.ParseDeltaToken().Should().BeEmpty();
        }
        public IRequest Parse <T>(string queryString)
            where T : class, new()
        {
            var requestUri = new Uri($"{nameof(T)}/{queryString}", UriKind.Relative);

            var parser = new ODataUriParser(GetEdmModel <T>(nameof(T)), requestUri)
            {
                Resolver = new StringAsEnumResolver()
                {
                    EnableCaseInsensitive = _uriParserSettings.EnableCaseInsensitive,
                },
            };

            bool?count = parser.ParseCount();
            long?top   = parser.ParseTop();
            long?skip  = parser.ParseSkip();

            var filter = parser.ParseFilter().Parse();

            return(new Request
            {
                Filter = filter,
                Select = parser.ParseSelectAndExpand().Parse(),
                Sorts = parser.ParseOrderBy().Parse(),
                Count = count.HasValue ? Convert.ToBoolean(count.Value) : false,
                Page = skip.HasValue ? Convert.ToInt32(skip.Value) + 1 : 1,
                PageSize = top.HasValue ? Convert.ToInt32(top.Value) : null
            });
        }
Beispiel #5
0
        public void ShouldBePagingOperatorResolverInstance()
        {
            ODataUriParser parser = GetParser("/Enterprises?$top=1&$skip=2");

            ISqlBinder binder = new SqlPagingBinder(parser.ParseTop(), parser.ParseSkip());

            binder.Query.Should().BeOfType <PagingOperatorResolver>();
        }
Beispiel #6
0
        public void ShouldNotBeNullPagingOperatorInstance()
        {
            ODataUriParser parser = GetParser("/Enterprises");

            ISqlBinder binder = new SqlPagingBinder(parser.ParseTop(), parser.ParseSkip());

            binder.Query.Should().NotBeNull();
        }
Beispiel #7
0
        public static void ParseSkip(this ODataUriParser query, ClrQuery result)
        {
            var skip = query.ParseSkip();

            if (skip != null)
            {
                result.Skip = skip.Value;
            }
        }
        public void ParseQueryOptionsShouldWork()
        {
            var parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("People?$filter=MyDog/Color eq 'Brown'&$select=ID&$expand=MyDog&$orderby=ID&$top=1&$skip=2&$count=true&$search=FA&$unknow=&$unknowvalue", UriKind.Relative));

            parser.ParseSelectAndExpand().Should().NotBeNull();
            parser.ParseFilter().Should().NotBeNull();
            parser.ParseOrderBy().Should().NotBeNull();
            parser.ParseTop().Should().Be(1);
            parser.ParseSkip().Should().Be(2);
            parser.ParseCount().Should().Be(true);
            parser.ParseSearch().Should().NotBeNull();
        }
Beispiel #9
0
        public static Query ToQuery(this ODataUriParser parser)
        {
            var query = new Query();

            if (parser != null)
            {
                parser.ParseTake(query);
                parser.ParseSkip(query);
                parser.ParseFilter(query);
                parser.ParseSort(query);
            }

            return(query);
        }
        public void ParseQueryOptionsShouldWork(string relativeUriString, bool enableNoDollarQueryOptions)
        {
            var parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri(relativeUriString, UriKind.Relative));

            parser.EnableNoDollarQueryOptions = enableNoDollarQueryOptions;
            parser.ParseSelectAndExpand().Should().NotBeNull();
            parser.ParseFilter().Should().NotBeNull();
            parser.ParseOrderBy().Should().NotBeNull();
            parser.ParseTop().Should().Be(1);
            parser.ParseSkip().Should().Be(2);
            parser.ParseCount().Should().Be(true);
            parser.ParseSearch().Should().NotBeNull();
            parser.ParseSkipToken().Should().Be("abc");
            parser.ParseDeltaToken().Should().Be("def");
        }
Beispiel #11
0
        public static IFindFluent <MongoContentEntity, MongoContentEntity> Skip(this IFindFluent <MongoContentEntity, MongoContentEntity> cursor, ODataUriParser query)
        {
            var skip = query.ParseSkip();

            if (skip.HasValue)
            {
                cursor = cursor.Skip((int)skip.Value);
            }
            else
            {
                cursor = cursor.Skip(null);
            }

            return(cursor);
        }
        public void NoneQueryOptionShouldWork()
        {
            var uriParser = new ODataUriParser(HardCodedTestModel.TestModel, ServiceRoot, FullUri);
            var path      = uriParser.ParsePath();

            path.Should().HaveCount(1);
            path.LastSegment.ShouldBeEntitySetSegment(HardCodedTestModel.GetPeopleSet());
            uriParser.ParseFilter().Should().BeNull();
            uriParser.ParseSelectAndExpand().Should().BeNull();
            uriParser.ParseOrderBy().Should().BeNull();
            uriParser.ParseTop().Should().Be(null);
            uriParser.ParseSkip().Should().Be(null);
            uriParser.ParseCount().Should().Be(null);
            uriParser.ParseSearch().Should().BeNull();
        }
Beispiel #13
0
        public static IFindFluent <T, T> Skip <T>(this IFindFluent <T, T> cursor, ODataUriParser query)
        {
            var skip = query.ParseSkip();

            if (skip.HasValue)
            {
                cursor = cursor.Skip((int)skip.Value);
            }
            else
            {
                cursor = cursor.Skip(null);
            }

            return(cursor);
        }
Beispiel #14
0
        /// <summary>
        /// Esse Controller está implementando a lógica para converter parametros OData para parametros de StoredProcedure.
        /// Não dá pra usar [EnableQuery], senão os parametros da query serão aplicados na SP e posteriormente no retorno dela.
        /// </summary>
        /// <param name="queryOptions"></param>
        /// <returns></returns>
        // GET: odata/Enterprises
        public IQueryable <EnterprisesModel> GetEnterprises(ODataQueryOptions queryOptions)
        {
            //TODO: O código abaixo deve ser posteriormente movido para um Filter do Controller,
            // por ser genérico irá se repetir em cada GET do Controller.
            Uri            fullUri = new Uri(ControllerContext.Request.RequestUri.PathAndQuery.Replace("odata/", ""), UriKind.Relative);
            ODataUriParser parser  = new ODataUriParser(_model, fullUri);                //Poderia ser via ODataQueryOptionParser, mas achei mais complicado

            FilterClause  filterClause  = parser.ParseFilter();                          // parse $filter
            OrderByClause orderByClause = parser.ParseOrderBy();                         // parse $orderby
            long?         topClause     = parser.ParseTop();                             // parse $top
            long?         skipClause    = parser.ParseSkip();                            // parse $skip
            bool          count         = parser.ParseCount() ?? false;                  // parse $count

            SqlFilterBinder  filterBinder  = new SqlFilterBinder(filterClause);          //Binder para resolver o filtro; TODO: Melhorar para componente e UNIT TESTE
            SqlOrderByBinder orderByBinder = new SqlOrderByBinder(orderByClause);        //Binder para resolver o ordenação; TODO: Melhorar para componente e UNIT TESTE
            SqlPagingBinder  pagingBinder  = new SqlPagingBinder(topClause, skipClause); //Binder para resolver o paginação; TODO: Melhorar para componente e UNIT TESTE

            //Agora é só aplicar os parametros encontrados na Stored Procedure
            return(db.ProcPgdEnterprisesRetrieveAllMonitoredFromUserPartner(7, filterBinder.Resolve(), orderByBinder.Resolve(), pagingBinder.Resolve(), count).AsQueryable());
        }
Beispiel #15
0
        public ParseContext Parse(ODataUriParser parser, ParseContext parseContext)
        {
            var skip = parser.ParseSkip();

            if (skip.Value > 0)
            {
                bool isParsed = int.TryParse(skip.Value.ToString(), out int count);

                var collectionEntityTypeKey = parseContext.LatestStateDictionary
                                              .Keys.FirstOrDefault(p => p.Contains("collectionentitytype"));

                var entityRef     = (EdmEntityTypeReference)parseContext.LatestStateDictionary[collectionEntityTypeKey];
                var collectionRef = new EdmCollectionTypeReference(new EdmCollectionType(entityRef));
                var collection    = new EdmEntityObjectCollection(collectionRef);

                var filteredResults = parseContext.Result.Skip(count);

                foreach (var entity in filteredResults)
                {
                    collection.Add(entity);
                }

                var targetParseContext = new ParseContext
                {
                    Result = collection,
                    QueryableSourceEntities = parseContext.QueryableSourceEntities.Skip(count),
                    Model = parseContext.Model,
                    EdmEntityTypeSettings = parseContext.EdmEntityTypeSettings,
                    LatestStateDictionary = parseContext.LatestStateDictionary
                };
                return(targetParseContext);
            }
            else
            {
                throw new InvalidPropertyException("Skip", string.Empty);
            }
        }
Beispiel #16
0
        public void ShouldBePagingOperatorForOnlySkip()
        {
            ODataUriParser parser = GetParser("/Enterprises?$skip=10");

            IQueryResolver resolver = new PagingOperatorResolver(parser.ParseTop() ?? 0, parser.ParseSkip() ?? 0);

            resolver.Resolve().Should().Be("ROWNUMBER BETWEEN 10 AND 20");
        }
Beispiel #17
0
        public void ShouldBePagingOperatorForTopAndSkip()
        {
            ODataUriParser parser = GetParser("/Enterprises?$top=2&$skip=2");

            IQueryResolver resolver = new PagingOperatorResolver(parser.ParseTop() ?? 0, parser.ParseSkip() ?? 0);

            resolver.Resolve().Should().Be("ROWNUMBER BETWEEN 2 AND 4");
        }