예제 #1
0
        protected virtual string CompileTableExpression(AbstractFrom from)
        {
            if (from is RawFromClause)
            {
                return(WrapIdentifiers((from as RawFromClause).Expression));
            }

            if (from is QueryFromClause)
            {
                var fromQuery = (from as QueryFromClause).Query;

                var alias = string.IsNullOrEmpty(fromQuery.QueryAlias) ? "" : " AS " + WrapValue(fromQuery.QueryAlias);

                var compiled = CompileSelect(fromQuery);

                return("(" + compiled + ")" + alias);
            }

            if (from is FromClause)
            {
                return(WrapTable((from as FromClause).Table));
            }

            throw InvalidClauseException("TableExpression", from);
        }
예제 #2
0
        public virtual string CompileTableExpression(SqlResult ctx, AbstractFrom from)
        {
            if (from is RawFromClause raw)
            {
                ctx.Bindings.AddRange(raw.Bindings);
                return(WrapIdentifiers(raw.Expression));
            }

            if (from is QueryFromClause queryFromClause)
            {
                var fromQuery = queryFromClause.Query;

                var alias = string.IsNullOrEmpty(fromQuery.QueryAlias) ? "" : $" {TableAsKeyword}" + WrapValue(fromQuery.QueryAlias);

                var subCtx = CompileSelectQuery(fromQuery);

                ctx.Bindings.AddRange(subCtx.Bindings);

                return("(" + subCtx.RawSql + ")" + alias);
            }

            if (from is FromClause fromClause)
            {
                return(Wrap(fromClause.Table));
            }

            throw InvalidClauseException("TableExpression", from);
        }
예제 #3
0
        public virtual string CompileTableExpression(SqlResult context, AbstractFrom from)
        {
            if (from is RawFromClause raw)
            {
                context.Bindings.AddRange(raw.Bindings);
                return(wrapper.WrapIdentifiers(raw.Expression));
            }

            if (from is QueryFromClause queryFromClause)
            {
                Query fromQuery = queryFromClause.Query;

                string alias = string.IsNullOrEmpty(fromQuery.QueryAlias) ? "" : $" {wrapper.TableAsKeyword}" + wrapper.WrapValue(fromQuery.QueryAlias);

                SqlResult subContext = CompileSelectQuery(fromQuery);

                context.Bindings.AddRange(subContext.Bindings);

                return("(" + subContext.RawSql + ")" + alias);
            }

            if (from is FromClause fromClause)
            {
                return(wrapper.Wrap(fromClause.Table));
            }

            throw InvalidClauseException("TableExpression", from);
        }
예제 #4
0
        private string MakeTable(SqlResult context)
        {
            AbstractFrom fromClause = context.Query.GetOneComponent <AbstractFrom>("from", EngineCode);

            if (fromClause is null)
            {
                throw new InvalidOperationException("Invalid table expression");
            }

            TableProcessor tableProcessor = new TableProcessor(context, wrapper);

            fromClause.Accept(tableProcessor);
            string table = tableProcessor.GetTableExpression();

            /*
             * if (fromClause is FromClause fromClauseCast)
             * {
             *  table = Wrap(fromClauseCast.Table);
             * }
             * else if (fromClause is RawFromClause rawFromClause)
             * {
             *  table = WrapIdentifiers(rawFromClause.Expression);
             *  context.Bindings.AddRange(rawFromClause.Bindings);
             * }*/

            if (table is null)
            {
                throw new InvalidOperationException("Invalid table expression");
            }

            return(table);
        }
예제 #5
0
        public virtual SqlResult CompileCte(AbstractFrom cte)
        {
            var ctx = new SqlResult();

            if (null == cte)
            {
                return(ctx);
            }

            if (cte is RawFromClause raw)
            {
                ctx.Bindings.AddRange(raw.Bindings);
                ctx.RawSql = $"{WrapValue(raw.Alias)} AS ({WrapIdentifiers(raw.Expression)})";
            }
            else if (cte is QueryFromClause queryFromClause)
            {
                var subCtx = CompileSelectQuery(queryFromClause.Query);
                ctx.Bindings.AddRange(subCtx.Bindings);

                ctx.RawSql = $"{WrapValue(queryFromClause.Alias)} AS ({subCtx.RawSql})";
            }
            else if (cte is AdHocTableFromClause adHoc)
            {
                var subCtx = CompileAdHocQuery(adHoc);
                ctx.Bindings.AddRange(subCtx.Bindings);

                ctx.RawSql = $"{WrapValue(adHoc.Alias)} AS ({subCtx.RawSql})";
            }

            return(ctx);
        }
예제 #6
0
        public virtual string CompileTableExpression(AbstractFrom from)
        {
            if (from is RawFromClause raw)
            {
                bindings.AddRange(raw.Bindings);
                return(WrapIdentifiers(raw.Expression));
            }

            if (from is QueryFromClause queryFromClause)
            {
                var fromQuery = queryFromClause.Query;

                var alias = string.IsNullOrEmpty(fromQuery.QueryAlias) ? "" : " AS " + WrapValue(fromQuery.QueryAlias);

                var compiled = CompileSelect(fromQuery);

                return("(" + compiled + ")" + alias);
            }

            if (from is FromClause fromClause)
            {
                return(Wrap(fromClause.Table));
            }

            throw InvalidClauseException("TableExpression", from);
        }
예제 #7
0
        public virtual string CompileFrom(SqlResult context)
        {
            if (!context.Query.HasComponent("from", EngineCode))
            {
                throw new InvalidOperationException("No table is set");
            }

            AbstractFrom from = context.Query.GetOneComponent <AbstractFrom>("from", EngineCode);

            return("FROM " + CompileTableExpression(context, from));
        }
예제 #8
0
        public virtual string CompileJoin(SqlResult context, Join join, bool isNested = false)
        {
            AbstractFrom             from       = join.GetOneComponent <AbstractFrom>("from", EngineCode);
            List <AbstractCondition> conditions = join.GetComponents <AbstractCondition>("where", EngineCode);

            string joinTable   = CompileTableExpression(context, from);
            string constraints = CompileConditions(context, conditions);

            string onClause = conditions.Any() ? $" ON {constraints}" : "";

            return($"{join.Type} {joinTable}{onClause}");
        }
예제 #9
0
        public virtual SqlResult CompileCte(AbstractFrom context)
        {
            SqlResult sqlContext = new SqlResult();

            if (null == context)
            {
                return(sqlContext);
            }

            if (context is RawFromClause raw)
            {
                sqlContext.Bindings.AddRange(raw.Bindings);
                sqlContext.RawSql = $"{wrapper.WrapValue(raw.Alias)} AS ({wrapper.WrapIdentifiers(raw.Expression)})";
            }
            else if (context is QueryFromClause queryFromClause)
            {
                SqlResult subSqlContext = CompileSelectQuery(queryFromClause.Query);
                sqlContext.Bindings.AddRange(subSqlContext.Bindings);

                sqlContext.RawSql = $"{wrapper.WrapValue(queryFromClause.Alias)} AS ({subSqlContext.RawSql})";
            }

            return(sqlContext);
        }