Esempio n. 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);
        }
Esempio n. 2
0
        private void UpdateConsolidationDetailTables(Entity entity, Table stagingTable, ConsolidationEntry consolidationConfig)
        {
            string qualifiedConsolidationDetailTableName = GetQualifiedTableName(EntityUtils.ToConsolidationDetailTableName(entity));

            int numChanges;

            if (consolidationConfig.None)
            {
                var sql = $"delete from {qualifiedConsolidationDetailTableName}";
                numChanges = DatabaseUtils.ExecuteSql(ConnectionString, sql, TimeoutSecs);
            }
            else
            {
                string qualifiedStagingTableName =
                    DatabaseUtils.GetQualifiedTableName(StagingSchema.PrimaryStagingSchemaName, stagingTable.Name);

                string qualifiedConsolidationTableName = GetQualifiedTableName(EntityUtils.ToConsolidationTableName(entity));

                string qualifiedFederationTableName = GetQualifiedTableName(EntityUtils.ToFederationTableName(entity));

                string entityIdColumnName = stagingTable.Columns[1].Name;

                // e.g.
                // MERGE FEDERATION.CONSOLIDATION_DETAIL.DEPT cd
                // USING (select c.consolidation_id, f.ctds_id
                // from STAGEA.DEPT r
                // inner join FEDERATION.CONSOLIDATION_DEPT c
                // on c.natural_key = r.name
                // inner join FEDERATION.DEPT f
                // on f.src_timetable_id = r.src_timetable_id
                // and f.item_id = r.dept_id) tmpTable
                // on cd.consolidation_id = tmpTable.consolidation_id and cd.ctds_id = tmpTable.ctds_id
                // when NOT MATCHED BY TARGET THEN
                //   insert (consolidation_id, ctds_id)
                //   values (tmpTable.consolidation_id, tmpTable.ctds_id)
                // when NOT MATCHED BY SOURCE THEN
                //   DELETE;
                var sql = new SqlBuilder();

                sql.AppendFormat("MERGE {0} cd", qualifiedConsolidationDetailTableName);
                sql.AppendFormat("USING (select c.{0}, f.{1}", ConsolidationIdColName, MasterIdColName);
                sql.AppendFormat("from {0} r", qualifiedStagingTableName);
                sql.AppendFormat("inner join {0} c", qualifiedConsolidationTableName);
                sql.AppendFormat("on c.{0} = r.{1}", NaturalKeyColName, consolidationConfig.Column);
                sql.AppendFormat("inner join {0} f", qualifiedFederationTableName);
                sql.AppendFormat("on f.{0} = r.{0}", ColumnConstants.SrcTimetableIdColumnName);
                sql.AppendFormat("and f.{0} = r.{1}) tmpTable", ItemIdCol, entityIdColumnName);
                sql.AppendFormat("on cd.{0} = tmpTable.{0} and cd.{1} = tmpTable.{1}", ConsolidationIdColName, MasterIdColName);
                sql.Append("when NOT MATCHED BY TARGET THEN");
                sql.AppendFormat("insert ({0}, {1})", ConsolidationIdColName, MasterIdColName);
                sql.AppendFormat("values (tmpTable.{0}, tmpTable.{1})", ConsolidationIdColName, MasterIdColName);
                sql.Append("when NOT MATCHED BY SOURCE THEN");
                sql.Append("DELETE;");

                numChanges = DatabaseUtils.ExecuteSql(ConnectionString, sql.ToString(), TimeoutSecs);
            }

            _log.DebugFormat("{0} changes to consolidation detail table {1}", numChanges, qualifiedConsolidationDetailTableName);
        }
Esempio n. 3
0
 public void UpdateConsolidationTables(Entity entity, Table stagingTable, ConsolidationEntry consolidationConfig)
 {
     UpdateConsolidationMasterTables(entity, stagingTable, consolidationConfig);
     UpdateConsolidationDetailTables(entity, stagingTable, consolidationConfig);
 }