toHierarchicalOrder method
Returns the SQLs in hierarchical order, respecting the
dependencies of each SQLBuilder
. See toGraph.
Implementation
List<SQLBuilder> toHierarchicalOrder({bool verbose = false}) {
sortByName();
var graph = toGraph();
var sqlBuildOrder = graph
.walkOutputsOrderFrom(
graph.rootValues,
sortByInputDependency: true,
expandSideRoots: true,
maxExpansion: 1,
)
.toListOfValues();
var invalidSQLsOrders = sqlBuildOrder.invalidSQLsOrder();
// Order fallback:
if (invalidSQLsOrders.isNotEmpty) {
sqlBuildOrder.bestOrder();
invalidSQLsOrders = sqlBuildOrder.invalidSQLsOrder();
}
if (verbose) {
var msg = StringBuffer();
msg.write("`SQLBuilder` execution order:\n\n");
for (var i = 0; i < sqlBuildOrder.length; ++i) {
var sql = sqlBuildOrder[i];
msg.write(' $i> $sql\n');
}
_log.info(msg);
var asciiArtTree = graph.toASCIIArtTree(sortByInputDependency: true);
var treeText = asciiArtTree.generate(
expandGraphs: false, hideReferences: true, expandSideBranches: true);
_log.info("`SQLBuilder` graph:\n\n$treeText");
if (invalidSQLsOrders.isNotEmpty) {
var msg = StringBuffer();
msg.write("The `SQLBuilder` instances are not in a valid order!\n\n");
msg.write("** Listing `SQLBuilder` instances with an invalid order:\n");
for (var e in invalidSQLsOrders.entries) {
var sql = e.key;
var deps = e.value.map((e) => e.mainTable).toList();
msg.write(" -- $sql > dependencies: $deps\n");
}
_log.warning(msg);
}
} else if (invalidSQLsOrders.isNotEmpty) {
_log.warning(
"The `SQLBuilder` instances (${invalidSQLsOrders.length}) are not in a valid order!");
}
return sqlBuildOrder;
}