private void ChangeSelectStarExpression(WSelectQueryBlock node, MatchGraph graph)
{
var newSelectElements = new List<WSelectElement>();
Dictionary<string, List<WSelectElement>> starReplacement = null;
foreach (var element in node.SelectElements)
{
var starElement = element as WSelectStarExpression;
if (starElement != null)
{
if (starReplacement == null)
{
starReplacement =
new Dictionary<string, List<WSelectElement>>(StringComparer.OrdinalIgnoreCase);
// Fetch table in order
foreach (var table in _context.NodeTableDictionary)
{
var alias = table.Key;
var namedTable = table.Value as WNamedTableReference;
if (namedTable != null)
{
foreach (
var column in
_graphMetaData.ColumnsOfNodeTables[
WNamedTableReference.SchemaNameToTuple(namedTable.TableObjectName)].Where(
e => e.Value.Role != WNodeTableColumnRole.Edge).Select(e => e.Key))
{
var elementList = starReplacement.GetOrCreate(alias);
elementList.Add(new WSelectScalarExpression
{
SelectExpr = new WColumnReferenceExpression
{
MultiPartIdentifier = new WMultiPartIdentifier
{
Identifiers = new List<Identifier>
{
new Identifier {Value = alias},
new Identifier {Value = column}
}
}
}
});
}
if (graph == null) continue;
foreach (var subGraph in graph.ConnectedSubGraphs)
{
if (subGraph.Nodes.ContainsKey(alias))
{
var matchNode = subGraph.Nodes[alias];
foreach (var edge in matchNode.Neighbors)
{
var schemaName = edge.SourceNode.NodeTableObjectName.SchemaIdentifier ==
null
? "dbo"
: edge.SourceNode.NodeTableObjectName.SchemaIdentifier.Value.ToLower();
var nodeTuple = new Tuple<string, string>(schemaName,
edge.SourceNode.NodeTableObjectName.BaseIdentifier.Value.ToLower());
var edgeColumnName =
edge.EdgeColumn.MultiPartIdentifier.Identifiers.Last().Value.ToLower();
if (!_graphMetaData.ColumnsOfNodeTables[nodeTuple].ContainsKey(edgeColumnName))
{
throw new GraphViewException("Invalid Edge Alias");
}
foreach (
var column in
_graphMetaData.ColumnsOfNodeTables[nodeTuple][edgeColumnName].EdgeInfo
.ColumnAttributes)
{
var elementList = starReplacement.GetOrCreate(edge.EdgeAlias);
elementList.Add(new WSelectScalarExpression
{
SelectExpr = new WColumnReferenceExpression
{
MultiPartIdentifier = new WMultiPartIdentifier
{
Identifiers = new List<Identifier>
{
new Identifier {Value = edge.EdgeAlias},
new Identifier {Value = column}
}
}
}
});
}
}
}
}
}
else
{
var derivedTable = table.Value as WQueryDerivedTable;
if (derivedTable == null)
continue;
var elementList = starReplacement.GetOrCreate(alias);
elementList.Add(new WSelectStarExpression
{
Qulifier = new WMultiPartIdentifier
{
Identifiers = new List<Identifier> {new Identifier {Value = alias}}
}
});
}
}
}
if (starElement.Qulifier != null)
{
newSelectElements.AddRange(starReplacement[starElement.Qulifier.Identifiers.Last().Value]);
}
else
{
foreach (var value in starReplacement.Values)
{
newSelectElements.AddRange(value);
}
}
}
else
{
newSelectElements.Add(element);
}
}
if (newSelectElements.Any())
node.SelectElements = newSelectElements;
}