Example #1
0
        private ConsolidationParams ReadConsolidationConfig()
        {
            var result = new ConsolidationParams();

            var sql = $"select entity_type, column_name from {GetQualifiedTableName(ConsolidationConfig)}";

            DatabaseUtils.EnumerateResults(ConnectionString, sql, TimeoutSecs, r =>
            {
                var e = EntityUtils.FromString((string)r["entity_type"]);

                if (EntityUtils.CanParticipateInConsolidation(e))
                {
                    string colName = (string)DatabaseUtils.SafeRead(r, "column_name", string.Empty);
                    if (!string.IsNullOrEmpty(colName))
                    {
                        var entry = new ConsolidationEntry
                        {
                            Entity = e.ToString(),
                            Column = colName
                        };

                        result.Entries.Add(entry);
                    }
                }
            });

            result.Enabled = result.Entries.Count > 0;

            return(result);
        }
 public ConsolidationTablesBuilder()
 {
     foreach (Entity e in Enum.GetValues(typeof(Entity)))
     {
         if (EntityUtils.CanParticipateInConsolidation(e))
         {
             string masterTableName = EntityUtils.ToConsolidationTableName(e);
             AddTable(new ConsolidationTable(masterTableName, PublicStagingSchema.StagingSchemaName));
             AddTable(new ConsolidationDetailTable(
                          EntityUtils.ToConsolidationDetailTableName(e),
                          masterTableName,
                          PublicStagingSchema.StagingSchemaName,
                          false));
         }
     }
 }
        private static void DoParallelProcessing(
            string connectionString,
            int timeoutSecs,
            int maxDegreeOfParallelism,
            ConsolidationParams consolidationParams,
            string stagingSchemaName)
        {
            List <Entity> entities = Enum.GetValues(typeof(Entity)).Cast <object>().Cast <Entity>().ToList();

            var pOptions = new ParallelOptions {
                MaxDegreeOfParallelism = maxDegreeOfParallelism
            };

            Parallel.ForEach(entities, pOptions, (e, loopState) =>
            {
                if (!loopState.IsExceptional && EntityUtils.CanParticipateInConsolidation(e))
                {
                    var entry = consolidationParams.Get(e);

                    if (!entry.None)
                    {
                        var qualifiedStagingTableName =
                            DatabaseUtils.GetQualifiedTableName(stagingSchemaName, EntityUtils.ToCtTableName(e));

                        var naturalKey = entry.Column;

                        var sql =
                            $"select count(1) from {qualifiedStagingTableName} where {naturalKey} is null or RTRIM(LTRIM({naturalKey})) = ''";

                        var count = Convert.ToInt32(DatabaseUtils.ExecuteScalar(connectionString, sql, timeoutSecs));
                        if (count > 0)
                        {
                            loopState.Stop();

                            var msg =
                                $"There are {count} rows in {qualifiedStagingTableName} with empty consolidation values (column='{naturalKey}')";

                            _log.Error(msg);

                            throw new ApplicationException(msg);
                        }
                    }
                }
            });
        }
Example #4
0
        private void DoParallelConsolidationProcessing(FederationSchema fs)
        {
            List <Entity> entities = Enum.GetValues(typeof(Entity)).Cast <object>().Cast <Entity>().ToList();

            var b = StagingTablesBuilder.Get(StagingSchema.PrimaryStagingSchemaName);

            var pOptions = new ParallelOptions {
                MaxDegreeOfParallelism = _configuration.MaxDegreeOfParallelism
            };

            Parallel.ForEach(entities, pOptions, (e, loopState) =>
            {
                if (!loopState.IsExceptional && EntityUtils.CanParticipateInConsolidation(e))
                {
                    var entry = _configuration.Consolidation.Get(e);
                    fs.UpdateConsolidationTables(e, b.GetTable(EntityUtils.ToCtTableName(e)), entry);
                }
            });
        }
        public ConsolidationTablesBuilder()
        {
            // create an instance of each table and add to the table builder...
            AddTable(new ConsolidationConfigTable());

            foreach (Entity e in Enum.GetValues(typeof(Entity)))
            {
                if (EntityUtils.CanParticipateInConsolidation(e))
                {
                    var masterTableName = EntityUtils.ToConsolidationTableName(e);

                    AddTable(new ConsolidationTable(masterTableName, FederationSchema.FederationSchemaName));
                    AddTable(new ConsolidationDetailTable(
                                 EntityUtils.ToConsolidationDetailTableName(e),
                                 masterTableName,
                                 FederationSchema.FederationSchemaName));
                }
            }
        }
        /// <summary>
        /// Checks that the column names specified in the configuration, consolidation
        /// section are valid for the given entity
        /// </summary>
        public static void CheckNaturalKeyColumnsInConfiguration(ConsolidationParams consolidationParams)
        {
            _log.Debug("Checking that consolidation key columns are valid in configuration");

            StagingTablesBuilder b = StagingTablesBuilder.Get(StagingSchema.PrimaryStagingSchemaName);

            if (consolidationParams.Enabled)
            {
                var entitiesUsed = new List <Entity>();

                foreach (Entity entity in Enum.GetValues(typeof(Entity)))
                {
                    if (EntityUtils.CanParticipateInConsolidation(entity))
                    {
                        if (entitiesUsed.Contains(entity))
                        {
                            throw new ApplicationException(string.Format("Entity declared more than once in consolidation configuration: {0}", entity));
                        }

                        entitiesUsed.Add(entity);

                        var entry = consolidationParams.Get(entity);
                        if (entry != null && !entry.None)
                        {
                            string stagingTableName = EntityUtils.ToCtTableName(entity);

                            var table = b.GetTable(stagingTableName);

                            if (!table.ColumnExists(entry.Column))
                            {
                                throw new ApplicationException(string.Format("The specified consolidation column ({0}) does not exist in the entity: {1}", entry.Column, entity));
                            }
                        }
                    }
                }
            }
        }
Example #7
0
        private void CheckConfigConsolidation()
        {
            foreach (var entry in _configuration.Consolidation.Entries)
            {
                try
                {
                    var e = EntityUtils.FromString(entry.Entity);

                    if (!EntityUtils.CanParticipateInConsolidation(e))
                    {
                        throw new ApplicationException(string.Format("Entity in configuration, consolidation section does not participate in consolidation: {0}", entry.Entity));
                    }

                    if (!entry.None && !EntityUtils.GetValidConsolidationColumns(e).Contains(entry.Column))
                    {
                        throw new ApplicationException(string.Format("Entity in configuration, consolidation section does not have specified column: {0} - {1}", entry.Entity, entry.Column));
                    }
                }
                catch (ArgumentException)
                {
                    throw new ApplicationException(string.Format("Could not identify entity in configuration, consolidation section: {0}", entry.Entity));
                }
            }
        }
Example #8
0
        private void WriteConsolidationConfig(ConsolidationParams c)
        {
            var qualifiedConfigTable = GetQualifiedTableName(ConsolidationConfig);

            var sql = $"delete from {qualifiedConfigTable}";

            DatabaseUtils.ExecuteSql(ConnectionString, sql, TimeoutSecs);

            if (c.Enabled)
            {
                foreach (var entry in c.Entries)
                {
                    var e = EntityUtils.FromString(entry.Entity);

                    if (EntityUtils.CanParticipateInConsolidation(e))
                    {
                        sql = $"insert into {qualifiedConfigTable} (entity_type, column_name) values (@E, @C)";

                        SqlParameter[] p = { new SqlParameter("@E", entry.Entity), new SqlParameter("@C", entry.Column) };
                        DatabaseUtils.ExecuteSql(ConnectionString, sql, TimeoutSecs, p);
                    }
                }
            }
        }
Example #9
0
        private void DeleteExtraneousStagingRows()
        {
            // delete extraneous consolidated rows from staging (in cases of consolidated items we want a max of 1 row for each)
            foreach (Entity et in Enum.GetValues(typeof(Entity)))
            {
                if (et != Entity.Unknown && EntityUtils.CanParticipateInConsolidation(et))
                {
                    string stagingTableName =
                        DatabaseUtils.GetQualifiedTableName(PublicStagingSchema.StagingSchemaName, EntityUtils.ToCtTableName(et));

                    string idFldName             = EntityUtils.GetIdFldName(et);
                    string consolidatedIdFldName = ConsolidationTypeUtils.GetConsolidatedFieldName(idFldName);

                    var bd = new BatchDelete(_connectionString, _timeoutSecs, stagingTableName, PublicStagingSchema.StagingId);

                    // e.g.
                    // select s.staging_id, s.consolidated_dept_id
                    // from STAGING.CT_DEPT s
                    // inner join
                    // (
                    // select consolidated_dept_id, count(1)
                    // from STAGING.CT_DEPT
                    // where history_status in ('I', 'U')
                    // group by consolidated_dept_id
                    // having count(1) > 1
                    // ) sc on s.consolidated_dept_id = sc.consolidated_dept_id
                    // where history_status in ('I', 'U')
                    // order by date_change desc

                    SqlBuilder sql = new SqlBuilder();
                    sql.AppendFormat("select s.{0}, s.{1}", PublicStagingSchema.StagingId, consolidatedIdFldName);
                    sql.AppendFormat("from {0} s", stagingTableName);
                    sql.Append("inner join");
                    sql.Append("(");
                    sql.AppendFormat("select {0}", consolidatedIdFldName);
                    sql.AppendFormat("from {0} sc", stagingTableName);
                    sql.AppendFormat(
                        "where {0} in ('{1}', '{2}')",
                        HistorySchema.HistoryStatusColumnName,
                        HistorySchema.HistoryStatusInsert,
                        HistorySchema.HistoryStatusUpdate);
                    sql.AppendFormat("group by {0}", consolidatedIdFldName);
                    sql.Append("having count(1) > 1");
                    sql.AppendFormat(") sc on s.{0} = sc.{0}", consolidatedIdFldName);
                    sql.AppendFormat(
                        "where {0} in ('{1}', '{2}')",
                        HistorySchema.HistoryStatusColumnName,
                        HistorySchema.HistoryStatusInsert,
                        HistorySchema.HistoryStatusUpdate);
                    sql.AppendFormat("order by date_change desc");

                    var consolidatedIds = new HashSet <long>();

                    DatabaseUtils.EnumerateResults(_connectionString, sql.ToString(), _timeoutSecs, r =>
                    {
                        long cId      = (long)DatabaseUtils.SafeRead(r, consolidatedIdFldName, 0);
                        int stagingId = (int)r[PublicStagingSchema.StagingId];

                        if (cId == 0)
                        {
                            throw new ApplicationException("Unexpected consolidated Id");
                        }

                        if (consolidatedIds.Contains(cId))
                        {
                            bd.Add(stagingId);
                        }
                        else
                        {
                            consolidatedIds.Add(cId);
                        }
                    });

                    bd.Execute();
                }
            }
        }