/// <summary>Converts a query component navigator into the query component itself.</summary> /// <param name="queryComponentNavigator">Query component navigator to be converted.</param> /// <returns>Query component.</returns> internal static IQueryComponent GetQueryComponent(this IQueryComponentNavigator queryComponentNavigator) { IQueryComponentNavigator _this = (IQueryComponentNavigator)queryComponentNavigator; if (!(_this.NavigatedComponent is QueryComponent)) { throw new InvalidOperationException(System.String.Format("Cannot convert to query component objects of type '{0}'.", _this.NavigatedComponent.GetType())); } return((QueryComponent)_this.NavigatedComponent); }
/// <summary>Converts a query component into its navigator.</summary> /// <param name="queryComponent">Query component to be converted.</param> /// <returns>Query component navigator or null.</returns> internal static IQueryComponentNavigator GetQueryComponentNavigator(this IQueryComponent queryComponent) { IQueryComponentNavigator result = null; QueryComponentNavigatorAttribute queryComponentNavigatorAttribute = queryComponent.GetQueryComponentNavigatorAttribute(); if (queryComponentNavigatorAttribute != null) { result = (IQueryComponentNavigator)queryComponentNavigatorAttribute.Constructor.Invoke(new object[] { queryComponent }); } return(result); }
/// <summary>Visits a where clause.</summary> /// <param name="whereClause">Where clause to be visited.</param> /// <param name="queryModel">Query model containing given from clause.</param> /// <param name="index">Index of the where clause in the query model.</param> public override void VisitWhereClause(WhereClause whereClause, Remotion.Linq.QueryModel queryModel, int index) { _visitor.ConstantFromClause = _auxFromComponent; _visitor.Visit(whereClause.Predicate); QueryComponent queryComponent = _visitor.RetrieveComponent(); IQueryComponentNavigator queryComponentNavigator = queryComponent.GetQueryComponentNavigator(); if (queryComponentNavigator != null) { queryComponentNavigator.ReplaceComponent(Identifier.Current, _subject); } if (queryComponent is QueryElement) { if ((!(queryComponent is EntityConstrain)) && (!_query.Elements.Contains((QueryElement)queryComponent))) { _query.Elements.Add((QueryElement)queryComponent); } } else if (!_query.FindAllComponents <Filter>().Any(item => item.Expression == queryComponent)) { Filter filter = new Filter((IExpression)queryComponent); StrongEntityAccessor targetEntityAccessor = null; if ((_subject != _mainFromComponent.About) && (queryComponentNavigator.Contains(_subject))) { targetEntityAccessor = (from entityAccessor in _query.FindAllComponents <StrongEntityAccessor>() from constrain in entityAccessor.FindAllComponents <EntityConstrain>() where (constrain.GetType() == typeof(EntityConstrain)) && (_subject.Equals(constrain.Value)) select entityAccessor).FirstOrDefault(); } if (targetEntityAccessor == null) { IEnumerable <StrongEntityAccessor> targetEntityAccessorExression = _query.Elements.OfType <StrongEntityAccessor>(); if ((_query.IsSubQuery) || (whereClause.Predicate is Remotion.Linq.Clauses.Expressions.SubQueryExpression)) { targetEntityAccessorExression = targetEntityAccessorExression.Except(new StrongEntityAccessor[] { _query.Elements.OfType <StrongEntityAccessor>().LastOrDefault() }); } targetEntityAccessor = targetEntityAccessorExression.LastOrDefault() ?? _mainFromComponent; } if ((!targetEntityAccessor.Elements.Contains(queryComponent)) && (!targetEntityAccessor.Elements.Contains(filter))) { targetEntityAccessor.Elements.Add(filter); } } _auxFromComponent = null; base.VisitWhereClause(whereClause, queryModel, index); }
private void CleanupComponent(QueryComponent component) { IQueryComponentNavigator queryComponentNavigator = _lastComponent.GetQueryComponentNavigator(); if (queryComponentNavigator != null) { while ((_currentComponent.Count > 0) && (!_currentComponent.Peek().Equals(queryComponentNavigator))) { _currentComponent.Pop(); } if (_currentComponent.Count > 0) { _currentComponent.Pop(); } } }
private static IEnumerable <T> FindAllComponents <T>(this IQueryComponentNavigator queryComponentNavigator, IList <Query> searchedQueries) where T : IQueryComponent { List <T> result = new List <T>(); Query query = null; if (queryComponentNavigator is QueryNavigator) { query = (Query)queryComponentNavigator.GetQueryComponent(); if ((!searchedQueries.Contains(query)) && (searchedQueries.Count < 2)) { searchedQueries.Add(query); if ((query != null) && (query.OwnerQuery != null)) { result.AddUniqueRange(query.OwnerQuery.GetQueryComponentNavigator().FindAllComponents <T>(searchedQueries)); } } else { query = null; } } foreach (IQueryComponent component in queryComponentNavigator.GetComponents()) { if ((typeof(T).IsAssignableFrom(component.GetType())) && (!result.Contains((T)component))) { result.Add((T)component); } IQueryComponentNavigator componentNavigator = component.GetQueryComponentNavigator(); if ((componentNavigator != null) && ((!(component is Query)) || (!searchedQueries.Contains((Query)component)))) { result.AddUniqueRange(componentNavigator.FindAllComponents <T>(searchedQueries)); } } return(result.AsReadOnly()); }
internal static bool Contains(this IQueryComponentNavigator navigator, IQueryComponent component) { bool result = navigator.ContainsComponent(component); if (!result) { foreach (IQueryComponent childComponent in navigator.GetComponents()) { IQueryComponentNavigator childNavigator = childComponent.GetQueryComponentNavigator(); if (childNavigator != null) { bool localResult = childNavigator.Contains(component); if (localResult) { result = localResult; break; } } } } return(result); }
private void HandleComponent(QueryComponent component) { if (_currentComponent.Count > 0) { if (_currentComponent.Peek().CanAddComponent(component)) { if (!_currentComponent.Peek().ContainsComponent(component)) { _currentComponent.Peek().AddComponent(component); } } else { _currentComponent.Pop(); } } IQueryComponentNavigator queryComponentNavigator = component.GetQueryComponentNavigator(); if (queryComponentNavigator != null) { _currentComponent.Push(queryComponentNavigator); } }
/// <summary>Searches the query object graph for specific items.</summary> /// <typeparam name="T">Type of the item to be searched for.</typeparam> /// <param name="queryComponentNavigator">Query component navigator to be searched through.</param> /// <remarks>This method performs a deep search for all items that match given type and its derivatives.</remarks> /// <returns>Enumeration of found components matching given type.</returns> internal static IEnumerable <T> FindAllComponents <T>(this IQueryComponentNavigator queryComponentNavigator) where T : IQueryComponent { return(FindAllComponents <T>(queryComponentNavigator, new List <Query>())); }
/// <summary>Visits a select clause.</summary> /// <param name="selectClause">Select clause to be visited.</param> /// <param name="queryModel">Query model containing given select clause.</param> public override void VisitSelectClause(SelectClause selectClause, Remotion.Linq.QueryModel queryModel) { if (queryModel.ResultOperators.Count == 0) { throw new InvalidOperationException("Must have an evaluating expression for sub-queries, i.e. 'Count' or 'Contains'."); } string currentItemNameOverride = _visitor.ItemNameOverride; QuerySourceReferenceExpression selector = (QuerySourceReferenceExpression)selectClause.Selector; if (selector.ReferencedQuerySource is MainFromClause) { MainFromClause mainFrom = (MainFromClause)selector.ReferencedQuerySource; if (mainFrom.FromExpression is System.Linq.Expressions.MemberExpression) { _fromExpression = (System.Linq.Expressions.MemberExpression)mainFrom.FromExpression; } } _visitor.ItemNameOverride = ((QuerySourceReferenceExpression)selectClause.Selector).ReferencedQuerySource.ItemName; queryModel.MainFromClause.Accept(this, queryModel); VisitBodyClauses(queryModel.BodyClauses, queryModel); VisitResultOperators(queryModel.ResultOperators, queryModel); IQueryComponentNavigator resultNavigator = _result.GetQueryComponentNavigator(); if ((_from != null) && (_from is IExpression)) { if (_mainFromComponent == null) { _mainFromComponent = (IExpression)_from; } else { resultNavigator.ReplaceComponent(Identifier.Current, _from); } } if (_mainFromComponent != null) { if (_bodies.Count == 0) { resultNavigator.AddComponent(_mainFromComponent); } else { foreach (QueryComponent queryComponent in _bodies) { if (queryComponent is IExpression) { IExpression expression = (IExpression)queryComponent; Identifier currentIdentifier = null; IQueryComponentNavigator queryComponentNavigator = expression.GetQueryComponentNavigator(); if (queryComponentNavigator != null) { currentIdentifier = (_mainFromComponent is Identifier ? (Identifier)_mainFromComponent : _visitor.Query.FindAllComponents <Identifier>().Where(item => _visitor.Query.RetrieveIdentifier(item.Name) == _visitor.ItemNameOverride).FirstOrDefault()) ?? _visitor.Query.Subject; queryComponentNavigator.ReplaceComponent(Identifier.Current, currentIdentifier); } resultNavigator.AddComponent(new Filter(expression)); } } } } else { throw new InvalidOperationException(System.String.Format("Cannot add value of type '{0}' as an method call argument.", _from.GetType().FullName)); } _visitor.ItemNameOverride = currentItemNameOverride; _visitor.ConstantFromClause = null; }