/// <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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 7
0
        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;
        }