Beispiel #1
0
        private void populateSampleReconObjects()
        {
            sampleSources = new Sources();
            sampleRecons = new Recons();
            // Create sample objects to use to populate sample Sources and RRReports XML files
            // for user to use as basis for real recons.

            // Create RRSourcesSample.xml
            // Contains sample connection template, connection, and query objects in SampleRRSources
            // Sample Connection String Templates
            var sqlServerTemplate = new ConnectionStringTemplate();
            sqlServerTemplate.Name = "SQL Server";
            sqlServerTemplate.Template = "Provider=SQLNCLI11;Server=|ServerName|;Database=|DatabaseName|;Trusted_Connection=yes";
            var teradataTemplate = new ConnectionStringTemplate();
            teradataTemplate.Name = "Teradata";
            teradataTemplate.Template = "Data Source=|ServerName|;User ID=|User|;Password=|Password|;Session Mode=TERADATA;";
            var oracleTemplate = new ConnectionStringTemplate();
            oracleTemplate.Name = "Oracle";
            oracleTemplate.Template = "Provider=MSDAORA.1;Data Source=|TNSName|;User Id=|User|;Password=|Password|;Persist Security Info=false;";
            sampleSources.ConnStringTemplates.Add(sqlServerTemplate);
            sampleSources.ConnStringTemplates.Add(teradataTemplate);
            sampleSources.ConnStringTemplates.Add(oracleTemplate);

            // Sample Connection Strings
            var warehouseConnectionString = new RRConnectionString();
            warehouseConnectionString.Name = "DataWarehouse Dev";
            warehouseConnectionString.TemplateName = "SQL Server";
            warehouseConnectionString.DatabaseType = DatabaseType.SQLServer;
            warehouseConnectionString.TemplateVariables = new List<Variable>
            {
                new Variable {SubName="ServerName", SubValue="bos-dbdevwh02"},
                new Variable {SubName="DatabaseName", SubValue="DataWarehouse" }
            };
            var dalUatConnectionString = new RRConnectionString();
            dalUatConnectionString.Name = "Teradata UAT";
            dalUatConnectionString.TemplateName = "Teradata";
            dalUatConnectionString.DatabaseType = DatabaseType.Teradata;
            dalUatConnectionString.TemplateVariables = new List<Variable>
            {
                new Variable {SubName="ServerName", SubValue="tddevbos"},
                new Variable {SubName="User", SubValue="DAL_READ"},
                new Variable {SubName="Password", SubValue="DAL_READ"}
            };

            var edmUatConnectionString = new RRConnectionString();
            edmUatConnectionString.Name = "EDM UAT";
            edmUatConnectionString.TemplateName = "Oracle";
            edmUatConnectionString.DatabaseType = DatabaseType.Oracle;
            edmUatConnectionString.TemplateVariables = new List<Variable>
            {
                new Variable {SubName="TNSName", SubValue="EDM_T"},
                new Variable {SubName="User", SubValue="edm_read"},
                new Variable {SubName="Password", SubValue="edm_read"}
            };
            sampleSources.ConnectionStrings.Add(dalUatConnectionString);
            sampleSources.ConnectionStrings.Add(edmUatConnectionString);
            sampleSources.ConnectionStrings.Add(warehouseConnectionString);

            // Sample Queries
            var doc = new XmlDocument();
            var portGicsSectorDetail = new RRQuery();
            portGicsSectorDetail.Name = "PortGicsSectorDetails";
            portGicsSectorDetail.ConnStringName = "DataWarehouse Dev";
            portGicsSectorDetail.SQL = doc.CreateCDataSection(@"with latestAttrInsEffDate as
                                                            (
                                                                select
                                                                    atins_id,
                                                                    max(effect_date) LatestRowDate
                                                                from warehouse.attr_instrument
                                                                where effect_date <= '|DateWanted|'
                                                                group by atins_id
                                                            ),
                                                            latestAttrIns as
                                                            (
                                                                select
                                                                    laied.atins_id,
                                                                    laied.LatestRowDate,
                                                                    max(ai.atins_release_number) LatestReleaseNumber
                                                                from latestAttrInsEffDate laied
                                                                join warehouse.attr_instrument ai
                                                                on laied.atins_id = ai.atins_id
                                                                and laied.LatestRowDate = ai.effect_date
                                                                group by laied.atins_id, laied.LatestRowDate)
                                                            select
                                                                bigs.atptf_id,
                                                                p.portf_name,
                                                                bigs.calcul_date,
                                                                bigs.atins_id,
                                                                ai.atins_name,
                                                                ai.effect_date,
                                                                ai.end_valid_date,
                                                                ai.atins_release_number
                                                            from warehouse.bisamattributions_gics_sec bigs
                                                            join warehouse.portfolio p
                                                            on  bigs.atptf_id = |PortId|
                                                            and bigs.atins_id <> 0
                                                            and bigs.calcul_date = '|DateWanted|'
                                                            and bigs.dateinactive = '31-dec-9999'
                                                            and bigs.atptf_id = p.portf_id
                                                            join latestAttrIns lai
                                                            on bigs.atins_id = lai.atins_id
                                                            and bigs.atins_release_number = lai.LatestReleaseNumber
                                                            join warehouse.attr_instrument ai
                                                            on lai.atins_id = ai.atins_id
                                                            and lai.LatestRowDate = ai.effect_date
                                                            and lai.LatestReleaseNumber = ai.ATINS_RELEASE_NUMBER
                                                            order by atins_name");
            var portAttribGroupcheck = new RRQuery();
            portAttribGroupcheck.Name = "PortAttribGroupCheck";
            portAttribGroupcheck.ConnStringName = "DataWarehouse Dev";
            portAttribGroupcheck.SQL = doc.CreateCDataSection(@"with portAttributionsRuns as (
                                                            select
                                                                max(checksum(atptf_id, atins_id, atins_release_number, calcul_date, frequency_id, begin_date, portf_config_id)) portAttribRunKey,
                                                                atptf_id,
                                                                atins_id,
                                                                atins_release_number,
                                                                calcul_date,
                                                                frequency_id,
                                                                begin_date,
                                                                portf_config_id,
                                                                user_defined_group_id
                                                            from warehouse.bisamAttributions_|SegmentTableName| bigs
                                                            where atptf_id = |PortId| and atins_id <> 0 and dateinactive = '31-dec-9999'
                                                            group by atptf_id, atins_id, atins_release_number, calcul_date, frequency_id, begin_date, portf_config_id, user_defined_group_id),
                                                        portMultiGroupCount as (
                                                            select
                                                                portAttribRunkey,
                                                                atptf_id,
                                                                atins_id,
                                                                atins_release_number,
                                                                calcul_date,
                                                                frequency_id,
                                                                begin_date,
                                                                portf_config_id
                                                            from portAttributionsRuns
                                                            group by portAttribRunKey, atptf_id, atins_id, atins_release_number, calcul_date, frequency_id, begin_date, portf_config_id
                                                            having count(*) > 1
                                                        )
                                                        select par.*, p.portf_name
                                                        from portAttributionsRuns par
                                                        join portMultiGroupCount pmgc
                                                        on par.portAttribRunKey = pmgc.portAttribRunKey
                                                        join warehouse.portfolio p
                                                        on par.atptf_id = p.portf_id
                                                        order by par.atins_id, par.atins_release_number, par.calcul_date, par.FREQUENCY_ID, par.begin_date, user_defined_group_id");
            var edmQuery = new RRQuery();
            edmQuery.Name = "EdmProductDayPositions";
            edmQuery.ConnStringName = "EDM UAT";
            edmQuery.SQL = doc.CreateCDataSection("select fm.snapshot_id, trim(fm.entity_id) entity_id, pd.security_alias, trim(pd.long_short_indicator) long_short_indicator, pd.market_value_base, pd.market_value_local from datamartdbo.fund_master fm join datamartdbo.position_details pd on fm.entity_id = '|ProductId|' and fm.effective_date = '|EdmDateWanted|' and fm.dmart_fund_id = pd.dmart_fund_id");
            var teraQuery = new RRQuery();
            teraQuery.Name = "DalProductDayPositions";
            teraQuery.ConnStringName = "Teradata UAT";
            teraQuery.SQL = doc.CreateCDataSection("select fp.snapshotid, dp.productid, dp.entitylongname, fp.OrigSecurityId, fp.LongShortIndicator, fp.marketvaluebase, fp.marketvaluelocal from dimproduct dp join factposition fp on dp.productid = '|ProductId|' and dp.dimproductid = fp.dimproductid and fp.dimtimeid = |DalDateWanted|");
            var posFkQuery = new RRQuery();
            posFkQuery.Name = "DalPositionsMissingFk";
            posFkQuery.ConnStringName = "Teradata UAT";
            posFkQuery.SQL = doc.CreateCDataSection("select * from (select dimtimeid,  case when dimsecurityid = 'UNKNOWN' and dimproductid = 'UNKNOWN' then 'BOTH' when dimsecurityid = 'UNKNOWN' then 'SECURITY' else 'PRODUCT' end MissingEntity, case when dimsecurityid = 'UNKNOWN' and dimproductid = 'UNKNOWN' then 'Security ID: ' || OrigSecurityId || '; Product ID: ' || OrigProductId when dimsecurityid = 'UNKNOWN' then OrigSecurityId else OrigProductId end MissingEntityId from factposition where (dimsecurityid = 'UNKNOWN' or dimproductid = 'UNKNOWN') and dimtimeid >= 1131101) data group by MissingEntity, MissingEntityId, DimTimeId order by MissingEntity, MissingEntityId, DimTimeId");
            sampleSources.Queries.Add(portGicsSectorDetail);
            sampleSources.Queries.Add(portAttribGroupcheck);
            sampleSources.Queries.Add(edmQuery);
            sampleSources.Queries.Add(teraQuery);
            sampleSources.Queries.Add(posFkQuery);

            // Create RRReportsSample.xml
            // Holds sample recon report definitions along with substitution values to use
            // in sample queries.
            // first recon report and write to file to create file to use as basis to create
            // full XML file specifying all the recon reports to run.

            // First two recons are examples of comparing two data sets
            // Acadian-specific example (Note: the actual example is not necessarily useful,
            // it's just being done to show how the process works)
            // This recon uses the same query twice, so the query variables are query specific
            ReconReport warehousePortGicsRecon = new ReconReport();
            warehousePortGicsRecon.Name = "Compare GICS Sec Details for 2 days for 1 portfolio";
            warehousePortGicsRecon.TabLabel = "GICS Sec Changes";
            warehousePortGicsRecon.FirstQueryName = "PortGicsSectorDetails";
            warehousePortGicsRecon.SecondQueryName = "PortGicsSectorDetails";

            QueryColumn portfolioId = new QueryColumn();
            portfolioId.Label = "Portfolio ID";
            portfolioId.Type = ColumnType.number;
            portfolioId.IdentifyingColumn = true;
            portfolioId.AlwaysDisplay = true;
            portfolioId.FirstQueryColName = "atptf_id";
            portfolioId.SecondQueryColName = "atptf_id";

            QueryColumn portfolioName = new QueryColumn();
            portfolioName.Label = "Portfolio Name";
            portfolioName.Type = ColumnType.text;
            portfolioName.IdentifyingColumn = false;
            portfolioName.AlwaysDisplay = true;
            portfolioName.FirstQueryColName = "portf_name";
            portfolioName.SecondQueryColName = "portf_name";

            QueryColumn calcDate = new QueryColumn();
            calcDate.Label = "Calcul Date";
            calcDate.Type = ColumnType.date;
            calcDate.IdentifyingColumn = false;
            calcDate.AlwaysDisplay = true;
            calcDate.FirstQueryColName = "calcul_date";
            calcDate.SecondQueryColName = "calcul_date";

            QueryColumn instrumentId = new QueryColumn();
            instrumentId.Label = "Instrument Id";
            instrumentId.Type = ColumnType.number;
            instrumentId.IdentifyingColumn = true;
            instrumentId.AlwaysDisplay = true;
            instrumentId.FirstQueryColName = "atins_id";
            instrumentId.SecondQueryColName = "atins_id";

            QueryColumn instrumentName = new QueryColumn();
            instrumentName.Label = "Instrument Name";
            instrumentName.Type = ColumnType.text;
            instrumentName.IdentifyingColumn = false;
            instrumentName.AlwaysDisplay = true;
            instrumentName.FirstQueryColName = "atins_name";
            instrumentName.SecondQueryColName = "atins_name";

            QueryColumn instrumentReleaseNum = new QueryColumn();
            instrumentReleaseNum.Label = "Release #";
            instrumentReleaseNum.Type = ColumnType.number;
            instrumentReleaseNum.IdentifyingColumn = false;
            instrumentReleaseNum.AlwaysDisplay = false;
            instrumentReleaseNum.CheckDataMatch = true;
            instrumentReleaseNum.Tolerance = 1;
            instrumentReleaseNum.FirstQueryColName = "atins_release_number";
            instrumentReleaseNum.SecondQueryColName = "atins_release_number";

            warehousePortGicsRecon.Columns.Add(portfolioId);
            warehousePortGicsRecon.Columns.Add(portfolioName);
            warehousePortGicsRecon.Columns.Add(calcDate);
            warehousePortGicsRecon.Columns.Add(instrumentId);
            warehousePortGicsRecon.Columns.Add(instrumentName);
            warehousePortGicsRecon.Columns.Add(instrumentReleaseNum);

            warehousePortGicsRecon.QueryVariables = new List<QueryVariable>
            {
                new QueryVariable { SubName = "PortId", SubValue = "1003022", QuerySpecific=false },
                new QueryVariable { SubName = "DateWanted", SubValue = "30-jul-2015", QuerySpecific=true, QueryNumber=1 },
                new QueryVariable { SubName = "DateWanted", SubValue = "31-jul-2015",QuerySpecific=true, QueryNumber=2 }
            };

            ReconReport instMultGroupsRecon = new ReconReport();
            instMultGroupsRecon.Name = "Instruments with Multiple Attribution Groups for Similar Runs";
            instMultGroupsRecon.TabLabel = "Multi-group Inst";
            instMultGroupsRecon.FirstQueryName = "PortAttribGroupCheck";
            instMultGroupsRecon.SecondQueryName = string.Empty;

            portfolioId = new QueryColumn();
            portfolioId.Label = "Portfolio ID";
            portfolioId.Type = ColumnType.number;
            portfolioId.AlwaysDisplay = true;
            portfolioId.FirstQueryColName = "atptf_id";

            portfolioName = new QueryColumn();
            portfolioName.Label = "Portfolio Name";
            portfolioName.Type = ColumnType.text;
            portfolioName.AlwaysDisplay = true;
            portfolioName.FirstQueryColName = "portf_name";

            instrumentId = new QueryColumn();
            instrumentId.Label = "Instrument Id";
            instrumentId.Type = ColumnType.number;
            instrumentId.AlwaysDisplay = true;
            instrumentId.FirstQueryColName = "atins_id";

            instrumentReleaseNum = new QueryColumn();
            instrumentReleaseNum.Label = "Release #";
            instrumentReleaseNum.Type = ColumnType.number;
            instrumentReleaseNum.AlwaysDisplay = true;
            instrumentReleaseNum.FirstQueryColName = "atins_release_number";

            calcDate = new QueryColumn();
            calcDate.Label = "Calcul Date";
            calcDate.Type = ColumnType.date;
            calcDate.AlwaysDisplay = true;
            calcDate.FirstQueryColName = "calcul_date";

            var frequencyId = new QueryColumn();
            frequencyId.Label = "Freq";
            frequencyId.Type = ColumnType.number;
            frequencyId.AlwaysDisplay = true;
            frequencyId.FirstQueryColName = "frequency_id";

            var beginDate = new QueryColumn();
            beginDate.Label = "Begin Date";
            beginDate.Type = ColumnType.date;
            beginDate.AlwaysDisplay = true;
            beginDate.FirstQueryColName = "begin_date";

            var portfConfigId = new QueryColumn();
            portfConfigId.Label = "Config Id";
            portfConfigId.Type = ColumnType.number;
            portfConfigId.AlwaysDisplay = true;
            portfConfigId.FirstQueryColName = "portf_config_id";

            var udGroupId = new QueryColumn();
            udGroupId.Label = "Group Id";
            udGroupId.Type = ColumnType.number;
            udGroupId.AlwaysDisplay = true;
            udGroupId.FirstQueryColName = "user_defined_group_id";

            instMultGroupsRecon.Columns.Add(portfolioId);
            instMultGroupsRecon.Columns.Add(portfolioName);
            instMultGroupsRecon.Columns.Add(instrumentId);
            instMultGroupsRecon.Columns.Add(instrumentReleaseNum);
            instMultGroupsRecon.Columns.Add(calcDate);
            instMultGroupsRecon.Columns.Add(frequencyId);
            instMultGroupsRecon.Columns.Add(beginDate);
            instMultGroupsRecon.Columns.Add(portfConfigId);
            instMultGroupsRecon.Columns.Add(udGroupId);

            instMultGroupsRecon.QueryVariables = new List<QueryVariable>
            {
                new QueryVariable { SubName = "PortId", SubValue = "1003022" },
                new QueryVariable { SubName = "SegmentTableName", SubValue = "GICS_Sec" }
            };

            sampleRecons.ReconReports.Add(warehousePortGicsRecon);
            sampleRecons.ReconReports.Add(instMultGroupsRecon);

            /*
            // Note that queries running on two separate platforms may still be compared
            ReconReport edmDalPortDayPositionRecon = new ReconReport();
            edmDalPortDayPositionRecon.Name = "EDM to DAL Product's Positions for Day";
            edmDalPortDayPositionRecon.TabLabel = "EDM DAL Prod Pos";
            edmDalPortDayPositionRecon.FirstQueryName = "EdmProductDayPositions";
            edmDalPortDayPositionRecon.SecondQueryName = "DalProductDayPositions";

            QueryColumn productId = new QueryColumn();
            productId.Label = "Product ID";
            productId.Type = ColumnType.text;
            productId.IdentifyingColumn = true;
            productId.AlwaysDisplay = true;
            productId.FirstQueryColName = "entity_id";
            productId.SecondQueryColName = "productid";

            QueryColumn fundName = new QueryColumn();
            fundName.Label = "Product Name";
            fundName.Type = ColumnType.text;
            fundName.AlwaysDisplay = true;
            fundName.FirstQueryColName = null;
            fundName.SecondQueryColName = "EntityLongName";

            QueryColumn snapshotId = new QueryColumn();
            snapshotId.Label = "Snapshot";
            snapshotId.Type = ColumnType.text;
            snapshotId.AlwaysDisplay = true;
            snapshotId.IdentifyingColumn = true;
            snapshotId.FirstQueryColName = "snapshot_id";
            snapshotId.SecondQueryColName = "snapshotid";

            QueryColumn securityId = new QueryColumn();
            securityId.Label = "Security ID";
            securityId.Type = ColumnType.number;
            securityId.IdentifyingColumn = true;
            securityId.AlwaysDisplay = true;
            securityId.FirstQueryColName = "security_alias";
            securityId.SecondQueryColName = "OrigSecurityId";

            QueryColumn longShortIndicator = new QueryColumn();
            longShortIndicator.Label = "Long-Short Indicator";
            longShortIndicator.Type = ColumnType.text;
            longShortIndicator.AlwaysDisplay = true;
            longShortIndicator.IdentifyingColumn = true;
            longShortIndicator.FirstQueryColName = "long_short_indicator";
            longShortIndicator.SecondQueryColName = "LongShortIndicator";

            QueryColumn marketValueBase = new QueryColumn();
            marketValueBase.Label = "Market Value Base";
            marketValueBase.Type = ColumnType.number;
            marketValueBase.CheckDataMatch = true;
            marketValueBase.FirstQueryColName = "market_value_base";
            marketValueBase.SecondQueryColName = "marketvaluebase";
            marketValueBase.Tolerance = 0;

            QueryColumn marketValueLocal = new QueryColumn();
            marketValueLocal.Label = "Market Value Local";
            marketValueLocal.Type = ColumnType.number;
            marketValueLocal.CheckDataMatch = true;
            marketValueLocal.FirstQueryColName = "market_value_local";
            marketValueLocal.SecondQueryColName = "marketvaluelocal";
            marketValueLocal.Tolerance = 0;

            edmDalPortDayPositionRecon.Columns.Add(productId);
            edmDalPortDayPositionRecon.Columns.Add(fundName);
            edmDalPortDayPositionRecon.Columns.Add(snapshotId);
            edmDalPortDayPositionRecon.Columns.Add(securityId);
            edmDalPortDayPositionRecon.Columns.Add(longShortIndicator);
            edmDalPortDayPositionRecon.Columns.Add(marketValueBase);
            edmDalPortDayPositionRecon.Columns.Add(marketValueLocal);

            edmDalPortDayPositionRecon.QueryVariables = new List<QueryVariable>
            {
                new QueryVariable { SubName = "ProductId", SubValue = "EEUB", QuerySpecific=false },
                new QueryVariable { SubName = "EdmDateWanted", SubValue = "01-jul-2014", QuerySpecific=false },
                new QueryVariable { SubName = "DalDateWanted", SubValue = "1140701",QuerySpecific=false }
            };
            sampleRecons.ReconReports.Add(edmDalPortDayPositionRecon);

            // This recon is an example of a recon with just one query, and any rows returned are assumed to
            // indicate an issue and will be reported
            ReconReport positionsMissingFkRecon = new ReconReport();
            positionsMissingFkRecon.Name = "Positions With Unknown Security or Product";
            positionsMissingFkRecon.TabLabel = "Pos Missing FK";
            positionsMissingFkRecon.FirstQueryName = "DalPositionsMissingFk";
            positionsMissingFkRecon.SecondQueryName = string.Empty;

            var dimTimeId = new QueryColumn();
            dimTimeId.Label = "Date";
            dimTimeId.Type = ColumnType.date;
            dimTimeId.FirstQueryColName = "dimtimeid";

            var missingEntity = new QueryColumn();
            missingEntity.Label = "Missing";
            missingEntity.Type = ColumnType.text;
            missingEntity.FirstQueryColName = "MissingEntity";

            var originalEntityId = new QueryColumn();
            originalEntityId.Label = "Entity Id(s)";
            originalEntityId.Type = ColumnType.text;
            originalEntityId.FirstQueryColName = "MissingEntityId";

            positionsMissingFkRecon.Columns.Add(dimTimeId);
            positionsMissingFkRecon.Columns.Add(missingEntity);
            positionsMissingFkRecon.Columns.Add(originalEntityId);

            sampleRecons.ReconReports.Add(positionsMissingFkRecon);
            */
        }
Beispiel #2
0
        /// <summary>
        /// Will return true if the two values match.
        /// </summary>
        /// <param name="value1"></param>
        /// <param name="value2"></param>
        /// <param name="column">The column these values are for</param>
        /// <returns></returns>
        private bool valuesMatch(object value1, object value2, QueryColumn column)
        {
            // If only one value is null, return false
            if ((value1 == System.DBNull.Value && value2 != System.DBNull.Value) || (value1 != System.DBNull.Value && value2 == System.DBNull.Value))
            {
                return false;
            }

            // If both values are null, return true
            if (value1 == System.DBNull.Value && value2 == System.DBNull.Value)
            {
                return true;
            }

            // Neither value is null, so compare them based on what type they should be
            // If either one fails to parse as the proper value type, then return false
            switch (column.Type)
            {
                case ColumnType.date:
                    DateTime q1DateTime;
                    DateTime q2DateTime;
                    if (!DateTime.TryParse(value1.ToString(), out q1DateTime) ||
                        !DateTime.TryParse(value2.ToString(), out q2DateTime))
                    {
                        return false;
                    }
                    if (q1DateTime == q2DateTime) {
                        return true;
                    }
                    break;
                case ColumnType.number:
                // Columns are considered a match if their difference is less than or equal to any tolerance threshold provided
                    decimal q1Decimal;
                    decimal q2Decimal;
                    if (!decimal.TryParse(value1.ToString(), out q1Decimal) ||
                        !decimal.TryParse(value2.ToString(), out q2Decimal))
                    {
                        return false;
                    }
                    if (q1Decimal == q2Decimal || (Math.Abs(q1Decimal - q2Decimal) <= column.Tolerance)) {
                        return true;
                    }
                    break;
                case ColumnType.text:
                    if (value1.ToString() == value2.ToString()) {
                        return true;
                    }
                    break;
            }
            return false;
        }
Beispiel #3
0
        private void populateSampleReconObjects()
        {
            // Create sample objects to use to populate sample RRSources and RRReports XML files
            // for user to use as basis for real recons.

            // Create RRSourcesSample.xml
            // Contains sample connection template, connection, and query objects in SampleRRSources

            // Sample Connection String Templates
            var teradataTemplate = new ConnectionStringTemplate();
            teradataTemplate.Name = "Teradata";
            teradataTemplate.Template = "Provider=TDOLEDB;Data Source=|ServerName|;Persist Security Info=True;User ID=|User|;Password=|Password|;Session Mode=TERA;";
            var oracleTemplate = new ConnectionStringTemplate();
            oracleTemplate.Name = "Oracle";
            oracleTemplate.Template = "Data Source=|TNSName|;User Id=|User|;Password=|Password|;Integrated Security=no;";
            var sampleTemplates = new ConnectionStringTemplates();
            sampleTemplates.TemplateList.Add(teradataTemplate);
            sampleTemplates.TemplateList.Add(oracleTemplate);

            // Sample Connection Strings
            var dalUatConnectionString = new RRConnectionString();
            dalUatConnectionString.Name = "Teradata UAT";
            dalUatConnectionString.Template = "Teradata";
            dalUatConnectionString.TemplateVariables = new List<Variable>{
                                                                                    new Variable {SubName="ServerName", SubValue="tddevbos"},
                                                                                    new Variable {SubName="User", SubValue="DAL_READ"},
                                                                                    new Variable {SubName="Password", SubValue="DAL_READ"}
                                                                              };

            var edmUatConnectionString = new RRConnectionString();
            edmUatConnectionString.Name = "EDM UAT";
            edmUatConnectionString.Template = "Oracle";
            edmUatConnectionString.TemplateVariables = new List<Variable>{
                                                                            new Variable {SubName="TNSName", SubValue="EDM_T"},
                                                                            new Variable {SubName="User", SubValue="edm_read"},
                                                                            new Variable {SubName="Password", SubValue="edm_read"}
                                                                         };
            var sampleConnStrings = new RRConnectionStrings();
            sampleConnStrings.RRConnStringList.Add(dalUatConnectionString);
            sampleConnStrings.RRConnStringList.Add(edmUatConnectionString);

            // Sample Queries
            var edmQuery = new RRQuery();
            edmQuery.Name = "EdmProductDayPositions";
            edmQuery.RRConnectionString = "EDM UAT";
            edmQuery.SQL = @"select fm.snapshot_id, fm.entity_id, pd.market_value_base, pd.market_value_local from datamartdbo.fund_master fm join datamartdbo.position_details pd on fm.entity_id = '|ProductId|' and fm.effective_date = '|EdmDateWanted|' and fm.dmart_fund_id = pd.dmart_fund_id;";
            var teraQuery = new RRQuery();
            teraQuery.Name = "DalProductDayPositions";
            teraQuery.RRConnectionString = "Teradata UAT";
            teraQuery.SQL = @"select fp.snapshotid, dp.productid, dp.entitylongname, fp.marketvaluebase, fp.marketvaluelocal from dimproduct dp join factposition fp on dp.productid = '|ProductId|' and dp.dimproductid = fp.dimproductid and fp.dimtimeid = |TeraDateWanted|;";
            var posFkQuery = new RRQuery();
            posFkQuery.Name = "DalPositionsMissingFk";
            posFkQuery.RRConnectionString = "Teradata UAT";
            posFkQuery.SQL = @"select * from (select dimtimeid,  case when dimsecurityid = 'UNKNOWN' and dimproductid = 'UNKNOWN' then 'BOTH' when dimsecurityid = 'UNKNOWN' then 'SECURITY' else 'PRODUCT' end MissingEntity, case when dimsecurityid = 'UNKNOWN' and dimproductid = 'UNKNOWN' then 'Security ID: '' || OrigSecurityId || ''; Product ID: '' || OrigProductId || '''  when dimsecurityid = 'UNKNOWN' then OrigSecurityId else OrigProductId end OriginalEntityId from factposition where (dimsecurityid = 'UNKNOWN' or dimproductid = 'UNKNOWN') and dimtimeid >= 1131101) data group by MissingEntity, OriginalEntityId, DimTimeId order by MissingEntity, OriginalEntityId, DimTimeId;";
            var sampleQueries = new Queries();
            sampleQueries.QueryList.Add(edmQuery);
            sampleQueries.QueryList.Add(teraQuery);
            sampleQueries.QueryList.Add(posFkQuery);

            sampleRRSources = new RRSources();
            sampleRRSources.ConnStringTemplates = sampleTemplates;
            sampleRRSources.ConnectionStrings = sampleConnStrings;
            sampleRRSources.Queries = sampleQueries;

            // Create RRReportsSample.xml
            // Holds sample recon report definitions along with substitution values to use
            // in sample queries.
            // first recon report and write to file to create file to use as basis to create
            // full XML file specifying all the recon reports to run.

            /* ****** RESUME TOMORROW: Add collection of VARIABLE values for queries.
             *        Adapt sample recon report to use new RRSources definitions as above
             *        Test creation of sample XML files. */

            // First recon is an example of comparing two data sets from different databases
            ReconReport edmDalPortDayPositionRecon = new ReconReport();
            edmDalPortDayPositionRecon.Name = "EDM to DAL Product's Positions for Day";
            edmDalPortDayPositionRecon.TabLabel = "EDM DAL Pros Pos";
            edmDalPortDayPositionRecon.FirstQuery = "EdmProductDayPositions";
            edmDalPortDayPositionRecon.SecondQuery = "DalProductDayPositions";

            QueryColumn productId = new QueryColumn();
            productId.Label = "Product ID";
            productId.Type = ColumnType.text;
            productId.IdentifyingColumn = true;
            productId.AlwaysDisplay = true;
            productId.FirstQueryName = "entity_id";
            productId.SecondQueryName = "productid";

            QueryColumn fundName = new QueryColumn();
            fundName.Label = "Product Name";
            fundName.Type = ColumnType.text;
            fundName.AlwaysDisplay = true;
            fundName.FirstQueryName = "EntityLongName";
            fundName.SecondQueryName = null;

            QueryColumn snapshotId = new QueryColumn();
            snapshotId.Label = "Snapshot";
            snapshotId.Type = ColumnType.text;
            snapshotId.AlwaysDisplay = true;
            snapshotId.IdentifyingColumn = true;
            snapshotId.FirstQueryName = "snapshot_id";
            snapshotId.SecondQueryName = "snapshotid";

            QueryColumn marketValueBase = new QueryColumn();
            marketValueBase.Label = "Market Value Base";
            marketValueBase.Type = ColumnType.number;
            marketValueBase.ShouldMatch = true;
            marketValueBase.FirstQueryName = "market_value_base";
            marketValueBase.SecondQueryName = "marketvaluebase";

            QueryColumn marketValueLocal = new QueryColumn();
            marketValueLocal.Label = "Market Value Local";
            marketValueLocal.Type = ColumnType.number;
            marketValueLocal.ShouldMatch = true;
            marketValueLocal.FirstQueryName = "market_value_local";
            marketValueLocal.SecondQueryName = "marketvaluelocal";

            edmDalPortDayPositionRecon.Columns.Add(productId);
            edmDalPortDayPositionRecon.Columns.Add(fundName);
            edmDalPortDayPositionRecon.Columns.Add(snapshotId);
            edmDalPortDayPositionRecon.Columns.Add(marketValueBase);
            edmDalPortDayPositionRecon.Columns.Add(marketValueLocal);

            edmDalPortDayPositionRecon.QueryVariables = new List<Variable> {
                                                                                new Variable { SubName = "ProductId", SubValue = "EEUB" },
                                                                                new Variable { SubName = "EdmDateWanted", SubValue = "01-jul-2014" },
                                                                                new Variable { SubName = "DalDateWanted", SubValue = "1140701" }                                                                          };
            sampleRecons.ReconList.Add(edmDalPortDayPositionRecon);

            // This second recon is an example of a recon with just one query, and any rows returned are assumed to
            // indicate an issue and will be reported
            ReconReport positionsMissingFkRecon = new ReconReport();
            positionsMissingFkRecon.Name = "Positions With Unknown Security or Product";
            positionsMissingFkRecon.TabLabel = "Pos Missing FK";
            positionsMissingFkRecon.FirstQuery = "DalPositionsMissingFk";
            positionsMissingFkRecon.SecondQuery = string.Empty;

            var dimTimeId = new QueryColumn();
            dimTimeId.Label = "Date";
            dimTimeId.Type = ColumnType.date;
            dimTimeId.AlwaysDisplay = true;
            dimTimeId.FirstQueryName = "dimtimeid";

            var date = new QueryColumn();
            date.Label = "Date";
            date.Type = ColumnType.date;
            date.AlwaysDisplay = true;
            date.FirstQueryName = "DimTimeId";

            var missingEntity = new QueryColumn();
            missingEntity.Label = "Missing";
            missingEntity.Type = ColumnType.text;
            missingEntity.AlwaysDisplay = true;
            missingEntity.FirstQueryName = "MissingEntity";

            var originalEntityId = new QueryColumn();
            originalEntityId.Label = "Entity Id";
            originalEntityId.Type = ColumnType.text;
            originalEntityId.AlwaysDisplay = true;
            originalEntityId.FirstQueryName = "OriginalEntityId";

            positionsMissingFkRecon.Columns.Add(dimTimeId);
            positionsMissingFkRecon.Columns.Add(missingEntity);
            positionsMissingFkRecon.Columns.Add(originalEntityId);

            // Don't add single query recon to sample file until supporting logic in controller added
            //sampleRecons.ReconList.Add(positionsMissingFkRecon);
        }