コード例 #1
0
        /// <summary>
        /// Gets a single (deduplicated) list of all DatalinkColumns use by the datalink, and sets the instances to null
        /// </summary>
        /// <returns></returns>
        public Dictionary <long, DexihDatalinkColumn> GetAllDatalinkColumns()
        {
            var columns = new Dictionary <long, DexihDatalinkColumn>();

            if (SourceDatalinkTable != null)
            {
                foreach (var column in SourceDatalinkTable.DexihDatalinkColumns)
                {
                    AddColumns(column, columns);
                }
            }

            foreach (var datalinkTransform in DexihDatalinkTransforms.OrderBy(c => c.Position).Where(c => c.IsValid))
            {
                // track any join columns for the transform.
                if (datalinkTransform.JoinDatalinkTable != null)
                {
                    foreach (var column in datalinkTransform.JoinDatalinkTable.DexihDatalinkColumns)
                    {
                        AddColumns(column, columns);
                    }
                }

                datalinkTransform.NodeDatalinkColumnKey = datalinkTransform.NodeDatalinkColumn?.Key;
                AddColumns(datalinkTransform.NodeDatalinkColumn, columns);
                datalinkTransform.NodeDatalinkColumn = null;

                // for any source mappings for the transform, copy the tracked instance.
                foreach (var item in datalinkTransform.DexihDatalinkTransformItems)
                {
                    item.SourceDatalinkColumnKey = item.SourceDatalinkColumn?.Key;
                    AddColumns(item.SourceDatalinkColumn, columns);
                    item.SourceDatalinkColumn = null;

                    item.JoinDatalinkColumnKey = item.JoinDatalinkColumn?.Key;
                    AddColumns(item.JoinDatalinkColumn, columns);
                    item.JoinDatalinkColumn = null;

                    item.TargetDatalinkColumnKey = item.TargetDatalinkColumn?.Key;
                    AddColumns(item.TargetDatalinkColumn, columns);
                    item.TargetDatalinkColumn = null;

                    item.FilterDatalinkColumnKey = item.FilterDatalinkColumn?.Key;
                    AddColumns(item.FilterDatalinkColumn, columns);
                    item.FilterDatalinkColumn = null;

                    foreach (var param in item.DexihFunctionParameters)
                    {
                        param.DatalinkColumnKey = param.DatalinkColumn?.Key;
                        AddColumns(param.DatalinkColumn, columns);
                        param.DatalinkColumn = null;

                        foreach (var paramArray in param.ArrayParameters.Where(c => c.DatalinkColumn != null))
                        {
                            paramArray.DatalinkColumnKey = paramArray.DatalinkColumn?.Key;
                            AddColumns(paramArray.DatalinkColumn, columns);
                            paramArray.DatalinkColumn = null;
                        }
                    }
                }
            }

            foreach (var target in DexihDatalinkTargets)
            {
                if (target.NodeDatalinkColumn != null)
                {
                    target.NodeDatalinkColumnKey = target.NodeDatalinkColumn?.Key;
                    AddColumns(target.NodeDatalinkColumn, columns);
                    target.NodeDatalinkColumn = null;
                }
            }

            return(columns);
        }
コード例 #2
0
        /// <summary>
        /// Resets all DatalinkColumns with the same reference/instance.
        /// Sets all negative datalink columns keys to 0
        /// </summary>
        public void ResetDatalinkColumns(Dictionary <long, DexihDatalinkColumn> columns = null)
        {
            if (columns == null)
            {
                columns = GetAllDatalinkColumns();
            }

            var newColumns = new HashSet <DexihDatalinkColumn>();

            //reset any child columns
            foreach (var column in columns.Values)
            {
                ResetChildColumns(column, columns);
            }

            if (SourceDatalinkTable != null)
            {
                foreach (var column in SourceDatalinkTable.DexihDatalinkColumns)
                {
                    newColumns.Add(columns.ContainsKey(column.Key)
                        ? columns[column.Key]
                        : column);
                }
                SourceDatalinkTable.DexihDatalinkColumns = newColumns;
            }

            foreach (var datalinkTransform in DexihDatalinkTransforms.OrderBy(c => c.Position))
            {
                if (datalinkTransform.NodeDatalinkColumnKey != null &&
                    columns.ContainsKey(datalinkTransform.NodeDatalinkColumnKey.Value))
                {
                    datalinkTransform.NodeDatalinkColumn = columns[datalinkTransform.NodeDatalinkColumnKey.Value];
                    if (datalinkTransform.NodeDatalinkColumnKey < 0)
                    {
                        datalinkTransform.NodeDatalinkColumnKey = 0;
                    }
                }

                if (datalinkTransform.NodeDatalinkColumnKey != null && columns.ContainsKey(datalinkTransform.NodeDatalinkColumnKey.Value))
                {
                    datalinkTransform.NodeDatalinkColumn = columns[datalinkTransform.NodeDatalinkColumnKey.Value];
                    if (datalinkTransform.NodeDatalinkColumnKey < 0)
                    {
                        datalinkTransform.NodeDatalinkColumnKey = 0;
                    }
                }

                // track any join columns for the transform.
                if (datalinkTransform.JoinDatalinkTable != null)
                {
                    newColumns = new HashSet <DexihDatalinkColumn>();
                    foreach (var column in datalinkTransform.JoinDatalinkTable.DexihDatalinkColumns)
                    {
                        if (columns.ContainsKey(column.Key))
                        {
                            newColumns.Add(columns[column.Key]);
                        }
                        else
                        {
                            newColumns.Add(column);
                        }
                    }
                    datalinkTransform.JoinDatalinkTable.DexihDatalinkColumns = newColumns;
                }

                foreach (var item in datalinkTransform.DexihDatalinkTransformItems)
                {
                    if (item.FilterDatalinkColumnKey != null && columns.ContainsKey(item.FilterDatalinkColumnKey.Value))
                    {
                        item.FilterDatalinkColumn = columns[item.FilterDatalinkColumnKey.Value];
                        if (item.FilterDatalinkColumnKey < 0)
                        {
                            item.FilterDatalinkColumnKey = 0;
                        }
                    }

                    if (item.SourceDatalinkColumnKey != null && columns.ContainsKey(item.SourceDatalinkColumnKey.Value))
                    {
                        item.SourceDatalinkColumn = columns[item.SourceDatalinkColumnKey.Value];
                        if (item.SourceDatalinkColumnKey < 0)
                        {
                            item.SourceDatalinkColumnKey = 0;
                        }
                    }

                    if (item.JoinDatalinkColumnKey != null && columns.ContainsKey(item.JoinDatalinkColumnKey.Value))
                    {
                        item.JoinDatalinkColumn = columns[item.JoinDatalinkColumnKey.Value];
                        if (item.JoinDatalinkColumnKey < 0)
                        {
                            item.JoinDatalinkColumnKey = 0;
                        }
                    }

                    if (item.TargetDatalinkColumnKey != null && columns.ContainsKey(item.TargetDatalinkColumnKey.Value))
                    {
                        item.TargetDatalinkColumn = columns[item.TargetDatalinkColumnKey.Value];
                        if (item.TargetDatalinkColumnKey < 0)
                        {
                            item.TargetDatalinkColumnKey = 0;
                        }
                    }

                    foreach (var param in item.DexihFunctionParameters)
                    {
                        if (param.DatalinkColumnKey != null && columns.ContainsKey(param.DatalinkColumnKey.Value))
                        {
                            param.DatalinkColumn = columns[param.DatalinkColumnKey.Value];
                            if (param.DatalinkColumnKey < 0)
                            {
                                param.DatalinkColumnKey = 0;
                            }
                        }

                        foreach (var paramArray in param.ArrayParameters.Where(c => c.DatalinkColumnKey != null && columns.ContainsKey(c.DatalinkColumnKey.Value)))
                        {
                            paramArray.DatalinkColumn = columns[paramArray.DatalinkColumnKey.Value];
                            if (paramArray.DatalinkColumnKey < 0)
                            {
                                paramArray.DatalinkColumnKey = 0;
                            }
                        }
                    }
                }
            }

            foreach (var target in DexihDatalinkTargets)
            {
                if (target.NodeDatalinkColumnKey != null &&
                    columns.ContainsKey(target.NodeDatalinkColumnKey.Value))
                {
                    target.NodeDatalinkColumn = columns[target.NodeDatalinkColumnKey.Value];
                    if (target.NodeDatalinkColumnKey < 0)
                    {
                        target.NodeDatalinkColumnKey = 0;
                    }
                }

                if (target.NodeDatalinkColumnKey != null && columns.ContainsKey(target.NodeDatalinkColumnKey.Value))
                {
                    target.NodeDatalinkColumn = columns[target.NodeDatalinkColumnKey.Value];
                    if (target.NodeDatalinkColumnKey < 0)
                    {
                        target.NodeDatalinkColumnKey = 0;
                    }
                }
            }

            //reset all new key values to 0
            foreach (var column in columns.Values.Where(c => c.Key < 0))
            {
                column.Key = 0;
                column.DatalinkTableKey = null;
            }
        }
コード例 #3
0
        /// <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);
        }