/// \file
/// \ingroup tutorial_dataframe
/// \notebook -js
///
/// In order to display the Platform Distribution of ROOT, we choose to create two TH1F
/// histograms: one that includes all types of platforms, other filtering and classifying them.
/// This procedure is using a lambda expression taking as parameter the values
/// stored in the "Platform" column from the database. At the end, the histograms are filled
/// with their specific demand regarding the platform's type.
///
/// \macro_code
/// \macro_image
///
/// \date August 2018
/// \author Alexandra-Maria Dobrescu

void df029_SQlitePlatformDistribution() {

   auto rdf = ROOT::RDF::MakeSqliteDataFrame( "http://root.cern/files/root_download_stats.sqlite", "SELECT * FROM accesslog;" );

   TH1F hRootPlatform("hrootPlatform", "Platform Distribution", 7, 0, -1);
   TH1F hShortRootPlatform("hShortRootPlatform", "Short Platform Distribution", 7, 0, -1);

   auto fillRootPlatform = [&hRootPlatform, &hShortRootPlatform] ( const std::string &platform ) {
      TString Platform = platform;
      TString Platform_0(Platform(0,5));
      TString Platform_1(Platform(0,6));
      TString Platform_2(Platform(0,8));

      if ( Platform.Contains("win32") ){
        hShortRootPlatform.Fill(Platform_0,1);
      } else if ( Platform.Contains("Linux") ){
        hShortRootPlatform.Fill(Platform_0,1);
      } else if ( Platform.Contains("source") ){
        hShortRootPlatform.Fill(Platform_1,1);
      } else if ( Platform.Contains("macosx64") ){
        hShortRootPlatform.Fill(Platform_2,1);
      } else if ( Platform.Contains("IRIX64") ){
        hShortRootPlatform.Fill(Platform_1,1);
      }

      hRootPlatform.Fill(Platform,1);
   };

   rdf.Foreach( fillRootPlatform, { "Platform" } );

   auto PlatformDistributionHistogram = new TCanvas();

   hRootPlatform.GetXaxis()->LabelsOption("a");
   hRootPlatform.LabelsDeflate("X");
   hRootPlatform.DrawClone();

   auto shortPlatformDistributionHistogram = new TCanvas();

   hShortRootPlatform.GetXaxis()->LabelsOption("a");
   hShortRootPlatform.LabelsDeflate("X");
   hShortRootPlatform.DrawClone();
}
