Exemple #1
0
 public override void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     base.VisitQueryFromClause(queryFromClause);
     indexData.FromExpression = queryFromClause.Expression.Clone();
     indexData.FromIdentifier = queryFromClause.Identifier;
     indexData.NumberOfFromClauses++;
 }
Exemple #2
0
 public virtual void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     if (this.ThrowException)
     {
         throw (System.Exception) this.CreateException(queryFromClause);
     }
 }
        public override object VisitQueryFromClause(QueryFromClause fromClause, object data)
        {
            Expression node;

            var expression           = fromClause.Expression;
            var invocationExpression = expression as InvocationExpression;

            if (invocationExpression == null)
            {
                node = expression;
            }
            else
            {
                var target = invocationExpression.Target as MemberReferenceExpression;
                if (target == null || target.Target is IdentifierExpression || target.Target is ThisReferenceExpression)
                {
                    return(base.VisitQueryFromClause(fromClause, data));
                }

                node = target.Target;
            }

            node.ReplaceWith(new ParenthesizedExpression(new CastExpression(new SimpleType("IEnumerable<dynamic>"), node.Clone())));

            return(base.VisitQueryFromClause(fromClause, data));
        }
Exemple #4
0
 public override void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     base.VisitQueryFromClause(queryFromClause);
     indexData.FromExpression = queryFromClause.Expression.Clone();
     indexData.FromIdentifier = queryFromClause.Identifier;
     indexData.NumberOfFromClauses++;
 }
Exemple #5
0
        public virtual string CompileCte(Query query)
        {
            var clauses = query.GetComponents <AbstractFrom>("cte", EngineCode);

            if (!clauses.Any())
            {
                return("");
            }

            var sql = new List <string>();

            foreach (var cte in clauses)
            {
                if (cte is RawFromClause)
                {
                    RawFromClause clause = (cte as RawFromClause);
                    sql.Add($"{WrapValue(clause.Alias)} AS ({WrapIdentifiers(clause.Expression)})");
                }
                else if (cte is QueryFromClause)
                {
                    QueryFromClause clause = (cte as QueryFromClause);
                    sql.Add($"{WrapValue(clause.Alias)} AS ({CompileSelect(clause.Query)})");
                }
            }

            return("WITH " + string.Join(", ", sql) + " ");
        }
Exemple #6
0
        protected internal override bool DoMatch(AstNode other, PatternMatching.Match match)
        {
            QueryFromClause o = other as QueryFromClause;

            return(o != null && this.Type.DoMatch(o.Type, match) && MatchString(this.Identifier, o.Identifier) &&
                   this.Expression.DoMatch(o.Expression, match));
        }
 public virtual void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     if (ThrowException)
     {
         throw (Exception)CreateException(queryFromClause);
     }
 }
Exemple #8
0
        public void RenderQueryFromClauseWithAlias()
        {
            SelectQuery query = new SelectQuery();

            query.Select(new SelectClause(new Column("Column1")));
            query.From(new TableFromClause(new Table("Table1")));
            QueryFromClause queryFromClause = new QueryFromClause(query, "Query1Alias");

            Assert.AreEqual("(SELECT [Column1] FROM [Table1]) Query1Alias", sqlClientRenderer.Render(queryFromClause));
        }
Exemple #9
0
        QueryFromClause MakeFromClause(ParameterDeclaration parameter, Expression body)
        {
            QueryFromClause fromClause = new QueryFromClause {
                Identifier = parameter.Name,
                Expression = body
            };

            fromClause.CopyAnnotationsFrom(parameter);
            return(fromClause);
        }
        bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery)
        {
            if (!IsTransparentIdentifier(fromClause.Identifier))
            {
                return(false);
            }
            Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());

            if (!match.Success)
            {
                return(false);
            }
            QuerySelectClause       selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
            NamedArgumentExpression nae1         = match.Get <NamedArgumentExpression>("nae1").Single();
            NamedArgumentExpression nae2         = match.Get <NamedArgumentExpression>("nae2").Single();

            if (nae1.Identifier != ((IdentifierExpression)nae1.Expression).Identifier)
            {
                return(false);
            }
            IdentifierExpression nae2IdentExpr = nae2.Expression as IdentifierExpression;

            if (nae2IdentExpr != null && nae2.Identifier == nae2IdentExpr.Identifier)
            {
                // from * in (from x in ... select new { x = x, y = y }) ...
                // =>
                // from x in ... ...
                fromClause.Remove();
                selectClause.Remove();
                // Move clauses from innerQuery to query
                QueryClause insertionPos = null;
                foreach (var clause in innerQuery.Clauses)
                {
                    query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
                }
            }
            else
            {
                // from * in (from x in ... select new { x = x, y = expr }) ...
                // =>
                // from x in ... let y = expr ...
                fromClause.Remove();
                selectClause.Remove();
                // Move clauses from innerQuery to query
                QueryClause insertionPos = null;
                foreach (var clause in innerQuery.Clauses)
                {
                    query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
                }
                query.Clauses.InsertAfter(insertionPos, new QueryLetClause {
                    Identifier = nae2.Identifier, Expression = nae2.Expression.Detach()
                });
            }
            return(true);
        }
Exemple #11
0
        public void AddQueryFromClauseWithAlias()
        {
            SelectQuery query = new SelectQuery();

            query.Select(new SelectClause(new Column("Column1")));
            query.From(new TableFromClause(new Table("Table1")));
            QueryFromClause queryFromClause = new QueryFromClause(query, "Query1Alias");

            Assert.AreEqual(query, queryFromClause.Query);
            Assert.AreEqual("Query1Alias", queryFromClause.Alias);
        }
        bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery, Dictionary <string, object> letClauses)
        {
            if (!IsTransparentIdentifier(fromClause.Identifier))
            {
                return(false);
            }
            QuerySelectClause selectClause = innerQuery.Clauses.Last() as QuerySelectClause;
            Match             match        = selectTransparentIdentifierPattern.Match(selectClause);

            if (!match.Success)
            {
                return(false);
            }

            // from * in (from x in ... select new { members of anonymous type }) ...
            // =>
            // from x in ... { let x = ... } ...
            fromClause.Remove();
            selectClause.Remove();
            // Move clauses from innerQuery to query
            QueryClause insertionPos = null;

            foreach (var clause in innerQuery.Clauses)
            {
                query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
            }

            foreach (var expr in match.Get <Expression>("expr"))
            {
                switch (expr)
                {
                case IdentifierExpression identifier:
                    // nothing to add
                    continue;

                case NamedExpression namedExpression:
                    if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier)
                    {
                        letClauses[namedExpression.Name] = identifierExpression.Annotation <ILVariableResolveResult>();
                        continue;
                    }
                    QueryLetClause letClause = new QueryLetClause {
                        Identifier = namedExpression.Name, Expression = namedExpression.Expression.Detach()
                    };
                    var annotation = new LetIdentifierAnnotation();
                    letClause.AddAnnotation(annotation);
                    letClauses[namedExpression.Name] = annotation;
                    query.Clauses.InsertAfter(insertionPos, letClause);
                    break;
                }
            }
            return(true);
        }
Exemple #13
0
        public override string Render(QueryFromClause queryFromClause)
        {
            StringBuilder text = new StringBuilder();

            text.AppendFormat("({0}) ", queryFromClause.Query.Render(this));

            if (queryFromClause.Alias != null)
            {
                text.AppendFormat("{0} ", queryFromClause.Alias);
            }

            return(text.ToString().Trim());
        }
Exemple #14
0
        public UnifiedElement VisitQueryFromClause(
            QueryFromClause from, object data)
        {
            var ident = UnifiedIdentifier.CreateVariable(from.Identifier);
            var expr  = from.Expression.TryAcceptForExpression(this);

            if (from.Type == null)
            {
                return(UnifiedFromQuery.Create(ident, expr));
            }
            var type = LookupType(from.Type);

            return(UnifiedFromQuery.Create(ident, expr, type));
        }
Exemple #15
0
        public override object VisitQueryFromClause(QueryFromClause queryFromClause, object data)
        {
            var memberReferenceExpression = queryFromClause.Expression as MemberReferenceExpression;

            if (memberReferenceExpression != null)
            {
                var identifierExpression = memberReferenceExpression.Target as IdentifierExpression;
                if (identifierExpression != null && identifierExpression.Identifier != "docs")
                {
                    var generateExpression = GenerateExpression(queryFromClause.Expression);
                    if (generateExpression != null)
                    {
                        aliasToName[queryFromClause.Identifier] = generateExpression + ",";
                    }
                }
            }

            return(base.VisitQueryFromClause(queryFromClause, data));
        }
Exemple #16
0
            public void Run(AstNode compilationUnit)
            {
                root = compilationUnit;
                DecompileQueries(compilationUnit);
                // After all queries were decompiled, detect degenerate queries (queries not property terminated with 'select' or 'group')
                // and fix them, either by adding a degenerate select, or by combining them with another query.
                foreach (QueryExpression query in compilationUnit.Descendants.OfType <QueryExpression>())
                {
                    var fromClause = query.Clauses.First() as QueryFromClause;
                    if (fromClause == null)
                    {
                        continue;
                    }

                    if (IsDegenerateQuery(query))
                    {
                        // introduce select for degenerate query
                        query.Clauses.Add(new QuerySelectClause {
                            Expression = new IdentifierExpression(fromClause.Identifier)
                        });
                    }
                    // See if the data source of this query is a degenerate query,
                    // and combine the queries if possible.
                    QueryExpression innerQuery = fromClause.Expression as QueryExpression;
                    while (IsDegenerateQuery(innerQuery))
                    {
                        QueryFromClause innerFromClause = (QueryFromClause)innerQuery.Clauses.First();
                        if (fromClause.Identifier != innerFromClause.Identifier)
                        {
                            break;
                        }
                        // Replace the fromClause with all clauses from the inner query
                        fromClause.Remove();
                        QueryClause insertionPos = null;
                        foreach (var clause in innerQuery.Clauses)
                        {
                            query.Clauses.InsertAfter(insertionPos, insertionPos = Detach(clause));
                        }
                        fromClause = innerFromClause;
                        innerQuery = fromClause.Expression as QueryExpression;
                    }
                }
            }
Exemple #17
0
            void CombineQueries(AstNode node)
            {
                for (AstNode child = node.FirstChild; child != null; child = child.NextSibling)
                {
                    CombineQueries(child);
                }
                QueryExpression query = node as QueryExpression;

                if (query != null)
                {
                    if (query.Clauses.First().GetType() != typeof(QueryFromClause))
                    {
                        return;
                    }

                    QueryFromClause fromClause = (QueryFromClause)query.Clauses.First();
                    QueryExpression innerQuery = fromClause.Expression as QueryExpression;
                    if (innerQuery != null)
                    {
                        if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery))
                        {
                            RemoveTransparentIdentifierReferences(query);
                        }
                        else
                        {
                            QueryContinuationClause continuation = new QueryContinuationClause();
                            continuation.PrecedingQuery = Detach(innerQuery);
                            continuation.Identifier     = fromClause.Identifier;
                            fromClause.ReplaceWith(continuation);
                        }
                    }
                    else
                    {
                        Match m = castPattern.Match(fromClause.Expression);
                        if (m.Success)
                        {
                            fromClause.Type       = Detach(m.Get <AstType>("targetType").Single());
                            fromClause.Expression = Detach(m.Get <Expression>("inExpr").Single());
                        }
                    }
                }
            }
        void CombineQueries(AstNode node, Dictionary <string, object> fromOrLetIdentifiers)
        {
            AstNode next;

            for (AstNode child = node.FirstChild; child != null; child = next)
            {
                // store reference to next child before transformation
                next = child.NextSibling;
                CombineQueries(child, fromOrLetIdentifiers);
            }
            QueryExpression query = node as QueryExpression;

            if (query != null)
            {
                QueryFromClause fromClause = (QueryFromClause)query.Clauses.First();
                QueryExpression innerQuery = fromClause.Expression as QueryExpression;
                if (innerQuery != null)
                {
                    if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery, fromOrLetIdentifiers))
                    {
                        RemoveTransparentIdentifierReferences(query, fromOrLetIdentifiers);
                    }
                    else
                    {
                        QueryContinuationClause continuation = new QueryContinuationClause();
                        continuation.PrecedingQuery = innerQuery.Detach();
                        continuation.Identifier     = fromClause.Identifier;
                        continuation.CopyAnnotationsFrom(fromClause);
                        fromClause.ReplaceWith(continuation);
                    }
                }
                else
                {
                    Match m = castPattern.Match(fromClause.Expression);
                    if (m.Success)
                    {
                        fromClause.Type       = m.Get <AstType>("targetType").Single().Detach();
                        fromClause.Expression = m.Get <Expression>("inExpr").Single().Detach();
                    }
                }
            }
        }
		bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery)
		{
			if (!IsTransparentIdentifier(fromClause.Identifier))
				return false;
			Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());
			if (!match.Success)
				return false;
			QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
			NamedArgumentExpression nae1 = match.Get<NamedArgumentExpression>("nae1").Single();
			NamedArgumentExpression nae2 = match.Get<NamedArgumentExpression>("nae2").Single();
			if (nae1.Identifier != ((IdentifierExpression)nae1.Expression).Identifier)
				return false;
			IdentifierExpression nae2IdentExpr = nae2.Expression as IdentifierExpression;
			if (nae2IdentExpr != null && nae2.Identifier == nae2IdentExpr.Identifier) {
				// from * in (from x in ... select new { x = x, y = y }) ...
				// =>
				// from x in ... ...
				fromClause.Remove();
				selectClause.Remove();
				// Move clauses from innerQuery to query
				QueryClause insertionPos = null;
				foreach (var clause in innerQuery.Clauses) {
					query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
				}
			} else {
				// from * in (from x in ... select new { x = x, y = expr }) ...
				// =>
				// from x in ... let y = expr ...
				fromClause.Remove();
				selectClause.Remove();
				// Move clauses from innerQuery to query
				QueryClause insertionPos = null;
				foreach (var clause in innerQuery.Clauses) {
					query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
				}
				query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = nae2.Identifier, Expression = nae2.Expression.Detach() });
			}
			return true;
		}
 public override void VisitQueryFromClause(QueryFromClause syntax)
 {
     _underlyingVisitor.VisitQueryFromClause(syntax);
 }
Exemple #21
0
 public override void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     queryFromClause.Expression.AcceptVisitor(this);
 }
 public virtual S VisitQueryFromClause(QueryFromClause queryFromClause, T data)
 {
     return(VisitChildren(queryFromClause, data));
 }
Exemple #23
0
 public void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     throw new NotImplementedException();
 }
Exemple #24
0
 public abstract string Render(QueryFromClause queryFromClause);
		bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery, string continuationIdentifier, out string transparentIdentifier)
		{
			transparentIdentifier = fromClause.Identifier;

			Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());
			if (!match.Success)
				return false;
			QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
			Expression nae1 = match.Get<Expression>("nae1").SingleOrDefault();
			string nae1Name = ExtractExpressionName(ref nae1);
			if (nae1Name == null)
				return false;

			Expression nae2 = match.Get<Expression>("nae2").SingleOrDefault();
			string nae2Name = ExtractExpressionName(ref nae2);
			if (nae2Name == null)
				return false;

			bool introduceLetClause = true;
			var nae1Identifier = nae1 as IdentifierExpression;
			var nae2Identifier = nae2 as IdentifierExpression;
			if (nae1Identifier != null && nae2Identifier != null && nae1Identifier.Identifier == nae1Name && nae2Identifier.Identifier == nae2Name) {
				introduceLetClause = false;
			}

			if (nae1Name != continuationIdentifier) {
				if (nae2Name == continuationIdentifier) {
					//Members are in reversed order
					string tempName = nae1Name;
					Expression tempNae = nae1;

					nae1Name = nae2Name;
					nae1 = nae2;
					nae2Name = tempName;
					nae2 = tempNae;
				} else {
					return false;
				}
			}

			if (introduceLetClause && innerQuery.Clauses.OfType<QueryFromClause>().Any(from => from.Identifier == nae2Name)) {
				return false;
			}
			if (introduceLetClause && innerQuery.Clauses.OfType<QueryJoinClause>().Any(join => join.JoinIdentifier == nae2Name)) {
				return false;
			}

			// from * in (from x in ... select new { x = x, y = expr }) ...
			// =>
			// from x in ... let y = expr ...
			fromClause.Remove();
			selectClause.Remove();
			// Move clauses from innerQuery to query
			QueryClause insertionPos = null;
			foreach (var clause in innerQuery.Clauses) {
				query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
			}
			if (introduceLetClause) {
				query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = nae2Name, Expression = nae2.Detach() });
			}
			return true;
		}
 public Node VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     return(CreateDummy(queryFromClause));
 }
		public virtual void VisitQueryFromClause(QueryFromClause queryFromClause)
		{
			VisitChildren (queryFromClause);
		}
		bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery, out string transparentIdentifier)
		{
			transparentIdentifier = fromClause.Identifier;

			Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());
			if (!match.Success)
				return false;
			QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
			Expression nae1 = match.Get<Expression>("nae1").SingleOrDefault();
			string nae1Name = ExtractExpressionName(ref nae1);
			if (nae1Name == null)
				return false;

			Expression nae2 = match.Get<Expression>("nae2").SingleOrDefault();
			string nae2Name = ExtractExpressionName(ref nae2);
			if (nae1Name == null)
				return false;

			// from * in (from x in ... select new { x = x, y = expr }) ...
			// =>
			// from x in ... let y = expr ...
			fromClause.Remove();
			selectClause.Remove();
			// Move clauses from innerQuery to query
			QueryClause insertionPos = null;
			foreach (var clause in innerQuery.Clauses) {
				query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
			}
			query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = nae2Name, Expression = nae2.Detach() });
			return true;
		}
		public override void VisitQueryFromClause(QueryFromClause queryFromClause)
		{
			FixClauseIndentation(queryFromClause, queryFromClause.FromKeyword);
		}
Exemple #30
0
			public override object Visit(Mono.CSharp.Linq.QueryStartClause queryExpression)
			{
				if (queryExpression.Expr == null) {
					var intoClause = new QueryContinuationClause();
					intoClause.AddChild(new CSharpTokenNode(Convert(queryExpression.Location), QueryContinuationClause.IntoKeywordRole), QueryContinuationClause.IntoKeywordRole);
					intoClause.AddChild(Identifier.Create(queryExpression.IntoVariable.Name, Convert(queryExpression.IntoVariable.Location)), Roles.Identifier);
					return intoClause;
				}
				
				var fromClause = new QueryFromClause();

				fromClause.AddChild(new CSharpTokenNode(Convert(queryExpression.Location), QueryFromClause.FromKeywordRole), QueryFromClause.FromKeywordRole);
				
				if (queryExpression.IdentifierType != null)
					fromClause.AddChild(ConvertToType(queryExpression.IdentifierType), Roles.Type);
				
				fromClause.AddChild(Identifier.Create(queryExpression.IntoVariable.Name, Convert(queryExpression.IntoVariable.Location)), Roles.Identifier);
				
				var location = LocationsBag.GetLocations(queryExpression);
				if (location != null)
					fromClause.AddChild(new CSharpTokenNode(Convert(location [0]), QueryFromClause.InKeywordRole), QueryFromClause.InKeywordRole);

				if (queryExpression.Expr != null)
					fromClause.AddChild((Expression)queryExpression.Expr.Accept(this), Roles.Expression);
				return fromClause;
			}
Exemple #31
0
 public void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     throw new NotImplementedException();
 }
		bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery)
		{
			if (!IsTransparentIdentifier(fromClause.Identifier))
				return false;
			Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());
			if (!match.Success)
				return false;
			QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
			NamedExpression nae1 = match.Get<NamedExpression>("nae1").SingleOrDefault();
			NamedExpression nae2 = match.Get<NamedExpression>("nae2").SingleOrDefault();
			if (nae1 != null && nae1.Name != ((IdentifierExpression)nae1.Expression).Identifier)
				return false;
			Expression nae2Expr = match.Get<Expression>("nae2Expr").Single();
			IdentifierExpression nae2IdentExpr = nae2Expr as IdentifierExpression;
			if (nae2IdentExpr != null && (nae2 == null || nae2.Name == nae2IdentExpr.Identifier)) {
				// from * in (from x in ... select new { x = x, y = y }) ...
				// =>
				// from x in ... ...
				fromClause.Remove();
				selectClause.Remove();
				// Move clauses from innerQuery to query
				QueryClause insertionPos = null;
				foreach (var clause in innerQuery.Clauses) {
					query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
				}
			} else {
				// from * in (from x in ... select new { x = x, y = expr }) ...
				// =>
				// from x in ... let y = expr ...
				fromClause.Remove();
				selectClause.Remove();
				// Move clauses from innerQuery to query
				QueryClause insertionPos = null;
				foreach (var clause in innerQuery.Clauses) {
					query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach());
				}
				string ident;
				if (nae2 != null)
					ident = nae2.Name;
				else if (nae2Expr is IdentifierExpression)
					ident = ((IdentifierExpression)nae2Expr).Identifier;
				else if (nae2Expr is MemberReferenceExpression)
					ident = ((MemberReferenceExpression)nae2Expr).MemberName;
				else
					throw new InvalidOperationException("Could not infer name from initializer in AnonymousTypeCreateExpression");
				query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = ident, Expression = nae2Expr.Detach() });
			}
			return true;
		}
 public JNode VisitQueryFromClause(QueryFromClause node)
 {
     throw new NotImplementedException();
 }
Exemple #34
0
 public void VisitQueryFromClause(QueryFromClause node)
 {
     NotSupported(node);
 }
        private static void HandleCollectionName(Expression expression, QueryFromClause fromClause, QueryExpression queryExpression, ref string entityName)
        {
            // from d in docs.Users.SelectMany(x=>x.Roles) ...
            // from d in docs.Users.Where(x=>x.IsActive)   ...
            var    mie          = expression as InvocationExpression;
            string methodToCall = null;

            if (mie != null)
            {
                expression = mie.Target;

                var target = expression as MemberReferenceExpression;
                if (target != null)
                {
                    methodToCall = target.MemberName;
                    expression   = target.Target;
                }
            }

            var mre = expression as MemberReferenceExpression;

            if (mre == null)
            {
                return;
            }

            string oldIdentifier = fromClause.Identifier;

            if (mie != null)
            {
                fromClause.Identifier += "Item";
            }

            entityName            = mre.MemberName;
            fromClause.Expression = mre.Target;
            //doc["@metadata"]["Raven-Entity-Name"]
            var metadata = new IndexerExpression(
                new IndexerExpression(new IdentifierExpression(fromClause.Identifier), new List <Expression> {
                new StringLiteralExpression("@metadata")
            }),
                new List <Expression> {
                new StringLiteralExpression(Constants.RavenEntityName)
            }
                );

            // string.Equals(doc["@metadata"]["Raven-Entity-Name"], "Blogs", StringComparison.OrdinalIgnoreCase)
            var binaryOperatorExpression =
                new InvocationExpression(
                    new MemberReferenceExpression(new TypeReferenceExpression(new PrimitiveType("string")), "Equals"),
                    new List <Expression>
            {
                metadata,
                new StringLiteralExpression(mre.MemberName),
                new MemberReferenceExpression(new TypeReferenceExpression(new SimpleType(typeof(StringComparison).FullName)), "InvariantCultureIgnoreCase")
            });

            var queryWhereClause = new QueryWhereClause
            {
                Condition = binaryOperatorExpression
            };

            ((QueryExpression)fromClause.Parent).Clauses.InsertAfter(fromClause,
                                                                     queryWhereClause);

            if (mie != null)
            {
                var newSource = new ArrayCreateExpression
                {
                    Initializer = new ArrayInitializerExpression(new IdentifierExpression(fromClause.Identifier)),
                    AdditionalArraySpecifiers = { new ArraySpecifier(1) }
                };
                queryExpression.Clauses.InsertAfter(queryWhereClause, new QueryFromClause
                {
                    Identifier = oldIdentifier,
                    Expression = new InvocationExpression(new MemberReferenceExpression(newSource, methodToCall), mie.Arguments.Select(x => x.Clone()))
                });
            }
        }
 public virtual void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     if (this.ThrowException)
     {
         throw (Exception)this.CreateException(queryFromClause);
     }
 }
 /// <inheritdoc/>
 public virtual void VisitQueryFromClause(QueryFromClause syntax)
 {
     VisitNode(syntax);
 }
 public StringBuilder VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     return(InvalidNode(queryFromClause, "LINQ is not supported"));
 }
 public StringBuilder VisitQueryFromClause(QueryFromClause queryFromClause, int data)
 {
     throw new SLSharpException("SL# does not understand LINQ.");
 }
Exemple #40
0
            bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery)
            {
                if (!IsTransparentIdentifier(fromClause.Identifier))
                {
                    return(false);
                }
                Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last());

                if (!match.Success)
                {
                    return(false);
                }
                QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last();
                NamedExpression   nae1         = match.Get <NamedExpression>("nae1").SingleOrDefault();
                NamedExpression   nae2         = match.Get <NamedExpression>("nae2").SingleOrDefault();

                if (nae1 != null && nae1.Name != ((IdentifierExpression)nae1.Expression).Identifier)
                {
                    return(false);
                }
                Expression           nae2Expr      = match.Get <Expression>("nae2Expr").Single();
                IdentifierExpression nae2IdentExpr = nae2Expr as IdentifierExpression;

                if (nae2IdentExpr != null && (nae2 == null || nae2.Name == nae2IdentExpr.Identifier))
                {
                    // from * in (from x in ... select new { x = x, y = y }) ...
                    // =>
                    // from x in ... ...
                    fromClause.Remove();
                    selectClause.Remove();
                    // Move clauses from innerQuery to query
                    QueryClause insertionPos = null;
                    foreach (var clause in innerQuery.Clauses)
                    {
                        query.Clauses.InsertAfter(insertionPos, insertionPos = Detach(clause));
                    }
                }
                else
                {
                    // from * in (from x in ... select new { x = x, y = expr }) ...
                    // =>
                    // from x in ... let y = expr ...
                    fromClause.Remove();
                    selectClause.Remove();
                    // Move clauses from innerQuery to query
                    QueryClause insertionPos = null;
                    foreach (var clause in innerQuery.Clauses)
                    {
                        query.Clauses.InsertAfter(insertionPos, insertionPos = Detach(clause));
                    }
                    string ident;
                    if (nae2 != null)
                    {
                        ident = nae2.Name;
                    }
                    else if (nae2Expr is MemberReferenceExpression)
                    {
                        ident = ((MemberReferenceExpression)nae2Expr).MemberName;
                    }
                    else
                    {
                        throw new InvalidOperationException("Could not infer name from initializer in AnonymousTypeCreateExpression");
                    }
                    query.Clauses.InsertAfter(insertionPos, new QueryLetClause {
                        Identifier = ident, Expression = Detach(nae2Expr)
                    });
                }
                return(true);
            }
Exemple #41
0
			public override void VisitQueryFromClause(QueryFromClause queryFromClause)
			{
				ProcessName(queryFromClause.Identifier);
				base.VisitQueryFromClause(queryFromClause);
			}
Exemple #42
0
 public override void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     ProcessName(queryFromClause.Identifier);
     base.VisitQueryFromClause(queryFromClause);
 }
/*			public override object Visit (Mono.CSharp.Linq.Query queryExpression)
			{
				var result = new QueryFromClause ();
				var location = LocationsBag.GetLocations (queryExpression);
				if (location != null)
					result.AddChild (new CSharpTokenNode (Convert (location[0]), "from".Length), QueryFromClause.FromKeywordRole);
				// TODO: select identifier
				if (location != null)
					result.AddChild (new CSharpTokenNode (Convert (location[1]), "in".Length), QueryFromClause.InKeywordRole);
				var query = queryExpression.Expr as Mono.CSharp.Linq.AQueryClause;
//				if (query != null && query.Expr != null)
//					result.AddChild ((AstNode)query.Expr.Accept (this), QueryFromClause.Roles.Expression);
				return result;
			}				 */
			
			public override object Visit (Mono.CSharp.Linq.SelectMany selectMany)
			{
				var result = new QueryFromClause ();
				// TODO:
//				Mono.CSharp.Linq.Cast cast = selectMany.Expr as Mono.CSharp.Linq.Cast;
				var location = LocationsBag.GetLocations (selectMany);
				if (location != null)
					result.AddChild (new CSharpTokenNode (Convert (location[0]), "from".Length), QueryFromClause.FromKeywordRole);
				
				//					result.AddChild ((AstNode)cast.TypeExpr.Accept (this), QueryFromClause.Roles.ReturnType);
//				if (cast != null)
				
//				result.AddChild (new Identifier (selectMany.SelectIdentifier.Value, Convert (selectMany.SelectIdentifier.Location)), QueryFromClause.Roles.Identifier);
				//				result.AddChild (new CSharpTokenNode (Convert (location[1]), "in".Length), QueryFromClause.InKeywordRole);
				
				//				result.AddChild ((AstNode)(cast != null ? cast.Expr : selectMany.Expr).Accept (this), QueryFromClause.Roles.Expression);
				
				
				return result;
			}
Exemple #44
0
			public override object Visit(Mono.CSharp.Linq.SelectMany selectMany)
			{
				var fromClause = new QueryFromClause();

				fromClause.AddChild(new CSharpTokenNode(Convert(selectMany.Location), QueryFromClause.FromKeywordRole), QueryFromClause.FromKeywordRole);
				
				if (selectMany.IdentifierType != null)
					fromClause.AddChild(ConvertToType(selectMany.IdentifierType), Roles.Type);
				
				fromClause.AddChild(Identifier.Create(selectMany.IntoVariable.Name, Convert(selectMany.IntoVariable.Location)), Roles.Identifier);
				
				var location = LocationsBag.GetLocations(selectMany);
				if (location != null)
					fromClause.AddChild(new CSharpTokenNode(Convert(location [0]), QueryFromClause.InKeywordRole), QueryFromClause.InKeywordRole);

				if (selectMany.Expr != null)
					fromClause.AddChild((Expression)selectMany.Expr.Accept(this), Roles.Expression);
				return fromClause;
			}
Exemple #45
0
			public override object Visit (Mono.CSharp.Linq.SelectMany queryStart)
			{
				var fromClause = new QueryFromClause ();
				var location = LocationsBag.GetLocations (queryStart);
				
				fromClause.AddChild (new CSharpTokenNode (Convert (queryStart.Location), "from".Length), QueryFromClause.FromKeywordRole);
				
				if (queryStart.IdentifierType != null)
					fromClause.AddChild (ConvertToType (queryStart.IdentifierType), QueryFromClause.Roles.Type);
				
				fromClause.AddChild (new Identifier (queryStart.IntoVariable.Name, Convert (queryStart.IntoVariable.Location)), QueryFromClause.Roles.Identifier);
				
				if (location != null)
					fromClause.AddChild (new CSharpTokenNode (Convert (location [0]), "in".Length), QueryFromClause.InKeywordRole);
				fromClause.AddChild ((Expression)queryStart.Expr.Accept (this), QueryFromClause.Roles.Expression);
				return fromClause;
			}
Exemple #46
0
		public void VisitQueryFromClause(QueryFromClause queryFromClause)
		{
			StartNode(queryFromClause);
			WriteKeyword(QueryFromClause.FromKeywordRole);
			queryFromClause.Type.AcceptVisitor(this);
			Space();
			queryFromClause.IdentifierToken.AcceptVisitor(this);
			Space();
			WriteKeyword(QueryFromClause.InKeywordRole);
			Space();
			queryFromClause.Expression.AcceptVisitor(this);
			EndNode(queryFromClause);
		}
 public override void VisitQueryFromClause(QueryFromClause queryFromClause)
 {
     throw NotSupportedToConsistency();
 }