using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
using DataTable = System.Data.DataTable;
namespace Kreta.BusinessLogic.Utils
{
///
/// Extensions for manipulating DataTables
///
public static class DataTableExtensions
{
private static string suffixPattern = @"(_DNAME)|(_BNAME)|(_BOOL)";
///
/// Replaces id columns with added _DNAME and _BNAME colums.
///
/// DataTable returned by DataAccessBase.GetData.
public static DataTable ConsolidateColumns(this DataTable table)
{
//Reading all column names
var columnNames = (table.Columns.Cast().Select(column => column.ColumnName)).ToList();
//Selecting the columns we need in the right order
var orderedColumnNames = new List();
foreach (var name in columnNames)
{
if (Regex.IsMatch(name, suffixPattern))
{
continue;
}
if (columnNames.Contains($"{name}_DNAME"))
{
orderedColumnNames.Add($"{name}_DNAME");
}
else if (columnNames.Contains($"{name}_BNAME"))
{
orderedColumnNames.Add($"{name}_BNAME");
}
else
{
orderedColumnNames.Add(name);
}
}
//Removing everything else
var redundantColumnNames = columnNames.Except(orderedColumnNames);
foreach (var name in redundantColumnNames)
{
table.Columns.Remove(name);
}
//Ordering columns
var i = 0;
foreach (var name in orderedColumnNames)
{
table.Columns[name].SetOrdinal(i++);
}
//Renaming columns
var suffixedColumnNames = orderedColumnNames.Where(n => Regex.IsMatch(n, suffixPattern));
foreach (var name in suffixedColumnNames)
{
table.Columns[name].ColumnName = Regex.Replace(name, suffixPattern, string.Empty);
}
return table;
}
}
}