public void FunctionParameterParserShouldHandleTheResolvedAliasBeingNull() { Dictionary <string, string> aliasValues = new Dictionary <string, string>() { { "@a", "null" } }; ParameterAliasValueAccessor paramAliasAccessor = new ParameterAliasValueAccessor(aliasValues); ICollection <OperationSegmentParameter> parsedParameters; TryParseFunctionParameters("CanMoveToAddress", "address=@a", paramAliasAccessor, out parsedParameters).Should().BeTrue(); parsedParameters.Should().HaveCount(1); parsedParameters.Single().ShouldHaveValueType <ParameterAliasNode>("address").And.Alias.Should().Be("@a"); // verify alias value: paramAliasAccessor.ParameterAliasValueNodesCached["@a"].As <ConstantNode>().Value.Should().Be(null); }
/// <summary> /// Initialize a UriParser. We have to initialize UriParser seperately for parsing path, because we may set BatchReferenceCallback before ParsePath. /// </summary> private void Initialize() { if (this.odataPath != null) { return; } this.ParameterAliasValueAccessor = new ParameterAliasValueAccessor(queryOptions.GetParameterAliases()); this.odataPath = this.ParsePathImplementation(); ODataPathSegment lastSegment = this.odataPath.LastSegment; ODataPathSegment previous = null; var segs = odataPath.GetEnumerator(); int count = 0; while (++count < odataPath.Count && segs.MoveNext()) { } previous = segs.Current; if (lastSegment != null) { // use previous segment if the last one is Key or Count Segment if (lastSegment is KeySegment || lastSegment is CountSegment) { lastSegment = previous; } this.targetNavigationSource = lastSegment.TargetEdmNavigationSource; this.targetEdmType = lastSegment.TargetEdmType; if (this.targetEdmType != null) { IEdmCollectionType collectionType = this.targetEdmType as IEdmCollectionType; if (collectionType != null) { this.targetEdmType = collectionType.ElementType.Definition; } } } InitQueryOptionDic(); this.queryOptionParser = new ODataQueryOptionParser(this.Model, this.targetEdmType, this.targetNavigationSource, queryOptionDic) { Configuration = this.configuration }; }
public void FunctionParameterParserShouldResolveAliasesInPathIfParameterAliasAccessorProvided() { Dictionary <string, string> aliasValues = new Dictionary <string, string>() { { "@a", "true" } }; ParameterAliasValueAccessor paramAliasAccessor = new ParameterAliasValueAccessor(aliasValues); ICollection <OperationSegmentParameter> parsedParameters; TryParseOperationParameters("HasDog", "inOffice=@a", paramAliasAccessor, HardCodedTestModel.GetHasDogOverloadForPeopleWithTwoParameters(), out parsedParameters).Should().BeTrue(); parsedParameters.Should().HaveCount(1); parsedParameters.Single().Name.Should().Be("inOffice"); parsedParameters.Single().Value.As <ConvertNode>().Source.As <ParameterAliasNode>().Alias.Should().Be("@a"); // verify alias value node: paramAliasAccessor.ParameterAliasValueNodesCached["@a"].ShouldBeConstantQueryNode(true); }
public void FunctionParameterParserShouldResolveAliasesInFilterOrderby() { Dictionary <string, string> aliasValues = new Dictionary <string, string>() { { "@a", "null" } }; ParameterAliasValueAccessor paramAliasAccessor = new ParameterAliasValueAccessor(aliasValues); ExpressionLexer lexer = new ExpressionLexer("address=@a)", true, false, true); ICollection <NamedFunctionParameterNode> parameterTokens; TryParseFunctionParameters(lexer, paramAliasAccessor, out parameterTokens).Should().BeTrue(); parameterTokens.Should().HaveCount(1); parameterTokens.Single().ShouldHaveParameterAliasNode("address", "@a"); // verify alias value node: paramAliasAccessor.ParameterAliasValueNodesCached["@a"].ShouldBeConstantQueryNode((object)null); }
private static bool TryParseFunctionParameters(ExpressionLexer lexer, ParameterAliasValueAccessor paramAliasAccessor, out ICollection <NamedFunctionParameterNode> parsedParameterNodes) { UriQueryExpressionParser parser = new UriQueryExpressionParser(345, lexer); ICollection <FunctionParameterToken> splitParameters; parsedParameterNodes = null; if (parser.TrySplitFunctionParameters(out splitParameters)) { var parsedParameters = FunctionCallBinder.BindSegmentParameters(new ODataUriParserConfiguration(HardCodedTestModel.TestModel) { ParameterAliasValueAccessor = paramAliasAccessor }, HardCodedTestModel.GetFunctionImportIsAddressGood().Function, splitParameters); parsedParameterNodes = parsedParameters.Select(s => new NamedFunctionParameterNode(s.Name, s.Value as QueryNode)).ToList(); return(true); } return(false); }
/// <summary> /// Create a new ODataUri. This contains the semantic meaning of the /// entire uri. /// </summary> /// <param name="parameterAliasValueAccessor">The ParameterAliasValueAccessor.</param> /// <param name="path">The top level path for this uri.</param> /// <param name="customQueryOptions">Any custom query options for this uri. Can be null.</param> /// <param name="selectAndExpand">Any $select or $expand option for this uri. Can be null.</param> /// <param name="filter">Any $filter option for this uri. Can be null.</param> /// <param name="orderby">Any $orderby option for this uri. Can be null</param> /// <param name="skip">Any $skip option for this uri. Can be null.</param> /// <param name="top">Any $top option for this uri. Can be null.</param> /// <param name="queryCount">Any query $count option for this uri. Can be null.</param> internal ODataUri( ParameterAliasValueAccessor parameterAliasValueAccessor, ODataPath path, IEnumerable <QueryNode> customQueryOptions, SelectExpandClause selectAndExpand, FilterClause filter, OrderByClause orderby, long?skip, long?top, bool?queryCount) { this.ParameterAliasValueAccessor = parameterAliasValueAccessor; this.Path = path; this.CustomQueryOptions = new ReadOnlyCollection <QueryNode>(customQueryOptions.ToList()); this.SelectAndExpand = selectAndExpand; this.Filter = filter; this.OrderBy = orderby; this.Skip = skip; this.Top = top; this.QueryCount = queryCount; }
public void FunctionParameterParserShouldResolveAliasesInPathIfParameterAliasAccessorProvided() { Dictionary <string, string> aliasValues = new Dictionary <string, string>() { { "@a", "true" } }; ParameterAliasValueAccessor paramAliasAccessor = new ParameterAliasValueAccessor(aliasValues); ICollection <OperationSegmentParameter> parsedParameters; Assert.True(TryParseOperationParameters("HasDog", "inOffice=@a", paramAliasAccessor, HardCodedTestModel.GetHasDogOverloadForPeopleWithTwoParameters(), out parsedParameters)); var parameter = Assert.Single(parsedParameters); Assert.Equal("inOffice", parameter.Name); var convertNode = Assert.IsType <ConvertNode>(parameter.Value); var aliasNode = Assert.IsType <ParameterAliasNode>(convertNode.Source); Assert.Equal("@a", aliasNode.Alias); // verify alias value node: paramAliasAccessor.ParameterAliasValueNodesCached["@a"].ShouldBeConstantQueryNode(true); }
public void FunctionParameterParserShouldHandleTheResolvedAliasBeingNull() { Dictionary <string, string> aliasValues = new Dictionary <string, string>() { { "@a", "null" } }; ParameterAliasValueAccessor paramAliasAccessor = new ParameterAliasValueAccessor(aliasValues); ICollection <OperationSegmentParameter> parsedParameters; var result = TryParseFunctionParameters("CanMoveToAddress", "address=@a", paramAliasAccessor, out parsedParameters); Assert.True(result); var parameter = Assert.Single(parsedParameters); parameter.ShouldHaveValueType <ParameterAliasNode>("address"); var aliasNode = Assert.IsType <ParameterAliasNode>(parameter.Value); Assert.Equal("@a", aliasNode.Alias); // verify alias value: var constantNode = Assert.IsType <ConstantNode>(paramAliasAccessor.ParameterAliasValueNodesCached["@a"]); Assert.Null(constantNode.Value); }
private static bool TryParseFunctionParameters(string functionName, string parenthesisExpression, ParameterAliasValueAccessor paramAliasAccessor, IEdmOperationImport operationImport, out ICollection <OperationSegmentParameter> parsedSegementParameters) { return(TryParseOperationParameters(functionName, parenthesisExpression, paramAliasAccessor, operationImport.Operation, out parsedSegementParameters)); }
private static bool TryParseOperationParameters(string functionName, string parenthesisExpression, ParameterAliasValueAccessor paramAliasAccessor, IEdmOperation operation, out ICollection <OperationSegmentParameter> parsedSegementParameters) { ICollection <FunctionParameterToken> splitParameters; parsedSegementParameters = null; ODataUriParserConfiguration configuration = new ODataUriParserConfiguration(HardCodedTestModel.TestModel) { ParameterAliasValueAccessor = paramAliasAccessor, EnableCaseInsensitiveUriFunctionIdentifier = false }; if (FunctionParameterParser.TrySplitOperationParameters(parenthesisExpression, configuration, out splitParameters)) { parsedSegementParameters = FunctionCallBinder.BindSegmentParameters(configuration, operation, splitParameters); return(true); } return(false); }
private static bool TryParseOperationParameters(string functionName, string parenthesisExpression, ParameterAliasValueAccessor paramAliasAccessor, out ICollection <OperationSegmentParameter> parsedParameters) { return(TryParseOperationParameters(functionName, parenthesisExpression, paramAliasAccessor, HardCodedTestModel.GetFunctionForCanMoveToAddress(), out parsedParameters)); }