Exemple #1
0
        public override void ExplicitVisit(QualifiedJoin aQualifiedJoin)
        {
            ScalarExpressionVisitor seVisitor = new ScalarExpressionVisitor(Context);

            aQualifiedJoin.AcceptChildren(seVisitor);
            AddJoin(aQualifiedJoin.QualifiedJoinType, seVisitor.Columns);
        }
        private void ParseSqlSelectStatement(TSqlStatement sqlStatement)
        {
            if (sqlStatement.GetType() == typeof(SelectStatement))
            {
                SelectStatement aSelectStatement = (SelectStatement)sqlStatement;
                QueryExpression aQueryExpression = aSelectStatement.QueryExpression;
                if (aQueryExpression.GetType() == typeof(QuerySpecification))
                {
                    QuerySpecification aQuerySpecification = (QuerySpecification)aQueryExpression;
                    if (aQuerySpecification.FromClause == null)
                    {
                        return; //'select *' is valid query, but not of our interest
                    }
                    //tables
                    NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context);
                    aQuerySpecification.FromClause.Accept(ntVisitor);
                    TablesReferred = ntVisitor.Tables;

                    //columns
                    ScalarExpressionVisitor seVisitor = null;
                    foreach (SelectElement selectStatement in aQuerySpecification.SelectElements)
                    {
                        seVisitor = new ScalarExpressionVisitor(Context, TablesReferred[0]);
                        selectStatement.Accept(seVisitor);
                        Columns.AddRange(seVisitor.Columns);
                    }

                    if (!string.IsNullOrEmpty(seVisitor.ParsedQuery))
                    {
                        ParsedQuery = seVisitor.ParsedQuery;    //todo
                    }
                    //else
                    //    ParsedQuery = Columns.GetParsedQuery(ParsedQuery);

                    UpdateReferredTables(Columns);

                    //ensure unique tables
                    TablesReferred = new List <RbacTable>(TablesReferred.DistinctBy(t => t.Name));

                    //joins
                    JoinClauseVisitor jcVisitor = new JoinClauseVisitor(Context);
                    aQueryExpression.AcceptChildren(jcVisitor);
                    JoinClauses = jcVisitor.JoinClauses;

                    //where clause
                    if (aQuerySpecification.WhereClause != null)
                    {
                        EqualVisitor       cidv = new EqualVisitor(ParsedQuery);
                        InPredicateVisitor inpv = new InPredicateVisitor(ParsedQuery);
                        aQuerySpecification.WhereClause.AcceptChildren(cidv);
                        aQuerySpecification.WhereClause.AcceptChildren(inpv);
                        WhereClauses.AddRange(cidv.WhereClauses);
                        WhereClauses.AddRange(inpv.WhereClauses);
                        WhereClauses.ParseReferenceTableNames(JoinClauses);
                    }
                }
            }
            else
            {
                Errors.Add("Not a select statement!");
            }
        }