/// <summary> /// Bind the select and expand clause <see cref="SelectExpandClause"/> at this level. /// </summary> /// <param name="expandToken">The expand token to visit.</param> /// <param name="selectToken">The select token to visit.</param> /// <param name="segments">The parsed segments to visit.</param> /// <returns>The null or the built select and expand clause.</returns> private SelectExpandClause BindSelectExpand(ExpandToken expandToken, SelectToken selectToken, IList <ODataPathSegment> segments, IEdmNavigationSource navigationSource, IEdmTypeReference elementType, HashSet <EndPathToken> generatedProperties = null, bool collapsed = false) { if (expandToken != null || selectToken != null) { BindingState binding = CreateBindingState(this.Configuration, navigationSource, elementType, generatedProperties, collapsed); SelectExpandBinder selectExpandBinder = new SelectExpandBinder(this.Configuration, new ODataPathInfo(new ODataPath(segments)), binding); return(selectExpandBinder.Bind(expandToken, selectToken)); } else { // It's better to return null for both Expand and Select are null. // However, in order to be consistent, we returns the empty SelectExpandClause with AllSelected = true. return(new SelectExpandClause(new Collection <SelectItem>(), true)); } }
/// <summary> /// Add semantic meaning to a Select or Expand Token /// </summary> /// <param name="odataPathInfo">The path info from Uri path.</param> /// <param name="expandToken">the syntactically parsed expand token</param> /// <param name="selectToken">the syntactically parsed select token</param> /// <param name="configuration">The configuration to use for parsing.</param> /// <param name="state">The state of binding.</param> /// <returns>A select expand clause bound to metadata.</returns> public static SelectExpandClause Bind( ODataPathInfo odataPathInfo, ExpandToken expandToken, SelectToken selectToken, ODataUriParserConfiguration configuration, BindingState state) { ExpandToken normalizedExpand = ExpandTreeNormalizer.NormalizeExpandTree(expandToken); SelectToken normalizedSelect = SelectTreeNormalizer.NormalizeSelectTree(selectToken); SelectExpandBinder selectExpandBinder = new SelectExpandBinder(configuration, odataPathInfo, state); SelectExpandClause clause = selectExpandBinder.Bind(normalizedExpand, normalizedSelect); SelectExpandClauseFinisher.AddExplicitNavPropLinksWhereNecessary(clause); new ExpandDepthAndCountValidator(configuration.Settings.MaximumExpansionDepth, configuration.Settings.MaximumExpansionCount).Validate(clause); return(clause); }
/// <summary> /// Add semantic meaning to a Select or Expand Token /// </summary> /// <param name="odataPathInfo">The path info from Uri path.</param> /// <param name="expandToken">the syntactically parsed expand token</param> /// <param name="selectToken">the syntactically parsed select token</param> /// <param name="configuration">The configuration to use for parsing.</param> /// <returns>A select expand clause bound to metadata.</returns> public SelectExpandClause Bind( ODataPathInfo odataPathInfo, ExpandToken expandToken, SelectToken selectToken, ODataUriParserConfiguration configuration) { ExpandToken unifiedSelectExpandToken = SelectExpandSyntacticUnifier.Combine(expandToken, selectToken); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); ExpandToken normalizedSelectExpandToken = expandTreeNormalizer.NormalizeExpandTree(unifiedSelectExpandToken); SelectExpandBinder selectExpandBinder = new SelectExpandBinder(configuration, odataPathInfo); SelectExpandClause clause = selectExpandBinder.Bind(normalizedSelectExpandToken); SelectExpandClauseFinisher.AddExplicitNavPropLinksWhereNecessary(clause); new ExpandDepthAndCountValidator(configuration.Settings.MaximumExpansionDepth, configuration.Settings.MaximumExpansionCount).Validate(clause); return(clause); }
/// <summary> /// Generate a SubExpand based on the current nav property and the curren token /// </summary> /// <param name="tokenIn">the current token</param> /// <returns>a new SelectExpand clause bound to the current token and nav prop</returns> private SelectExpandClause GenerateSubExpand(ExpandTermToken tokenIn) { SelectExpandBinder nextLevelBinder = new SelectExpandBinder(this.Configuration, new ODataPathInfo(new ODataPath(this.parsedSegments))); return(nextLevelBinder.BindSubLevel(tokenIn.ExpandOption)); }