toHierarchicalOrder method

List<SQLBuilder> toHierarchicalOrder({
  1. bool verbose = false,
})

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;
}