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(); }
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 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 }); }
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 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"); }
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"); }
public void ShouldNotBeNullPagingOperatorInstance() { ODataUriParser parser = GetParser("/Enterprises"); ISqlBinder binder = new SqlPagingBinder(parser.ParseTop(), parser.ParseSkip()); binder.Query.Should().NotBeNull(); }
public void ShouldBePagingOperatorResolverInstance() { ODataUriParser parser = GetParser("/Enterprises?$top=1&$skip=2"); ISqlBinder binder = new SqlPagingBinder(parser.ParseTop(), parser.ParseSkip()); binder.Query.Should().BeOfType <PagingOperatorResolver>(); }
public static void ParseTake(this ODataUriParser query, ClrQuery result) { var top = query.ParseTop(); if (top != null) { result.Take = top.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(); }
public static IFindFluent <MongoContentEntity, MongoContentEntity> Take(this IFindFluent <MongoContentEntity, MongoContentEntity> cursor, ODataUriParser query) { var top = query.ParseTop(); if (top.HasValue) { cursor = cursor.Limit(Math.Min((int)top.Value, 200)); } else { cursor = cursor.Limit(20); } return(cursor); }
public static IFindFluent <T, T> Take <T>(this IFindFluent <T, T> cursor, ODataUriParser query, int maxValue = 200, int defaultValue = 20) { var top = query.ParseTop(); if (top.HasValue) { cursor = cursor.Limit(Math.Min((int)top.Value, maxValue)); } else { cursor = cursor.Limit(defaultValue); } return(cursor); }
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"); }
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(); }
/// <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()); }
public ParseContext Parse(ODataUriParser parser, ParseContext parseContext) { var top = parser.ParseTop(); if (top.Value > 0) { bool isParsed = int.TryParse(top.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.Take(count); foreach (var entity in filteredResults) { collection.Add(entity); } var targetParseContext = new ParseContext { Result = collection, QueryableSourceEntities = parseContext.QueryableSourceEntities.Take(count), Model = parseContext.Model, EdmEntityTypeSettings = parseContext.EdmEntityTypeSettings, LatestStateDictionary = parseContext.LatestStateDictionary }; return(targetParseContext); } else { throw new InvalidPropertyException("Top", string.Empty); } }