/// <summary> /// Create an expand item, using a navigationProperty, its entity set, and any expand options. /// </summary> /// <param name="pathToNavigationProperty">the path to the navigation property for this expand item, including any type segments</param> /// <param name="navigationSource">the navigation source for this expand level.</param> /// <param name="filterOption">A filter clause for this expand (can be null)</param> /// <param name="orderByOption">An Orderby clause for this expand (can be null)</param> /// <param name="topOption">A top clause for this expand (can be null)</param> /// <param name="skipOption">A skip clause for this expand (can be null)</param> /// <param name="countOption">An query count clause for this expand (can be null)</param> /// <param name="levelsOption">An levels clause for this expand (can be null)</param> /// <param name="searchOption">An levels clause for this expand (can be null)</param> /// <param name="selectAndExpand">This level select and any sub expands for this expand item.</param> /// <exception cref="System.ArgumentNullException">Throws if input pathToNavigationProperty is null.</exception> internal ExpandedNavigationSelectItem( ODataExpandPath pathToNavigationProperty, IEdmNavigationSource navigationSource, FilterClause filterOption, OrderByClause orderByOption, long?topOption, long?skipOption, bool?countOption, LevelsClause levelsOption, SearchClause searchOption, SelectExpandClause selectAndExpand) { ExceptionUtils.CheckArgumentNotNull(pathToNavigationProperty, "navigationProperty"); this.pathToNavigationProperty = pathToNavigationProperty; this.navigationSource = navigationSource; this.filterOption = filterOption; this.orderByOption = orderByOption; this.topOption = topOption; this.skipOption = skipOption; this.countOption = countOption; this.levelsOption = levelsOption; this.searchOption = searchOption; this.selectAndExpand = selectAndExpand; }
public ExpandDepthAndCountValidatorTests() { this.emptyTree = new SelectExpandClause(new SelectItem[0], true); var pathToMyDog = new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetDogsSet())); this.treeWithDepth1 = new SelectExpandClause(new[] { new ExpandedNavigationSelectItem(pathToMyDog, HardCodedTestModel.GetDogsSet(), this.emptyTree) }, true); var pathToPerson = new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetDogMyPeopleNavProp(), HardCodedTestModel.GetPeopleSet())); this.treeWithDepth2 = new SelectExpandClause(new[] { new ExpandedNavigationSelectItem(pathToPerson, HardCodedTestModel.GetPeopleSet(), this.treeWithDepth1) }, true); var pathToLions = new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyLionsNavProp(), HardCodedTestModel.GetLionSet())); this.treeWithWidth2 = new SelectExpandClause(new[] { new ExpandedNavigationSelectItem(pathToMyDog, HardCodedTestModel.GetDogsSet(), this.emptyTree), new ExpandedNavigationSelectItem(pathToLions, HardCodedTestModel.GetLionSet(), this.emptyTree) }, true); this.treeWithDepthAndWidth2WithRepeatedParent = new SelectExpandClause(new[] { new ExpandedNavigationSelectItem(pathToPerson, HardCodedTestModel.GetPeopleSet(), this.treeWithWidth2) }, true); var pathToPaintings = new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyPaintingsNavProp(), HardCodedTestModel.GetPaintingsSet())); this.bigComplexTree = new SelectExpandClause(new[] { new ExpandedNavigationSelectItem(pathToMyDog, HardCodedTestModel.GetDogsSet(), this.treeWithDepthAndWidth2WithRepeatedParent), new ExpandedNavigationSelectItem(pathToLions, HardCodedTestModel.GetLionSet(), this.emptyTree), new ExpandedNavigationSelectItem(pathToPaintings, HardCodedTestModel.GetPaintingsSet(), this.emptyTree) }, true); }
/// <summary> /// Create an expand item, using a navigationProperty, its entity set, and any expand options. /// </summary> /// <param name="pathToNavigationProperty">the path to the navigation property for this expand item, including any type segments</param> /// <param name="navigationSource">the navigation source for this expand level.</param> /// <param name="selectAndExpand">This level select and any sub expands for this expand item.</param> /// <param name="filterOption">A filter clause for this expand (can be null)</param> /// <param name="orderByOption">An Orderby clause for this expand (can be null)</param> /// <param name="topOption">A top clause for this expand (can be null)</param> /// <param name="skipOption">A skip clause for this expand (can be null)</param> /// <param name="countOption">An query count clause for this expand (can be null)</param> /// <param name="searchOption">An levels clause for this expand (can be null)</param> /// <param name="levelsOption">An levels clause for this expand (can be null)</param> /// <exception cref="System.ArgumentNullException">Throws if input pathToNavigationProperty is null.</exception> public ExpandedNavigationSelectItem( ODataExpandPath pathToNavigationProperty, IEdmNavigationSource navigationSource, SelectExpandClause selectAndExpand, FilterClause filterOption, OrderByClause orderByOption, long?topOption, long?skipOption, bool?countOption, SearchClause searchOption, LevelsClause levelsOption) : base(pathToNavigationProperty, navigationSource, filterOption, orderByOption, topOption, skipOption, countOption, searchOption) { ExceptionUtils.CheckArgumentNotNull(pathToNavigationProperty, "pathToNavigationProperty"); this.SelectAndExpand = selectAndExpand; this.LevelsOption = levelsOption; }
/// <summary> /// Create an expand item, using a navigationProperty, its entity set, and any expand options. /// </summary> /// <param name="pathToNavigationProperty">the path to the navigation property for this expand item, including any type segments</param> /// <param name="navigationSource">the navigation source for this expand level.</param> /// <param name="filterOption">A filter clause for this expand (can be null)</param> /// <param name="orderByOption">An Orderby clause for this expand (can be null)</param> /// <param name="topOption">A top clause for this expand (can be null)</param> /// <param name="skipOption">A skip clause for this expand (can be null)</param> /// <param name="countOption">An query count clause for this expand (can be null)</param> /// <param name="searchOption">An levels clause for this expand (can be null)</param> /// <exception cref="System.ArgumentNullException">Throws if input pathToNavigationProperty is null.</exception> public ExpandedReferenceSelectItem( ODataExpandPath pathToNavigationProperty, IEdmNavigationSource navigationSource, FilterClause filterOption, OrderByClause orderByOption, long?topOption, long?skipOption, bool?countOption, SearchClause searchOption) { ExceptionUtils.CheckArgumentNotNull(pathToNavigationProperty, "pathToNavigationProperty"); this.PathToNavigationProperty = pathToNavigationProperty; this.NavigationSource = navigationSource; this.FilterOption = filterOption; this.OrderByOption = orderByOption; this.TopOption = topOption; this.SkipOption = skipOption; this.CountOption = countOption; this.SearchOption = searchOption; }
/// <summary> /// Translate an ODataExpandPath into an ODataSelectPath /// Depending on the constructor of ODataSelectPath to validate that we aren't adding any /// segments that are illegal for a select. /// </summary> /// <param name="path">the ODataExpandPath to translate</param> /// <returns>A new ODataSelect path with the same segments as the expand path.</returns> public static ODataSelectPath ToSelectPath(this ODataExpandPath path) { return(new ODataSelectPath(path)); }
/// <summary> /// Create an Expand item using a nav prop, its entity set and a SelectExpandClause /// </summary> /// <param name="pathToNavigationProperty">the path to the navigation property for this expand item, including any type segments</param> /// <param name="navigationSource">the navigation source for this ExpandItem</param> /// <param name="selectExpandOption">This level select and any sub expands for this expand item.</param> /// <exception cref="System.ArgumentNullException">Throws if input pathToNavigationProperty is null.</exception> public ExpandedNavigationSelectItem(ODataExpandPath pathToNavigationProperty, IEdmNavigationSource navigationSource, SelectExpandClause selectExpandOption) : this(pathToNavigationProperty, navigationSource, selectExpandOption, null, null, null, null, null, null, null) { }
private static IEnumerable<SelectItem> GetAutoExpandedNavigationSelectItems( IEdmEntityType baseEntityType, IEdmModel model, string alreadyExpandedNavigationSourceName, IEdmNavigationSource navigationSource, bool isAllSelected, bool searchDerivedTypeWhenAutoExpand) { var expandItems = new List<SelectItem>(); var autoExpandNavigationProperties = EdmLibHelpers.GetAutoExpandNavigationProperties(baseEntityType, model, searchDerivedTypeWhenAutoExpand); foreach (var navigationProperty in autoExpandNavigationProperties) { if (!alreadyExpandedNavigationSourceName.Equals(navigationProperty.Name)) { IEdmEntityType entityType = navigationProperty.DeclaringEntityType(); IEdmNavigationSource currentEdmNavigationSource = navigationSource.FindNavigationTarget(navigationProperty); if (currentEdmNavigationSource != null) { List<ODataPathSegment> pathSegments = new List<ODataPathSegment>() { new NavigationPropertySegment(navigationProperty, currentEdmNavigationSource) }; ODataExpandPath expandPath = new ODataExpandPath(pathSegments); SelectExpandClause selectExpandClause = new SelectExpandClause(new List<SelectItem>(), true); ExpandedNavigationSelectItem item = new ExpandedNavigationSelectItem(expandPath, currentEdmNavigationSource, selectExpandClause); if (!currentEdmNavigationSource.EntityType().Equals(entityType)) { IEnumerable<SelectItem> nestedSelectItems = GetAutoExpandedNavigationSelectItems( currentEdmNavigationSource.EntityType(), model, alreadyExpandedNavigationSourceName, item.NavigationSource, true, searchDerivedTypeWhenAutoExpand); selectExpandClause = new SelectExpandClause(nestedSelectItems, true); item = new ExpandedNavigationSelectItem(expandPath, currentEdmNavigationSource, selectExpandClause); } expandItems.Add(item); if (!isAllSelected) { PathSelectItem pathSelectItem = new PathSelectItem( new ODataSelectPath(pathSegments)); expandItems.Add(pathSelectItem); } } } } return expandItems; }
/// <summary> /// Generate an expand item (and a select item for the implicit nav prop if necessary) based on an ExpandTermToken /// </summary> /// <param name="tokenIn">the expandTerm token to visit</param> /// <returns>the expand item for this expand term token.</returns> private SelectItem GenerateExpandItem(ExpandTermToken tokenIn) { ExceptionUtils.CheckArgumentNotNull(tokenIn, "tokenIn"); // ensure that we're always dealing with proper V4 syntax if (tokenIn.PathToNavProp.NextToken != null && !tokenIn.PathToNavProp.IsNamespaceOrContainerQualified()) { if (tokenIn.PathToNavProp.NextToken.Identifier != UriQueryConstants.RefSegment || tokenIn.PathToNavProp.NextToken.NextToken != null) { throw new ODataException(ODataErrorStrings.ExpandItemBinder_TraversingMultipleNavPropsInTheSamePath); } } PathSegmentToken currentToken = tokenIn.PathToNavProp; IEdmStructuredType currentLevelEntityType = this.EdmType; List<ODataPathSegment> pathSoFar = new List<ODataPathSegment>(); PathSegmentToken firstNonTypeToken = currentToken; if (currentToken.IsNamespaceOrContainerQualified()) { pathSoFar.AddRange(SelectExpandPathBinder.FollowTypeSegments(currentToken, this.Model, this.Settings.SelectExpandLimit, this.configuration.Resolver, ref currentLevelEntityType, out firstNonTypeToken)); } IEdmProperty edmProperty = this.configuration.Resolver.ResolveProperty(currentLevelEntityType, firstNonTypeToken.Identifier); if (edmProperty == null) { throw new ODataException(ODataErrorStrings.MetadataBinder_PropertyNotDeclared(currentLevelEntityType.ODataFullName(), currentToken.Identifier)); } IEdmNavigationProperty currentNavProp = edmProperty as IEdmNavigationProperty; if (currentNavProp == null) { throw new ODataException(ODataErrorStrings.ExpandItemBinder_PropertyIsNotANavigationProperty(currentToken.Identifier, currentLevelEntityType.ODataFullName())); } bool isRef = false; if (firstNonTypeToken.NextToken != null) { // lastly... make sure that, since we're on a NavProp, that the next token isn't null. if (firstNonTypeToken.NextToken.Identifier == UriQueryConstants.RefSegment) { isRef = true; } else { throw new ODataException(ODataErrorStrings.ExpandItemBinder_TraversingMultipleNavPropsInTheSamePath); } } pathSoFar.Add(new NavigationPropertySegment(currentNavProp, /*entitySet*/null)); ODataExpandPath pathToNavProp = new ODataExpandPath(pathSoFar); IEdmNavigationSource targetNavigationSource = null; if (this.NavigationSource != null) { targetNavigationSource = this.NavigationSource.FindNavigationTarget(currentNavProp); } // call MetadataBinder to build the filter clause FilterClause filterOption = null; if (tokenIn.FilterOption != null) { MetadataBinder binder = this.BuildNewMetadataBinder(targetNavigationSource); FilterBinder filterBinder = new FilterBinder(binder.Bind, binder.BindingState); filterOption = filterBinder.BindFilter(tokenIn.FilterOption); } // call MetadataBinder again to build the orderby clause OrderByClause orderbyOption = null; if (tokenIn.OrderByOptions != null) { MetadataBinder binder = this.BuildNewMetadataBinder(targetNavigationSource); OrderByBinder orderByBinder = new OrderByBinder(binder.Bind); orderbyOption = orderByBinder.BindOrderBy(binder.BindingState, tokenIn.OrderByOptions); } SearchClause searchOption = null; if (tokenIn.SearchOption != null) { MetadataBinder binder = this.BuildNewMetadataBinder(targetNavigationSource); SearchBinder searchBinder = new SearchBinder(binder.Bind); searchOption = searchBinder.BindSearch(tokenIn.SearchOption); } if (isRef) { return new ExpandedReferenceSelectItem(pathToNavProp, targetNavigationSource, filterOption, orderbyOption, tokenIn.TopOption, tokenIn.SkipOption, tokenIn.CountQueryOption, searchOption); } SelectExpandClause subSelectExpand; if (tokenIn.ExpandOption != null) { subSelectExpand = this.GenerateSubExpand(currentNavProp, tokenIn); } else { subSelectExpand = BuildDefaultSubExpand(); } subSelectExpand = this.DecorateExpandWithSelect(subSelectExpand, currentNavProp, tokenIn.SelectOption); LevelsClause levelsOption = this.ParseLevels(tokenIn.LevelsOption, currentLevelEntityType, currentNavProp); return new ExpandedNavigationSelectItem(pathToNavProp, targetNavigationSource, subSelectExpand, filterOption, orderbyOption, tokenIn.TopOption, tokenIn.SkipOption, tokenIn.CountQueryOption, searchOption, levelsOption); }
/// <summary> /// Create an Expand item using a nav prop, its entity set /// </summary> /// <param name="pathToNavigationProperty">the path to the navigation property for this expand item, including any type segments</param> /// <param name="navigationSource">the navigation source for this ExpandItem</param> /// <exception cref="System.ArgumentNullException">Throws if input pathToNavigationProperty is null.</exception> public ExpandedReferenceSelectItem(ODataExpandPath pathToNavigationProperty, IEdmNavigationSource navigationSource) : this(pathToNavigationProperty, navigationSource, null, null, null, null, null, null) { }