/* Copyright (C) 2014 InfiniDB, Inc.

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; version 2 of
   the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   MA 02110-1301, USA. */

/******************************************************************************************
 * $Id: tpchpopulate.cpp 2101 2013-01-21 14:12:52Z rdempsey $
 *
 ******************************************************************************************/

#include <boost/timer.hpp>

#include "dbbuilder.h"
#include "tpchpopulate.h"

using namespace dmlpackageprocessor;
using namespace dmlpackage;
using namespace std;

void TpchPopulate::populateFromFile(std::string tableName, string& fileName)
{
  cout << endl;
  cout << "Populating " << tableName << endl;
  cout << "---------------------------------------" << endl;

  std::string dmlStatement;
  ifstream ifdml(fileName.c_str(), ios::in);

  if (ifdml)
  {
    while (ifdml.good())
    {
      char line[256];
      line[0] = '\0';
      ;
      ifdml.getline(line, 256);

      // if ( line[0] == '\0' )
      if (strlen(line) == 0)
        continue;

      dmlStatement = "insert into ";
      dmlStatement += tableName;
      dmlStatement += " values(";
      dmlStatement += line;
      dmlStatement += ");";

      insert(dmlStatement);
    }
  }
  else
  {
    perror(fileName.c_str());
  }

  cout << endl;
  cout << "Finished Populating " << tableName << endl;
}

void TpchPopulate::populate_part()
{
  std::string dmlStatement =
      "insert into tpch.part values('1', 'goldenrod lace spring peru powder', 'Manufac#1', 'Brand#13', "
      "'PROMO BURNISHED COPPER', '7', 'JUMBO PKG', '901.00', 'final deposits s' );";
  insert(dmlStatement);

  dmlStatement =
      "insert into tpch.part values(2, 'blush rosy metallic lemon navajo', 'Manufac#1', 'Brand#13','LARGE "
      "BRUSHED BRASS', 1, 'LG CASE', 902.00, 'final platelets hang f');";
  insert(dmlStatement);

  dmlStatement =
      "insert into tpch.part values(3, 'dark green antique puff wheat', 'Manufac#4', 'Brand#42', 'STANDARD "
      "POLISHED BRASS', 21, 'WRAP CASE', 903.00, 'unusual excuses ac');";
  insert(dmlStatement);

  dmlStatement =
      "insert into tpch.part values(4, 'chocolate metallic smoke ghost drab', 'Manufac#3', 'Brand#34', "
      "'SMALL PLATED BRASS', 14, 'MED DRUM', 904.00, 'ironi');";
  insert(dmlStatement);

  dmlStatement =
      "insert into tpch.part values(5, 'forest blush chiffon thistle chocolate', 'Manufac#3', 'Brand#32', "
      "'STANDARD POLISHED TIN', 15, 'SM PKG', 905.00, 'pending, spe');";
  insert(dmlStatement);

  cout << endl;
  cout << "Commiting inserting to tpch.part table ..." << endl;
  std::string command("COMMIT;");
  VendorDMLStatement dml_command(command, 1);
  CalpontDMLPackage* dmlCommandPkgPtr = CalpontDMLFactory::makeCalpontDMLPackage(dml_command);

  DMLPackageProcessor* pkgProcPtr =
      DMLPackageProcessorFactory::makePackageProcessor(DML_COMMAND, *dmlCommandPkgPtr);

  DMLPackageProcessor::DMLResult result = pkgProcPtr->processPackage(*dmlCommandPkgPtr);

  if (DMLPackageProcessor::NO_ERROR != result.result)
  {
    cout << "Command process failed!" << endl;
  }

  delete pkgProcPtr;
  delete dmlCommandPkgPtr;

  cout << endl;
  cout << "Finished Populating tpch.part table" << endl;
}

void TpchPopulate::populate_customer()
{
  cout << endl;
  cout << "Populating tpch.customer table" << endl;
  cout << "---------------------------------------" << endl;

  std::string dmlStatement =
      "insert into tpch.customer values(1,'Customer#000000001', 'IVhzIApeRb ot,c,E',15, "
      "'25-989-741-2988',711.56, 'BUILDING', 'regular, regular platelets are fluffily according to the even "
      "attainments. blithely iron');";

  insert(dmlStatement);

  cout << endl;
  cout << "Finished Populating tpch.customer table" << endl;
}

void TpchPopulate::populate_tpch()
{
  std::string tableName;
  std::string filePath;
  cout << endl;
  cout << "Populating region table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.region";
  filePath = "region.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating nation table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.nation";
  filePath = "nation.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating customer table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.customer";
  filePath = "customer.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating orders table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.orders";
  filePath = "orders.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating part table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "part.nation";
  filePath = "part.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating supplier table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.supplier";
  filePath = "supplier.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating partsupp table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.partsupp";
  filePath = "partsupp.tbl";
  populateFromFile(tableName, filePath);

  cout << "Populating lineitem table" << endl;
  cout << "---------------------------------------" << endl;
  tableName = "tpch.lineitem";
  filePath = "lineitem.tbl";
  populateFromFile(tableName, filePath);

  cout << endl;
  cout << "Finished Populating TPCH tables." << endl;
}
void TpchPopulate::insert(string insertStmt)
{
  cout << endl;
  cout << insertStmt << endl;
  cout << "---------------------------------------" << endl;

  boost::timer theTimer;
  VendorDMLStatement dmlStmt(insertStmt, 1);
  CalpontDMLPackage* dmlPkgPtr = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt);

  DMLPackageProcessor* pkgProcPtr = DMLPackageProcessorFactory::makePackageProcessor(DML_INSERT, *dmlPkgPtr);

  // pkgProcPtr->setDebugLevel(DMLPackageProcessor::VERBOSE);
  DMLPackageProcessor::DMLResult result = pkgProcPtr->processPackage(*dmlPkgPtr);

  if (DMLPackageProcessor::NO_ERROR != result.result)
  {
    cout << "Insert failed!" << endl;
  }
  else
  {
    cout << "Insert successful" << endl;
  }

  cout << "Insert took :" << theTimer.elapsed() << " seconds to complete." << endl;

  delete pkgProcPtr;
  delete dmlPkgPtr;
}
