public static PhysicalDataFlow.DerivedColumns Lower(this AstTransformation.AstDerivedColumnListNode astNode)
        {
            if (astNode.AsClassOnly)
            {
                return null;
            }

            Ssis2008Emitter.IR.DataFlow.DerivedColumns physicalNode = new Ssis2008Emitter.IR.DataFlow.DerivedColumns();
            physicalNode.Name = astNode.Name;

            foreach (AstTransformation.AstDerivedColumnNode column in astNode.Columns)
            {
                Ssis2008Emitter.IR.DataFlow.DerivedColumn physicalColumn = new Ssis2008Emitter.IR.DataFlow.DerivedColumn();
                physicalColumn.Name = column.Name;
                physicalColumn.Type = column.Type.ToString();
                physicalColumn.Length = column.Length;
                physicalColumn.Precision = column.Precision;
                physicalColumn.Scale = column.Scale;
                physicalColumn.Expression = column.Expression;

                physicalColumn.ReplaceExisting = column.ReplaceExisting;
                physicalColumn.Parent = physicalNode;
                physicalNode.Columns.Add(physicalColumn);
            }
            return physicalNode;
        }
        public static PhysicalDataFlow.DerivedColumns Lower(this AstTransformation.AstIsNullPatcherNode astNode)
        {
            if (astNode.AsClassOnly)
            {
                return null;
            }

            Ssis2008Emitter.IR.DataFlow.DerivedColumns physicalNode = new Ssis2008Emitter.IR.DataFlow.DerivedColumns();
            physicalNode.Name = astNode.Name;

            foreach (AstTransformation.AstIsNullPatcherColumnNode column in astNode.Columns)
            {
                Ssis2008Emitter.IR.DataFlow.DerivedColumn physicalColumn = new Ssis2008Emitter.IR.DataFlow.DerivedColumn();
                physicalColumn.Name = column.Name;
                // TODO: Use template here?
                physicalColumn.Expression = String.Format(System.Globalization.CultureInfo.InvariantCulture, "ISNULL({0}) ? {1} : {0}", column.Name, column.DefaultValue);
                physicalColumn.ReplaceExisting = true;
                physicalColumn.Parent = physicalNode;
                physicalNode.Columns.Add(physicalColumn);
            }
            return physicalNode;
        }
        public static PhysicalDataFlow.DerivedColumns Lower(this AstTransformation.AstAutoNullPatcherNode astNode)
        {
            if (astNode.AsClassOnly)
            {
                return null;
            }

            Ssis2008Emitter.IR.DataFlow.DerivedColumns physicalNode = new Ssis2008Emitter.IR.DataFlow.DerivedColumns();
            physicalNode.Name = String.Format(System.Globalization.CultureInfo.InvariantCulture, "AutoPatcher for Fact Table: {0}", astNode.FactTable.ReferenceableName);

            foreach (AstTable.AstTableColumnBaseNode column in astNode.FactTable.Columns)
            {
                if (!column.IsNullable)
                {
                    Ssis2008Emitter.IR.DataFlow.DerivedColumn physicalColumn = new Ssis2008Emitter.IR.DataFlow.DerivedColumn();
                    physicalColumn.Name = column.Name;
                    AstTable.AstTableColumnNode tableColumn = column as AstTable.AstTableColumnNode;
                    // TODO: Use template here?
                    // TODO: Can we assume that dim default is 0?
                    physicalColumn.Expression = String.Format(System.Globalization.CultureInfo.InvariantCulture, "ISNULL({0}) ? {1} : {0}", column.Name, tableColumn == null ? 0.ToString(System.Globalization.CultureInfo.InvariantCulture) : tableColumn.Default);
                    physicalColumn.ReplaceExisting = true;
                    physicalColumn.Parent = physicalNode;
                    physicalNode.Columns.Add(physicalColumn);
                }
            }
            return physicalNode;
        }