private void Init()
{
_graphMetaData = new GraphMetaData();
var columnsOfNodeTables = _graphMetaData.ColumnsOfNodeTables;
var nodeViewMapping = _graphMetaData.NodeViewMapping;
var revEdgeOrderDict = _graphMetaData.ReversedEdgeOrder;
using (var command = Tx.Connection.CreateCommand())
{
command.Transaction = Tx;
command.CommandText = string.Format(
@"
SELECT [TableSchema] as [Schema], [TableName] as [Name1], [ColumnName] as [Name2],
[ColumnRole] as [Role], [Reference] as [Name3], [HasReversedEdge] as [HasRevEdge], [IsReversedEdge] as [IsRevEdge], [EdgeUdfPrefix] as [UdfPrefix], null as [EdgeViewTable], null as [ColumnId]
FROM [{0}]
UNION ALL
SELECT [TableSchema] as [Schema], [TableName] as [Name1], [ColumnName] as [Name2],
-1 as [Role], [AttributeName] as [Name3], 0, 0, null, null, [AttributeId]
FROM [{1}]
UNION ALL
SELECT [NV].[TableSchema] as [Schema], [NV].[TableName] as [Name1], [NT].[TableName] as [Name2],
-2 as [Role], null as [Name3], 0, 0, null, null, null
FROM
[{2}] as [NV_NT_Mapping]
JOIN
[{3}] as [NV]
ON NV_NT_Mapping.NodeViewTableId = NV.TableId
JOIN
[{3}] as [NT]
ON NV_NT_Mapping.TableId = NT.TableId
UNION ALL
SELECT [EV].[TableSchema] as [Schema], [EV].[ColumnName] as [Name1], [ED].[ColumnName]as [Name2],
-3 as [Role], [ED].[TableName] as [Name3], 0, 0, null, [EV].[TableName] as [EdgeViewTable], [ED].[ColumnId] as [ColumnId]
FROM
[{4}] as [EV_ED_Mapping]
JOIN
[{0}] as [EV]
ON [EV_ED_Mapping].[NodeViewColumnId] = [EV].[ColumnId] and [EV].[ColumnRole] = 3
JOIN
[{0}] as [ED]
ON [EV_ED_Mapping].[ColumnId] = [ED].[ColumnId]
ORDER BY [ColumnId]", GraphViewConnection.MetadataTables[1],
GraphViewConnection.MetadataTables[2], GraphViewConnection.MetadataTables[7],
GraphViewConnection.MetadataTables[0], GraphViewConnection.MetadataTables[5]);
var revEdgeOrder = 0;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int tag = (int) reader["Role"];
string schema = reader["Schema"].ToString().ToLower(CultureInfo.CurrentCulture);
string name1 = reader["Name1"].ToString().ToLower(CultureInfo.CurrentCulture);
string name2 = reader["Name2"].ToString().ToLower(CultureInfo.CurrentCulture);
bool hasRevEdge = reader["HasRevEdge"].ToString().Equals("1");
bool isRevEdge = reader["IsRevEdge"].ToString().Equals("1");
string udfPrefix = reader["UdfPrefix"].ToString().ToLower(CultureInfo.CurrentCulture);
// Retrieve columns of node tables
var tableTuple = new Tuple<string, string>(schema, name1);
if (tag >= 0)
{
Dictionary<string, NodeColumns> columnDict;
if (!columnsOfNodeTables.TryGetValue(tableTuple, out columnDict))
{
columnDict = new Dictionary<string, NodeColumns>(StringComparer.OrdinalIgnoreCase);
columnsOfNodeTables.Add(tableTuple, columnDict);
}
var role = (WNodeTableColumnRole) tag;
EdgeInfo edgeInfo = null;
// Edge column
if (role == WNodeTableColumnRole.Edge || role == WNodeTableColumnRole.EdgeView)
{
edgeInfo = new EdgeInfo
{
ColumnAttributes = new List<string>(),
SinkNodes = role == WNodeTableColumnRole.Edge
? new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
reader["Name3"].ToString().ToLower(CultureInfo.CurrentCulture)
}
: new HashSet<string>(StringComparer.OrdinalIgnoreCase),
HasReversedEdge = hasRevEdge,
IsReversedEdge = isRevEdge,
EdgeUdfPrefix = udfPrefix,
};
if (role == WNodeTableColumnRole.Edge)
{
var tableSchema = reader["Schema"].ToString();
var tableName = reader["Name1"].ToString();
var edgeName = reader["Name2"].ToString();
var refTableName = reader["Name3"].ToString();
var revEdgeName = (tableName + "_" + edgeName + "Reversed").ToLower();
var tuple = new Tuple<string, string>(tableSchema.ToLower(), refTableName.ToLower());
if (!revEdgeOrderDict.ContainsKey(tuple))
revEdgeOrderDict[tuple] =
new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
revEdgeOrderDict[tuple][revEdgeName] = revEdgeOrder;
++revEdgeOrder;
}
}
columnDict.Add(name2,
new NodeColumns
{
EdgeInfo = edgeInfo,
Role = role,
});
}
// Retrieve edge attributes
else if (tag == -1)
{
var columnDict = columnsOfNodeTables[tableTuple];
columnDict[name2].EdgeInfo.ColumnAttributes.Add(reader["Name3"].ToString()
.ToLower(CultureInfo.CurrentCulture));
}
// Retrieve node view mapping
else if (tag == -2)
{
HashSet<string> nodeTableSet;
if (!nodeViewMapping.TryGetValue(tableTuple, out nodeTableSet))
{
nodeTableSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
nodeViewMapping.Add(tableTuple, nodeTableSet);
}
nodeTableSet.Add(name2);
}
// Retrieve edge view mapping
else if (tag == -3)
{
string edgeViewSourceTableName =
reader["EdgeViewTable"].ToString().ToLower(CultureInfo.CurrentCulture);
string sourceTableName = reader["Name3"].ToString().ToLower(CultureInfo.CurrentCulture);
string sinkTableName =
columnsOfNodeTables[new Tuple<string, string>(schema, sourceTableName)][name2]
.EdgeInfo.SinkNodes.First();
var edgeViewInfo =
columnsOfNodeTables[new Tuple<string, string>(schema, edgeViewSourceTableName)][
name1].EdgeInfo;
if (!edgeViewInfo.SinkNodes.Contains(sourceTableName))
edgeViewInfo.SinkNodes.Add(sinkTableName);
if (edgeViewInfo.EdgeColumns == null)
edgeViewInfo.EdgeColumns = new List<Tuple<string, string>>();
edgeViewInfo.EdgeColumns.Add(new Tuple<string, string>(sourceTableName, name2));
}
}
// sort reversed edgeViews' EdgeColumn according to the order of their corresponding original edges' column Ids
// to match the rule of edgeView's decoder function parameters placing order
foreach (var it in columnsOfNodeTables)
{
foreach (var edge in it.Value)
{
if (edge.Value.Role == WNodeTableColumnRole.EdgeView && edge.Value.EdgeInfo.IsReversedEdge)
{
var edgeInfo = edge.Value.EdgeInfo;
edgeInfo.EdgeColumns =
edgeInfo.EdgeColumns.OrderBy(
x => revEdgeOrderDict[new Tuple<string, string>("dbo", x.Item1)][x.Item2])
.ToList();
}
}
}
}
}
}