/// <summary> /// Gets DatalinkTable containing a flattened set of columns. /// </summary> /// <returns></returns> public DexihDatalinkTable GetOutputTable() { var outputTables = GetOutputColumns(); var dbTable = new DexihDatalinkTable { Name = Name }; //flatten the datalink outputs into one table, removing any duplicate names. var columns = new Dictionary <string, DexihDatalinkColumn>(); foreach (var t in outputTables.Where(c => c != null)) { foreach (var c in t.DexihDatalinkColumns) { if (!columns.ContainsKey(c.Name)) { columns.Add(c.Name, c); } } } dbTable.DexihDatalinkColumns = columns.Values; return(dbTable); }
/// <summary> /// Gets the output columns (including join/passthrough columns for a transform). /// If the datalinkTransform is null, this will be output columns for the datalink. /// </summary> /// <param name="datalinkTransform"></param> /// <returns></returns> public List <DexihDatalinkTable> GetOutputColumns(DexihDatalinkTransform datalinkTransform = null) { // if there is no datalinkTransform set, assume we are looking at the last transform. int position; if (datalinkTransform != null) { position = datalinkTransform.Position; } else { position = int.MaxValue; } // get a reverse sorted list of transforms prior to the current one. var transforms = DexihDatalinkTransforms .Where(t => t.Position < position) .OrderByDescending(p => p.Position).ToArray(); var inputTables = new List <DexihDatalinkTable>(); if (transforms.Any()) { var transform = transforms[0]; if (transform.PassThroughColumns) { inputTables = GetOutputColumns(transform); } var newMappingsTable = inputTables.SingleOrDefault(c => c.IsValid && c.SourceTableKey == -987654321); if (newMappingsTable == null) { // create a temporary table to use for any mapped columns in previous transforms. newMappingsTable = new DexihDatalinkTable { SourceTableKey = -987654321, Name = "Mappings Outputs", DexihDatalinkColumns = new List <DexihDatalinkColumn>() }; inputTables.Insert(0, newMappingsTable); } // add any columns in the transform table that are not already included. foreach (var column in transform.GetOutputColumns()) { newMappingsTable.DexihDatalinkColumns.Add(column); } // if the transform is a join, then add the join table columns if (transform.TransformType == ETransformType.Join) { inputTables.Add(transform.JoinDatalinkTable); } // if the transform is a concatenate, then merge common column names together. if (transform.TransformType == ETransformType.Concatenate) { var joinTable = transform.JoinDatalinkTable; var concatTable = new DexihDatalinkTable { Name = "Concatenated Table", DexihDatalinkColumns = new List <DexihDatalinkColumn>() }; foreach (var table in inputTables) { foreach (var column in table.DexihDatalinkColumns) { if (!concatTable.DexihDatalinkColumns.Any(c => c.IsValid && c.Name == column.Name)) { concatTable.DexihDatalinkColumns.Add(column); } } } foreach (var column in joinTable.DexihDatalinkColumns) { if (!concatTable.DexihDatalinkColumns.Any(c => c.IsValid && c.Name == column.Name)) { concatTable.DexihDatalinkColumns.Add(column); } } inputTables = new List <DexihDatalinkTable>() { concatTable }; } } else { inputTables = new List <DexihDatalinkTable>() { SourceDatalinkTable }; } return(inputTables); }