Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save data-goblin/b5f4b665038a260a3c5c47d40907ceb5 to your computer and use it in GitHub Desktop.
Save data-goblin/b5f4b665038a260a3c5c47d40907ceb5 to your computer and use it in GitHub Desktop.
A Tabular Editor C# script to generate a context-dependent mermaid diagram for Azure DevOps Wikis (flowchart) of measure dependencies based on the selected measure.
// This code is still WIP, it doesn't entirely filter the lineage. Feel free to make adjustments.
string dependancies = "::: mermaid\ngraph LR;\n%% Measure dependancy mermaid flowchart";
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
foreach(var _measures in Model.AllMeasures )
{
// Deep lineage for upstream measures
var _upstream_deep = _measures.DependsOn.Deep();
var _upstream_measures_deep = _upstream_deep.OfType<Measure>().Select(c => c).Distinct();
// Direct lineage for upstream measures
var _upstream = _measures.DependsOn;
var _upstream_measures = _upstream.Measures.OfType<Measure>().Select(c => c).Distinct();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Deep lineage for downstream measures
var _downstream_deep = _measures.ReferencedBy.Deep();
var _downstream_measures_deep = _downstream_deep.OfType<Measure>().Select(c => c).Distinct();
// Direct lineage for downstream measures
var _downstream = _measures.ReferencedBy;
var _downstream_measures = _downstream.Measures.OfType<Measure>().Select(c => c).Distinct();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Only adds upstream measures if they are in the deep lineage
if ( _upstream_measures_deep.Contains(Selected.Measure) )
{
foreach( var measure_dependencies in _upstream_measures )
{
dependancies += string.Format("\r\n\t{2}[\"{3}\"] -.-> {0}[\"{1}\"];",
_measures.LineageTag,
_measures.Name,
measure_dependencies.LineageTag,
measure_dependencies.Name);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Only adds downstream measures if they are in the deep lineage
if ( _downstream_measures_deep.Contains(Selected.Measure) )
{
foreach( var measure_references in _downstream_measures )
{
if (
measure_references == Selected.Measure ||
measure_references.ReferencedBy.Measures.OfType<Measure>().Select(c => c).Distinct().Contains(Selected.Measure))
{
dependancies += string.Format("\r\n\t{0}[\"{1}\"] --> {2}[\"{3}\"];",
_measures.LineageTag,
_measures.Name,
measure_references.LineageTag,
measure_references.Name );
}
}
}
}
// Formats the selected measure in mermaid using a specific style
dependancies += string.Format("\r\n\n%% Formatting\n\tstyle " + Selected.Measure.LineageTag + " fill:#f87272,stroke:#333,stroke-width:2px \n:::");
dependancies.Output();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment