/// <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; }
/// <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="search">Any $search option for this uri. Can be null</param> /// <param name="apply">Any $apply 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, SearchClause search, ApplyClause apply, 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.Search = search; this.Apply = apply; this.Skip = skip; this.Top = top; this.QueryCount = queryCount; }
/// <summary> /// Binds the given filter token. /// </summary> /// <param name="search">The search token to bind.</param> /// <returns>A SearchClause with for given Token.</returns> internal SearchClause BindSearch(QueryToken search) { ExceptionUtils.CheckArgumentNotNull(search, "filter"); QueryNode expressionNode = this.bindMethod(search); SingleValueNode expressionResultNode = expressionNode as SingleValueNode; SearchClause searchClause = new SearchClause(expressionResultNode); return searchClause; }
/// <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> /// Parses the $search. /// </summary> /// <returns>SearchClause representing $search.</returns> public SearchClause ParseSearch() { if (this.searchClause != null) { return this.searchClause; } string searchQuery; if (!this.TryGetQueryOption(UriQueryConstants.SearchQueryOption, out searchQuery) || searchQuery == null) { return null; } this.searchClause = ParseSearchImplementation(searchQuery, this.Configuration); return searchClause; }
/// <summary> /// Apply search to the given resouce expression /// </summary> /// <param name="rootExpression"></param> /// <param name="entityInstanceType"></param> /// <param name="uriParser"></param> /// <param name="searchClause"></param> /// <returns></returns> public static Expression ApplySearch(this Expression rootExpression, Type entityInstanceType, ODataUriParser uriParser, SearchClause searchClause) { ParameterExpression parameter = Expression.Parameter(entityInstanceType, "it"); NodeToExpressionTranslator nodeToExpressionTranslator = new NodeToExpressionTranslator() { ImplicitVariableParameterExpression = parameter, UriParser = uriParser, }; Expression searchNodeExpression = nodeToExpressionTranslator.TranslateNode(searchClause.Expression); // IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate); // translate to rootExpression.Where(searchNodeExpression) return Expression.Call( typeof(Enumerable), "Where", new Type[] { entityInstanceType }, rootExpression, Expression.Lambda(searchNodeExpression, parameter)); }
public void SearchOptionSetCorrectly() { SearchClause search = new SearchClause(new SearchTermNode("SearchMe")); ExpandedNavigationSelectItem expansion = new ExpandedNavigationSelectItem(new ODataExpandPath(new NavigationPropertySegment(ModelBuildingHelpers.BuildValidNavigationProperty(), null)), HardCodedTestModel.GetPeopleSet(), null, null, null, null, null, null, search, null); expansion.SearchOption.Expression.ShouldBeSearchTermNode("SearchMe"); }
/// <summary> /// Writes an ODataPath to string /// </summary> /// <param name="path"></param> /// <returns></returns> public static string ToString(SearchClause node) { if (node != null) { return tabHelper.Prefix + "SearchQueryOption" + tabHelper.Indent(() => tabHelper.Prefix + "Expression = " + ToString(node.Expression) ); } return String.Empty; }
/// <summary> /// Writes a test case for baselining. /// </summary> /// <param name="node">Node to write to string</param> /// <param name="originalSearch">Original $search string.</param> /// <returns>String representation of the output from the URI Parser.</returns> internal static string GetTestCaseAndResultString(SearchClause node, string originalSearch) { return "$search = " + originalSearch + "\n\n" + ToString(node); }