public static void ProcessSlowlyChangingDimensionTransformations(SymbolTable symbolTable) ////HashSet<AstEtlRootNode> astEtlRootNodes, HashSet<AstTaskNode> astTaskNodes) { var snapshotSymbolTable = new List <IReferenceableItem>(symbolTable); foreach (var astNamedNode in snapshotSymbolTable) { if (astNamedNode.FirstThisOrParent <ITemplate>() == null) { var destination = astNamedNode as AstDestinationNode; if (destination != null) { if (destination.Table.HasScdColumns && !destination.DisableScd) { Utility.Replace(destination, CreateScdWorkflowFragment(destination.Table, destination.ParentItem, destination.InputPath == null ? null : destination.InputPath.OutputPath)); } } var merge = astNamedNode as AstMergeTaskNode; if (merge != null) { var sourceTable = merge.TargetConstraint.ParentItem as AstTableNode; // TODO: Must we do anything special for the UpdateTargetTable attribute? if (sourceTable != null && sourceTable.HasScdColumns && !merge.DisableScd) { var targetTable = merge.TargetConstraint.ParentItem as AstTableNode; if (targetTable == null) { continue; } var scdMergeEtl = new AstEtlRootNode(merge.ParentItem) { Name = Utility.NameCleanerAndUniqifier(merge.Name + "_scdEtl") }; // TODO: Do we need to limit query to non-computed columns? var scdMergeSource = new AstQuerySourceNode(scdMergeEtl) { Connection = sourceTable.Connection, Name = Utility.NameCleanerAndUniqifier(merge.Name + "_scdEtlSource"), Query = new AstVariableParameterMappingQueryNode(null) { Body = TableLowerer.EmitSelectAllStatement(sourceTable) } }; scdMergeSource.Query.ParentItem = scdMergeSource; scdMergeEtl.Transformations.Add(scdMergeSource); foreach (var transformation in CreateScdWorkflowFragment(targetTable, scdMergeEtl, scdMergeSource.OutputPath)) { scdMergeEtl.Transformations.Add(transformation); } } } } } }
public static void LowerTransformations(AstEtlRootNode astDataflow, DataflowLoweringContext context) { var sortedTransformations = SortTransformations(astDataflow.Transformations); foreach (AstTransformationNode astTransformation in sortedTransformations) { PhysicalLoweringProcessor.Lower(astTransformation, context); } }
public DataflowTask(AstEtlRootNode astNode) : base(astNode) { }