/**
 *   Copyright 2011-2015 Quickstep Technologies LLC.
 *   Copyright 2015-2016 Pivotal Software, Inc.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 **/

#include "query_optimizer/QueryProcessor.hpp"

#include <cstdlib>
#include <fstream>
#include <memory>
#include <string>

#include "catalog/Catalog.hpp"
#include "catalog/Catalog.pb.h"
#include "catalog/CatalogDatabase.hpp"
#include "catalog/CatalogRelation.hpp"
#include "parser/ParseStatement.hpp"
#include "query_optimizer/Optimizer.hpp"
#include "query_optimizer/QueryHandle.hpp"
#include "storage/StorageManager.hpp"

using std::ifstream;
using std::ofstream;

namespace quickstep {

QueryHandle* QueryProcessor::generateQueryHandle(const ParseStatement &statement) {
  std::unique_ptr<QueryHandle> query_handle(new QueryHandle(query_id_));

  optimizer::Optimizer optimizer(query_id_, getDefaultDatabase(), storage_manager_.get());
  optimizer.generateQueryHandle(statement, query_handle.get());

  if (optimizer.isCatalogChanged() && !catalog_altered_) {
    catalog_altered_ = true;
  }

  ++query_id_;

  return query_handle.release();
}

void QueryProcessor::saveCatalog() {
  if (catalog_altered_) {
    ofstream catalog_file(catalog_filename_.c_str());

    if (!catalog_->getProto().SerializeToOstream(&catalog_file)) {
      throw UnableToWriteCatalog(catalog_filename_);
    }

    catalog_file.close();

    catalog_altered_ = false;
  }
}

void QueryProcessor::loadCatalog() {
  ifstream catalog_file(catalog_filename_.c_str());
  if (!catalog_file.good()) {
    throw UnableToReadCatalog(catalog_filename_);
  }

  serialization::Catalog catalog_proto;
  if (!catalog_proto.ParseFromIstream(&catalog_file)) {
    throw CatalogNotProto(catalog_filename_);
  }
  catalog_file.close();
  catalog_.reset(new Catalog(catalog_proto));

  catalog_altered_ = false;
}

}  // namespace quickstep
