public static PhysicalTask.SequenceTask Lower(this AstTask.AstStagingContainerTaskNode astNode)
        {
            if (astNode.AsClassOnly)
            {
                return null;
            }

            try
            {
                TSQLEmitter.TemplatePlatformEmitter createStagingTemplate =
                    new Ssis2008Emitter.Emitters.TSQL.PlatformEmitter.TemplatePlatformEmitter("CreateStagingTable", astNode.Table.Name, astNode.CreateAs);

                IR.TSQL.Table table = astNode.Table.Lower();
                table.Indexes.IndexList.Clear();
                //table.ConstraintList.Clear();
                if (astNode.UseStaticSource == false)
                {
                    table.DefaultValues.DefaultValueList.Clear();
                }
                foreach (string s in astNode.DropConstraints)
                {
                    for (int i = 0; i < table.ConstraintList.Count; i++)
                    {
                        if (String.Compare(s.Trim(), table.ConstraintList[i].Name.Trim(), true) == 0)
                        {
                            table.ConstraintList.RemoveAt(i);
                            break;
                        }
                    }
                }

                foreach (IR.TSQL.Constraint constraint in table.ConstraintList)
                {
                    constraint.Name = String.Format("{0}_{1}", astNode.CreateAs, constraint.Name);
                }
                table.ForeignKeyConstraintList.Clear();
                table.Name = astNode.CreateAs;
                table.ConnectionConfiguration = astNode.StagingConnection.Lower();


                AstTask.AstExecuteSQLTaskNode createStagingTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();

                createStagingTask.ParentASTNode = astNode;
                createStagingTask.Connection = astNode.StagingConnection;
                AddConnection(astNode.StagingConnection);
                createStagingTask.ExecuteDuringDesignTime = true;
                createStagingTask.Name = astNode.Name;
                //createStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.Expression;
                createStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.File;
                //createStagingTask.Body = String.Format("\"{0}\"", createStagingTemplate.Emit(null));
                createStagingTask.Body = new TSQLEmitter.TablePlatformEmitter().Emit(table);

                TSQLEmitter.TemplatePlatformEmitter dropStagingTemplate =
                    new Ssis2008Emitter.Emitters.TSQL.PlatformEmitter.TemplatePlatformEmitter("DropStagingTable", astNode.CreateAs);

                AstTask.AstExecuteSQLTaskNode truncateStagingTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();

                truncateStagingTask.ParentASTNode = astNode;
                truncateStagingTask.Connection = astNode.StagingConnection;
                truncateStagingTask.ExecuteDuringDesignTime = false;
                truncateStagingTask.Name = astNode.Name;
                truncateStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.Expression;
                truncateStagingTask.Body = String.Format("\"{0}\"", dropStagingTemplate.Emit(null));

                astNode.Tasks.Insert(0, createStagingTask);
                astNode.Tasks.Add(truncateStagingTask);
                return ((AstTask.AstContainerTaskNode)astNode).Lower();
            }
            catch (Exception e)
            {
                throw new SSISEmitterException(astNode, e);
            }
        }
        private static PhysicalTask.SequenceTask ProcessHelperTables(AstTask.AstContainerTaskNode astNode, PhysicalTask.SequenceTask sequenceTask)
        {
            foreach (AstTable.AstTableNode helperTableNode in astNode.HelperTables)
            {
                IR.TSQL.Table helperTable = helperTableNode.Lower();
                if (helperTable != null)
                {
                    AstTask.AstExecuteSQLTaskNode createHelperTableTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();
                    createHelperTableTask.ParentASTNode = astNode;
                    createHelperTableTask.Name = "__Create HelperTable " + helperTable.Name;
                    createHelperTableTask.Connection = helperTableNode.Connection;
                    createHelperTableTask.ExecuteDuringDesignTime = helperTableNode.ExecuteDuringDesignTime;
                    createHelperTableTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.File;
                    createHelperTableTask.Body = new TSQLEmitter.TablePlatformEmitter().Emit(helperTable);
                    sequenceTask.Tasks.Insert(0, createHelperTableTask.Lower());

                    AstTask.AstExecuteSQLTaskNode dropHelperTableTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();
                    dropHelperTableTask.ParentASTNode = astNode;
                    dropHelperTableTask.Name = "__Drop HelperTable " + helperTable.Name;
                    dropHelperTableTask.Connection = helperTableNode.Connection;
                    dropHelperTableTask.ExecuteDuringDesignTime = false;
                    dropHelperTableTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.Expression;
                    dropHelperTableTask.Body = String.Format("\"{0}\"", new TSQLEmitter.TemplatePlatformEmitter("DropHelperTable", helperTable.Name).Emit(helperTable));
                    sequenceTask.Tasks.Add(dropHelperTableTask.Lower());
                }
            }

            return sequenceTask;
        }