public StageDataFlow(EzContainer parent, PACKAGE_STAGE p)
            : base(parent)
        {
            this.p = p;

            Source = new EzOleDbSource(this);
            Source.Connection = p.Conns["Source"];
            //TODO allow custom query
            Source.SqlCommand = p.d.SOURCEQUERY;
            Source.Name = p.d.NAME;
            Console.WriteLine("Source Component created ...");

            EzDerivedColumn CreateNaturalKey = new EzDerivedColumn(this);
            CreateNaturalKey.AttachTo(Source);
            CreateNaturalKey.Name = "Create Natural Key";
            //TODO split NaturalKey from NaturalKeyColumnName, generate NaturalKey expression programmatically
            CreateNaturalKey.Expression["NaturalKey"] = this.getNaturalKey();
            CreateNaturalKey.Expression["NaturalKeyColumnName"] = this.getNaturalKeyColumnName();
            CreateNaturalKey.Expression["CreateDate"] = "GETDATE()";
            CreateNaturalKey.Expression["StageTableName"] = "(DT_STR,150,1252)\"" + p.tableName("STAGE") + "\"";
            //TODO if dataobject is dimension type, get dataset from dimension
            CreateNaturalKey.Expression["DataSetName"] = "(DT_STR,150,1252)\"" + p.d.MATCHDATASET + "\"";
            Console.WriteLine("Derived Columns added ...");

            GetDatasetID = new EzLookup(this);
            GetDatasetID.Name = "Get Dataset ID";
            GetDatasetID.AttachTo(CreateNaturalKey);
            GetDatasetID.SetJoinCols("DataSetName,DataSetName");
            GetDatasetID.OleDbConnection = this.p.Conns["MATCH"];
            GetDatasetID.SqlCommand = "select DataSetName, DataSetID from DataSets";
            GetDatasetID.SetCopyOverwriteCols("DataSetID,DataSetID");
            Console.WriteLine("DataSet ID Acquired ...");

            GetStageTableID = new EzLookup(this);
            GetStageTableID.Name = "Get Stage Table ID";
            GetStageTableID.AttachTo(GetDatasetID);
            GetStageTableID.SetJoinCols("StageTableName,TableName");
            GetStageTableID.OleDbConnection = p.Conns["Commercial_META"];
            //TODO better query when more tables are in it table
            GetStageTableID.SqlCommand = "select TableName, TableID from meta_Table";
            GetStageTableID.SetCopyOverwriteCols("Stage_TableID,TableID");
            Console.WriteLine("Stage Table ID Acquired...");

            //TODO if StageTableID is 0, insert and return value

            GenerateChecksum = new EzChecksum(this);
            GenerateChecksum.Name = "Generate Checksum";
            GenerateChecksum.LinkAllInputsToOutputs();
            GenerateChecksum.ReinitializeMetaData();
            GenerateChecksum.AttachTo(GetStageTableID);

            AssignMatchKey = new EzLookup(this);
            AssignMatchKey.Name = "Assign Match Key";
            AssignMatchKey.AttachTo(GenerateChecksum);
            AssignMatchKey.SetJoinCols("NaturalKey,NaturalKey");
            AssignMatchKey.OleDbConnection = p.Conns["MATCH"];
            AssignMatchKey.SqlCommand = "SELECT NaturalKey, MatchKey from " + this.p.tableName("MATCH");
            AssignMatchKey.SetCopyOverwriteCols("MatchKey,MatchKey");
            AssignMatchKey.NoMatchBehavor = NoMatchBehavior.SendToNoMatchOutput;
            Console.WriteLine("Matchkey checked ...");

            RowsMatched = new EzRowCount(this);
            RowsMatched.Name = "Rows Matched";
            RowsMatched.VariableName = "Audit::RowsMatched";
            RowsMatched.AttachTo(AssignMatchKey, 0, 0);

            MatchedDestination = new EzOleDbDestination(this);
            MatchedDestination.Name = this.p.tableName("STAGE");
            MatchedDestination.AttachTo(RowsMatched);
            MatchedDestination.Connection = this.p.Conns["Commercial_STG"];
            MatchedDestination.Table = this.p.tableName("STAGE");
            MatchedDestination.LinkAllInputsToOutputs();
            MatchedDestination.ReinitializeMetaData();
            Console.WriteLine("Matched Destination created ...");

            RowsInserted = new EzRowCount(this);
            RowsInserted.Name = "Rows Inserted";
            RowsInserted.VariableName = "Audit::RowsInserted";
            RowsInserted.AttachTo(AssignMatchKey, 1, 0);

            RetrieveLastMatchKey = new EzLookup(this);
            RetrieveLastMatchKey.Name = "Retrieve Last MatchKey";
            RetrieveLastMatchKey.AttachTo(RowsInserted);
            RetrieveLastMatchKey.SetJoinCols("DataSetID,DataSetID");
            RetrieveLastMatchKey.OleDbConnection = this.p.Conns["MATCH"];
            RetrieveLastMatchKey.SqlCommand = String.Format("SELECT DataSetID, MAX(MatchKey) as MaxMatchKey FROM {0} GROUP BY DataSetID", this.p.tableName("MATCH"));
            RetrieveLastMatchKey.SetCopyOverwriteCols("MaxMatchKey,MaxMatchKey");

            GenerateMatchKey = new EzRowNumber(this);
            GenerateMatchKey.Name = "Generate MatchKey";
            GenerateMatchKey.AttachTo(RetrieveLastMatchKey);

            InsertNewMatchKey = new EzDerivedColumn(this);
            InsertNewMatchKey.Name = "Insert New MatchKey";
            InsertNewMatchKey.AttachTo(GenerateMatchKey);
            InsertNewMatchKey.Expression["MatchKey"] = "ISNULL(MaxMatchKey) ==  TRUE  ? RowNumber : MaxMatchKey + RowNumber";
            Console.WriteLine("New Matchkey component created ...");

            MultiCast = new EzMultiCast(this);
            MultiCast.Name = "MultiCast";
            MultiCast.AttachTo(InsertNewMatchKey);

            InsertedDestination = new EzOleDbDestination(this);
            InsertedDestination.Name =String.Format("{0} - New Records",  this.p.tableName("STAGE"));
            InsertedDestination.AttachTo(MultiCast, 0, 0);
            InsertedDestination.Connection = p.Conns["Commercial_STG"];
            InsertedDestination.Table = p.tableName("STAGE");
            InsertedDestination.LinkAllInputsToOutputs();
            InsertedDestination.ReinitializeMetaData();

            MasterMatch = new EzOleDbDestination(this);
            MasterMatch.Name = this.p.tableName("MATCH");
            MasterMatch.AttachTo(MultiCast, 1, 0);
            MasterMatch.Connection = p.Conns["MATCH"];
            MasterMatch.ReinitializeMetaData();
            MasterMatch.Table = this.p.tableName("MATCH");
            MasterMatch.LinkAllInputsToOutputs();

            Console.WriteLine("Mastermatch Destination created ...");
        }
 public EzDerivedColumn AddAuditColumns(EzComponent attacher)
 {
     EzDerivedColumn component = new EzDerivedColumn(this);
     component.AttachTo(attacher);
     component.Name = "Add Audit Columns";
     component.Expression["CreatedDate"] = "GETDATE()";
     component.Expression["ActiveFlag"] = "(DT_STR,1,1252)\"Y\"";
     return component;
 }
        public DimDataFlow(EzContainer parent, PACKAGE_DIM p, SOURCEOBJECT so)
            : base(parent)
        {
            this.p = p;
            this.so = so;

            EzOleDbSource Source = new EzOleDbSource(this);
            Source.Connection = p.Conns["Source"];
             Source.SqlCommand = String.Format("select * from {0} where ActiveFlag = 'Y' and CreatedDate > '01-01-1900'", so.DATAOBJECT.tableName("PSA"));
            Source.Name = so.DATAOBJECT.tableName("PSA");

            EzDerivedColumn DeriveAttributes = new EzDerivedColumn(this);
            DeriveAttributes.AttachTo(Source);
            DeriveAttributes.Name = "Derive Attributes";
            //TODO for each mapping column add attribute expression
            foreach (MAPPINGCOLUMN mappingColumn in so.MAPPINGCOLUMNS) {
                if (mappingColumn.ATTRIBUTE == null) {
                    mappingColumn.ATTRIBUTE = mappingColumn.DATACOLUMN;
                }
                //TODO based on attribute type determine what sort of SSIS-ifying the data column needs
               DeriveAttributes.Expression[mappingColumn.ATTRIBUTE] = "(DT_STR,150,1252)\"" + mappingColumn.DATACOLUMN + "\"";
            }

            EzConditionalSplit ActionCode = new EzConditionalSplit(this);
            ActionCode.AttachTo(DeriveAttributes);
            ActionCode.Condition["case1"] = "ActionCode == 'UPDATE'";
            ActionCode.Condition["case2"] = "ActionCode == 'INSERT'";

            EzRowCount RowsMatched = new EzRowCount(this);
            RowsMatched.Name = "Rows Matched";
            RowsMatched.VariableName = "Audit::RowsMatched";
            RowsMatched.AttachTo(ActionCode, 0, 0);

            //TODO correct ole db command query, parameter mapping
            EzOleDbCommand UpdateDimension = new EzOleDbCommand(this);
            UpdateDimension.AttachTo(RowsMatched);

            EzRowCount RowsInserted = new EzRowCount(this);
            RowsInserted.Name = "Rows Inserted";
            RowsInserted.VariableName = "Audit::RowsInserted";
            RowsInserted.AttachTo(ActionCode, 1, 0);

            EzOleDbDestination InsertedDestination = new EzOleDbDestination(this);
            InsertedDestination.Name =String.Format("{0} - New Records",  this.p.tableName());
            InsertedDestination.AttachTo(RowsInserted);
            InsertedDestination.Connection = p.Conns["DIM"];
            InsertedDestination.Table = p.tableName();
            InsertedDestination.LinkAllInputsToOutputs();
            InsertedDestination.ReinitializeMetaData();
        }