Exemplo n.º 1
0
        public async Task <string> ScriptFrom(IMergeScriptVariableSet scriptVariableSet)
        {
            var script = "";

            foreach (var section in _scriptSections)
            {
                if (await section.Valid(scriptVariableSet))
                {
                    script += $"{await section.Value(scriptVariableSet)}{Environment.NewLine}{Environment.NewLine}";
                }
            }

            return(script);
        }
Exemplo n.º 2
0
        public async Task <string> Value(IMergeScriptVariableSet variableSet)
        {
            var matchOn = variableSet.MergeIdentifierColumns.Select(c => c.Name).ToList();

            var deleteOn = variableSet.DeleteIdentifierColumns.Select(c => c.Name);

            var deleteOnFactId = matchOn.Where(m => !deleteOn.Any(d => d.Equals(m))).FirstOrDefault();

            var inserts = true;

            var softDeleteColumn = variableSet.Table.SoftDeleteColumn();

            if (softDeleteColumn != null)
            {
                matchOn.Add(softDeleteColumn.Name);
            }

            var updates = !matchOn.Count().Equals(variableSet.Table.Columns.Count) &&
                          !variableSet.Table.Columns.Where(c => !c.IdentityColumn).Select(c => c.Name).All(n => matchOn.Any(m => m.Equals(n, StringComparison.InvariantCultureIgnoreCase)));

            var deletes = softDeleteColumn != null;

            var retention = !string.IsNullOrWhiteSpace(variableSet.RetentionPolicy.ComparisonColumn);

            var retentionAmount = retention ? $"({variableSet.RetentionPolicy.RetentionMonths} months)" : "";

            var tableTypeFields = new List <string>();

            foreach (var column in variableSet.TableTypeColumns.OrderBy(c => c.Name))
            {
                var columnDescription = $" **         [{column.Name}] {column.DataType()} {column.NullableColumn()}";

                if (column != variableSet.TableTypeColumns.OrderBy(c => c.Name).Last())
                {
                    columnDescription += ",";
                }

                tableTypeFields.Add(columnDescription);
            }

            var dependantTables = new List <string>();

            foreach (var dependantTable in variableSet.TablesToJoin)
            {
                var table = $" **     [{variableSet.Schema.Name}].[{dependantTable.joinTable.Name}]";

                if (dependantTable != variableSet.TablesToJoin.Last())
                {
                    table += ",";
                }

                dependantTables.Add(table);
            }

            var aboutText = new List <string>
            {
                $" ** [{variableSet.Schema.Name}].[{variableSet.ScriptName}]",
                $" **",
                $" ** Expects table type parameter: @{variableSet.TableTypeVariableName} as",
                $" **     [{variableSet.Schema.Name}].[{variableSet.TableTypeName}] ("
            };

            aboutText.AddRange(tableTypeFields);

            aboutText.AddRange(new List <string>
            {
                $" **     )",
                $" **",
                $" ** Merges data into table:",
                $" **     [{variableSet.Schema.Name}].[{variableSet.Table.Name}]"
            });

            if (dependantTables.Any())
            {
                aboutText.Add(" **");
                aboutText.Add(" ** Merge requires data from:");

                aboutText.AddRange(dependantTables);
            }

            var assemblyValue = Assembly
                                .GetEntryAssembly()?
                                .CustomAttributes
                                .FirstOrDefault(a => a.AttributeType == typeof(AssemblyInformationalVersionAttribute))?
                                .ConstructorArguments
                                .FirstOrDefault()
                                .Value;

            var softDeleteColumnValue = "";

            if (softDeleteColumn != null)
            {
                softDeleteColumnValue = $" (column: [{softDeleteColumn.Name}])";
            }

            aboutText.AddRange(new List <string> {
                $"#pad",
                $" ** Inserts: {inserts}",
                $" ** Updates: {updates}",
                $" ** Deletes: {deletes}{softDeleteColumnValue}",
                $" ** Retention policy: {retention} {retentionAmount}",
                $"#pad",
                $" ** Gaspra.Functions v{assemblyValue}"
            });

            var affix = " **";

            var longestLine = aboutText
                              .Select(t => t.Length)
                              .OrderByDescending(t => t)
                              .First();

            var start = "/" + new string('*', longestLine + 2);

            var end = " " + new string('*', longestLine + 2) + "/";

            var aboutLines = new List <string>
            {
                start
            };

            aboutLines
            .AddRange(aboutText.Select(t =>
            {
                if (!t.Equals("#pad"))
                {
                    return(t + new string(' ', longestLine - t.Length) + affix);
                }
                else
                {
                    return(" " + new string('*', longestLine + 2 ));
                }
            }));

            aboutLines.Add(end);

            var scriptLines = await _scriptLineFactory.LinesFrom(
                0,
                aboutLines.ToArray());

            return(await _scriptLineFactory.StringFrom(scriptLines));
        }
Exemplo n.º 3
0
 public Task <bool> Valid(IMergeScriptVariableSet variableSet)
 {
     return(Task.FromResult(true));
 }