private void TransformPathInfoDisplaySelectElement(WSelectQueryBlock query,
Dictionary<string, MatchPath> pathDictionary)
{
if (pathDictionary!=null && pathDictionary.Any())
{
List<WSelectElement> newSelectElements = new List<WSelectElement>();
foreach (var selectElement in query.SelectElements)
{
var starElement = selectElement as WSelectStarExpression;
if (starElement != null && starElement.Qulifier != null)
{
var colName = starElement.Qulifier.Identifiers[starElement.Qulifier.Count - 1].Value;
MatchPath path;
if (pathDictionary.TryGetValue(colName, out path))
{
path.ReferencePathInfo = true;
string schema = path.BindNodeTableObjName.SchemaIdentifier.Value;
string tableName = path.BindNodeTableObjName.BaseIdentifier.Value;
string pathName = path.EdgeColumn.MultiPartIdentifier.Identifiers.Last().Value;
var parameters = new List<WScalarExpression>
{
new WColumnReferenceExpression
{
MultiPartIdentifier =
new WMultiPartIdentifier(new Identifier() {Value = path.EdgeAlias},
new Identifier() {Value = "PathMessage"})
},
};
if (
_graphMetaData.NodeViewMapping.ContainsKey(
WNamedTableReference.SchemaNameToTuple(path.SinkNode.NodeTableObjectName)))
{
parameters.Add(new WColumnReferenceExpression
{
MultiPartIdentifier =
new WMultiPartIdentifier(new Identifier() { Value = path.SinkNode.RefAlias },
new Identifier() { Value = "_NodeType" })
});
parameters.Add(new WColumnReferenceExpression
{
MultiPartIdentifier =
new WMultiPartIdentifier(new Identifier() { Value = path.SinkNode.RefAlias },
new Identifier() { Value = "_NodeId" })
});
}
else
{
parameters.Add(new WValueExpression
{
Value = path.SinkNode.NodeTableObjectName.BaseIdentifier.Value,
SingleQuoted = true
});
string sinkNodeIdName =
_graphMetaData.ColumnsOfNodeTables[
WNamedTableReference.SchemaNameToTuple(path.SinkNode.NodeTableObjectName)]
.FirstOrDefault(e => e.Value.Role == WNodeTableColumnRole.NodeId).Key;
if (string.IsNullOrEmpty(sinkNodeIdName))
parameters.Add(new WValueExpression { Value = "null" });
else
{
parameters.Add(new WColumnReferenceExpression
{
MultiPartIdentifier =
new WMultiPartIdentifier(new Identifier() { Value = path.SinkNode.RefAlias },
new Identifier() { Value = sinkNodeIdName })
});
}
}
newSelectElements.Add(new WSelectScalarExpression
{
ColumnName = path.EdgeAlias + "_PathInfo",
SelectExpr = new WFunctionCall
{
CallTarget = new WMultiPartIdentifierCallTarget
{
Identifiers = new WMultiPartIdentifier(new Identifier { Value = "dbo" })
},
FunctionName = new Identifier { Value = string.Format("{0}_{1}_{2}_PathMessageDecoder", schema, tableName, pathName) },
Parameters = parameters
}
});
continue;
}
}
newSelectElements.Add(selectElement);
}
query.SelectElements = newSelectElements;
}
}