Example #1
0
    public UniqueTableIndex AddUniqueIndex(ITable table, IColumn[] columns)
    {
        var index = new UniqueTableIndex(table, columns);

        AddIndex(index);
        return(index);
    }
Example #2
0
    public UniqueTableIndex AddUniqueIndex(ITable table, Field[] fields)
    {
        var index = new UniqueTableIndex(table, TableIndex.GetColumnsFromFields(fields));

        AddIndex(index);
        return(index);
    }
Example #3
0
        public static int DuplicateCount(UniqueTableIndex uniqueIndex, Replacements rep)
        {
            var primaryKey = uniqueIndex.Table.Columns.Values.Where(a => a.PrimaryKey).Only();

            if (primaryKey == null)
            {
                throw new InvalidOperationException("No primary key found");
            }
            ;

            var oldTableName = rep.Apply(Replacements.KeyTablesInverse, uniqueIndex.Table.Name.ToString());

            var columnReplacement = rep.TryGetC(Replacements.KeyColumnsForTable(uniqueIndex.Table.Name.ToString()))?.Inverse() ?? new Dictionary <string, string>();

            var oldColumns = uniqueIndex.Columns.ToString(c => (columnReplacement.TryGetC(c.Name) ?? c.Name).SqlEscape(), ", ");

            var oldPrimaryKey = columnReplacement.TryGetC(primaryKey.Name) ?? primaryKey.Name;

            return((int)Executor.ExecuteScalar(
                       $@"SELECT Count(*) FROM {oldTableName}
WHERE {oldPrimaryKey} NOT IN
(
    SELECT MIN({oldPrimaryKey})
    FROM {oldTableName}
    {(!uniqueIndex.Where.HasText() ? "" : "WHERE " + uniqueIndex.Where.Replace(columnReplacement))}
    GROUP BY {oldColumns}
){(!uniqueIndex.Where.HasText() ? "" : "AND " + uniqueIndex.Where.Replace(columnReplacement))}") !);
        }
Example #4
0
        private static SqlPreCommand RemoveDuplicates(UniqueTableIndex uniqueIndex, IColumn primaryKey, string columns, bool commentedOut)
        {
            return(new SqlPreCommandSimple($@"DELETE {uniqueIndex.Table.Name}
WHERE {primaryKey.Name} NOT IN
(
    SELECT MIN({primaryKey.Name})
    FROM {uniqueIndex.Table.Name}
    {(string.IsNullOrWhiteSpace(uniqueIndex.Where) ? "" : "WHERE " + uniqueIndex.Where)}
    GROUP BY {columns}
){(string.IsNullOrWhiteSpace(uniqueIndex.Where) ? "" : " AND " + uniqueIndex.Where)}".Let(txt => commentedOut ? txt.Indent(2, '-') : txt)));
        }
Example #5
0
        public static SqlPreCommand?RemoveDuplicatesIfNecessary(UniqueTableIndex uniqueIndex, Replacements rep)
        {
            try
            {
                var primaryKey = uniqueIndex.Table.Columns.Values.Where(a => a.PrimaryKey).Only();

                if (primaryKey == null)
                {
                    return(null);
                }


                int count = DuplicateCount(uniqueIndex, rep);

                if (count == 0)
                {
                    return(null);
                }

                var columns = uniqueIndex.Columns.ToString(c => c.Name.SqlEscape(), ", ");

                if (rep.Interactive)
                {
                    if (SafeConsole.Ask($"There are {count} rows in {uniqueIndex.Table.Name} with the same {columns}. Generate DELETE duplicates script?"))
                    {
                        return(RemoveDuplicates(uniqueIndex, primaryKey, columns, commentedOut: false));
                    }

                    return(null);
                }
                else
                {
                    return(RemoveDuplicates(uniqueIndex, primaryKey, columns, commentedOut: true));
                }
            }
            catch (Exception)
            {
                return(new SqlPreCommandSimple($"-- Impossible to determine duplicates in new index {uniqueIndex.IndexName}"));
            }
        }