11 #ifndef ROOT_GRAPHUTILS 
   12 #define ROOT_GRAPHUTILS 
   19 #include <type_traits> 
   29 class RCustomColumnBase;
 
   37 namespace GraphDrawing {
 
   38 std::shared_ptr<GraphNode>
 
   39 CreateDefineNode(
const std::string &columnName, 
const ROOT::Detail::RDF::RCustomColumnBase *columnPtr);
 
   41 std::shared_ptr<GraphNode> CreateFilterNode(
const ROOT::Detail::RDF::RFilterBase *filterPtr);
 
   43 std::shared_ptr<GraphNode> CreateRangeNode(
const ROOT::Detail::RDF::RRangeBase *rangePtr);
 
   45 bool CheckIfDefaultOrDSColumn(
const std::string &name,
 
   46                               const std::shared_ptr<ROOT::Detail::RDF::RCustomColumnBase> &column);
 
   59 class GraphCreatorHelper {
 
   61    using ColumnsNodesMap_t = std::map<const ROOT::Detail::RDF::RCustomColumnBase *, std::weak_ptr<GraphNode>>;
 
   62    using FiltersNodesMap_t = std::map<const ROOT::Detail::RDF::RFilterBase *, std::weak_ptr<GraphNode>>;
 
   63    using RangesNodesMap_t = std::map<const ROOT::Detail::RDF::RRangeBase *, std::weak_ptr<GraphNode>>;
 
   67    static ColumnsNodesMap_t &GetStaticColumnsMap()
 
   69       static ColumnsNodesMap_t sMap;
 
   75    static FiltersNodesMap_t &GetStaticFiltersMap()
 
   77       static FiltersNodesMap_t sMap;
 
   83    static RangesNodesMap_t &GetStaticRangesMap()
 
   85       static RangesNodesMap_t sMap;
 
   91    friend std::shared_ptr<GraphNode>
 
   92    CreateDefineNode(
const std::string &columnName, 
const ROOT::Detail::RDF::RCustomColumnBase *columnPtr);
 
   96    friend std::shared_ptr<GraphNode> CreateFilterNode(
const ROOT::Detail::RDF::RFilterBase *filterPtr);
 
  100    friend std::shared_ptr<GraphNode> CreateRangeNode(
const ROOT::Detail::RDF::RRangeBase *rangePtr);
 
  104    std::string FromGraphLeafToDot(std::shared_ptr<GraphNode> leaf);
 
  108    std::string FromGraphActionsToDot(std::vector<std::shared_ptr<GraphNode>> leaves);
 
  112    std::string RepresentGraph(ROOT::RDataFrame &rDataFrame);
 
  116    std::string RepresentGraph(RLoopManager *rLoopManager);
 
  120    template <
typename Proxied, 
typename DataSource>
 
  121    std::string RepresentGraph(RInterface<Proxied, DataSource> &rInterface)
 
  123       auto loopManager = rInterface.GetLoopManager();
 
  126       return FromGraphLeafToDot(rInterface.GetProxiedPtr()->GetGraph());
 
  131    template <
typename T>
 
  132    std::string RepresentGraph(
const RResultPtr<T> &resultPtr)
 
  134       auto loopManager = resultPtr.fLoopManager;
 
  136          throw std::runtime_error(
"Something went wrong");
 
  138       if (std::is_same<T, RInterface<RLoopManager, void>>::value) {
 
  139          return RepresentGraph(loopManager);
 
  144       auto actionPtr = resultPtr.fActionPtr;
 
  145       return FromGraphLeafToDot(actionPtr->GetGraph());
 
  152    template <
typename NodeType>
 
  153    std::string operator()(NodeType &node)
 
  157       GetStaticFiltersMap() = FiltersNodesMap_t();
 
  158       GetStaticColumnsMap() = ColumnsNodesMap_t();
 
  159       GetStaticRangesMap() = RangesNodesMap_t();
 
  160       GraphNode::ClearCounter();
 
  162       return RepresentGraph(node);