Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions ColumnExtractor/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,22 @@ public class Parser
private readonly bool _log;
private readonly bool _outputSelectStar;
private readonly bool _bracketOutput;
private readonly bool _outputPivotGeneratedColumns;

public Parser()
public Parser()
{
_log = false;
_outputSelectStar = false;
_bracketOutput = false;
}

public Parser(bool log, bool outputSelectStar, bool bracketOutput)
public Parser(bool log, bool outputSelectStar, bool bracketOutput, bool outputPivotGeneratedColumns = false)
{
_log = log;
_outputSelectStar = outputSelectStar;
_bracketOutput = bracketOutput;
}
_outputPivotGeneratedColumns = outputPivotGeneratedColumns;
}

public ParsedData GetColumns(string sql)
{
Expand All @@ -37,7 +39,9 @@ public ParsedData GetColumns(string sql)
var result = parser.Parse(reader, out var errors);
var traverser = new Traverser(_log);
var columnData = traverser.TraverseObject(result, null).Distinct().ToArray();
var tableData = columnData.Where(c => c?.AmbiguousTableReferences != null)
var tableData = columnData
.Where(c => _outputPivotGeneratedColumns || !c.IsPivotGeneratedColumn)
.Where(c => c?.AmbiguousTableReferences != null)
.SelectMany(c => c.AmbiguousTableReferences)
.Concat(columnData.Select(c => c.AbsoluteTableReference))
.Where(c => c != null)
Expand Down Expand Up @@ -87,14 +91,16 @@ public TableData[] GetTables(string sql)
foreach (var table in tableData)
{
table.Columns = columnData
.Where(c => _outputPivotGeneratedColumns || !c.IsPivotGeneratedColumn)
.Where(c => c.AbsoluteTableReference != null && table.Equals(new TableData(c.AbsoluteTableReference, _bracketOutput)))
.Select(c => new ColumnData(c, _bracketOutput))
.Where(cd => _outputSelectStar || cd.ColumnNM != "*")
.Distinct()
.ToArray();

table.PossibleColumns = columnData
.Where(c => c.AmbiguousTableReferences != null && c.AmbiguousTableReferences.Any(t => table.Equals(new TableData(t, _bracketOutput))))
.Where(c => _outputPivotGeneratedColumns || !c.IsPivotGeneratedColumn)
.Where(c => c.AmbiguousTableReferences != null && c.AmbiguousTableReferences.Any(t => table.Equals(new TableData(t, _bracketOutput))))
.Select(c => new ColumnData(c, _bracketOutput))
.Where(cd => _outputSelectStar || cd.ColumnNM != "*")
.Distinct()
Expand Down
43 changes: 26 additions & 17 deletions ColumnExtractor/Traverse/Column.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public class Column
public Table AbsoluteTableReference;
public IEnumerable<Table> AmbiguousTableReferences;
public IEnumerable<Cte> CteReferences;
public bool IsPivotGeneratedColumn;

public string FullyQualifiedName => GetFullyQualifiedName(true);

public string GetFullyQualifiedName(bool brackets)
Expand All @@ -27,22 +29,29 @@ public string GetFullyQualifiedName(bool brackets)
: availableParts.Any() ? $"{string.Join(".", availableParts)}" : null;
}

public override bool Equals(object obj)
{
return obj is Column summary &&
Name.Equals(summary.Name, StringComparison.OrdinalIgnoreCase) &&
EqualityComparer<Table>.Default.Equals(AbsoluteTableReference, summary.AbsoluteTableReference) &&
EqualityComparer<IEnumerable<Table>>.Default.Equals(AmbiguousTableReferences,
summary.AmbiguousTableReferences);
}
protected bool Equals(Column other)
{
return string.Equals(Name, other.Name) && Equals(AbsoluteTableReference, other.AbsoluteTableReference) && Equals(AmbiguousTableReferences, other.AmbiguousTableReferences) && IsPivotGeneratedColumn == other.IsPivotGeneratedColumn;
}

public override int GetHashCode()
{
var hashCode = 1102383335;
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name != null ? Name.ToLowerInvariant() : null);
hashCode = hashCode * -1521134295 + EqualityComparer<Table>.Default.GetHashCode(AbsoluteTableReference);
hashCode = hashCode * -1521134295 + EqualityComparer<IEnumerable<Table>>.Default.GetHashCode(AmbiguousTableReferences);
return hashCode;
}
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Column) obj);
}

public override int GetHashCode()
{
unchecked
{
var hashCode = (Name != null ? Name.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (AbsoluteTableReference != null ? AbsoluteTableReference.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (AmbiguousTableReferences != null ? AmbiguousTableReferences.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ IsPivotGeneratedColumn.GetHashCode();
return hashCode;
}
}
}
}
3 changes: 0 additions & 3 deletions ColumnExtractor/Traverse/Cte.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,18 @@ namespace ColumnExtractor.Traverse
{
public class Cte
{
public string Alias;
public string Name;
public List<Table> LinkedTables = new List<Table>();

public override bool Equals(object obj)
{
return obj is Cte summary &&
Alias == summary.Alias &&
Name == summary.Name;
}

public override int GetHashCode()
{
var hashCode = -601341547;
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Alias);
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name != null ? Name.ToLowerInvariant() : null);
return hashCode;
}
Expand Down
Loading